Belirli bir uzunluğun sihirli sayısı


13

Programınız bir girdi almalı ( naçıklama amacıyla) ve ntekrarlayan basamaklar içermeyen basamak uzunluğundaki bir sayının tüm permütasyonlarını çıkarmalıdır; burada, önceki ve dizinini içeren basamakların her biri, düştüğü sayıdaki yere bölünebilir .

Sihirli sayıları burada okuyabilirsiniz .

Kurallar:

  • 1 <= n <= 10
  • Tekrarlanan rakamlar olamaz
  • Baştaki 0 ​​bulunmalıdır (varsa)
  • İle 1 x(1 birinci karakterle başlayan) sayısının inci rakam ile bölünebilir olmalıdır x, yani 30685, 31, bölünemeyen 302 ile bölünebilen, 3063 ile bölünebilen, 30684 ile bölünebilir ve 306855 ile divislbe olan .
  • Program girdi olarak bir tamsayı almalı (komut satırı üzerinden, bir işlev argümanı olarak, vb.) Ve kuralları sağlayan tüm permütasyonları yazdırmalıdır.
  • Çıktı 1 veya daha fazla boşluk karakteriyle ayrılmalıdır
  • Permutasyonlar olabilir başlatmak ve sıfır ile (böylece onlar değil teknik olarak sihirli sayılar).
  • Çıktı sırası önemli değil
  • Sen do not beklenmedik girişi işlemek gerekir
  • Bayt cinsinden en az karakter kazanır

Örnekler

Verilen 1:

0
1
2
3
4
5
6
7
8
9

Verilen 2:

02
04
06
08
10
12
14
16
18
20
24
26
28
30
32
34
36
38
40
42
46
48
50
52
54
56
58
60
62
64
68
70
72
74
76
78
80
82
84
86
90
92
94
96
98

Verilen 10:

3816547290

Pizza Hut & Kredi John H. Conway için orijinal bulmaca (A Seçeneği). @Mego ve onların için SP3000 @ teşekkürler linkleri .



6
@DavisDude "Related", "yinelenen" anlamına gelmez. İlgili bir bağlantı yayınlamanın amacı, bu zorluğun kenar çubuğunda "Bağlantılı" olarak gösterilmesidir.
— Martin Ender

1
İlgili okumalar: polikodik olmayan sayılar
— Sp3000

3
Baştaki 0'ların bunlara sahip çıkış sayılarını içermesi gerekir mi?
— xnor

4
Çıktı söz konusu olduğunda baskı ve boşluktan bahsediyorsunuz , ancak bir işlev için, en doğal çıktı biçimi muhtemelen bir liste döndürüyor olacaktır. Buna izin veriliyor mu?
— Dennis

Yanıtlar:


4

Jöle , 20 17 16 bayt

QḣQV%S
ØDṗçÐḟRj⁷

Bu çok yavaş ve bellek yoğun ... Çevrimiçi deneyin!

Nasıl çalışır

ØDṗçÐḟRj⁷  Main link. Input: n (integer)

ØD         Yield d := '0123456789'.
  ṗ        Compute the nth Cartesian power of d.
      R    Range; yield [1, ..., n].
    Ðḟ     Filter false; keep strings of digits for which the following yields 0.
   ç         Apply the helper link to each digit string and the range to the right.
       j⁷  Join the kept strings, separating by linefeeds.


QḣQḌ%S     Helper link. Arguments: s (digit string), r (range from 1 to n)

Q          Unique; deduplicate s.
 ḣ         Head; get the prefixes of length 1, ..., n or less.
           If s had duplicates, the final prefixes fill be equal to each other.
  Q        Unique; deduplicate the array of prefixes.
   V       Eval all prefixes.
    %      Compute the residues of the kth prefixes modulo k.
           If s and the array of prefixes have different lengths (i.e., if the
           digits are not unique), some right arguments of % won't have corr. left
           arguments. In this case, % is not applied, and the unaltered right
           argument is the (positive) result.
     S     Add all residues/indices. This sum is zero iff all digits are unique
           and the kth prefixes are divisible by k.

3
Bu yavaşsa ... cevabım uykulu bir sümüklü böcek
— Luis Mendo

6

JavaScript (Firefox 30-57), 77 bayt

f=n=>n?[for(s of f(n-1))for(c of"0123456789")if(s.search(c)+(s+c)%n<0)s+c]:[""]

Düzenleme: @ edc65 sayesinde 1 bayt kaydedildi.


Bir mücevher! sadece 1 bayt ile tasarruf edin...of"012...
— edc65

@ edc65 Ugh, bunu göz ardı ettiğime inanamıyorum.
— Neil

3

Pyth, 19 bayt

jf!s%VsM._TS;.PjkUT

gösteri

Kaba kuvvet çözümü. İzlenecek açıklama. FryAmTheEggman sayesinde ilham


22 bayt

juf!%sThH{I#sm+LdTGQ]k

gösteri

Sayılar oluşturulur ve dize olarak saklanır ve yalnızca bölünebilirliği kontrol etmek için ints'a dönüştürülür.

Açıklama:

juf!%sThH{I#sm+LdTGQ]k
 u                 Q]k    Apply the following input many times, starting with ['']
             m    G       For each string at the previous step,
              +LdT        Append each digit to it
            s             Concatenate
         {I#              Filter out strings with repeats
  f                       Filter on
     sT                   The integer
    %  hH                 Mod the 1 indexed iteration number
   !                      Is zero.
j                         Join on newlines.

Merak ediyorum: Pyth'i öğrenmek için ne kadar mazoşist olmalısın? / s
— DavisDude

2
@DavisDude İnsanların gördüklerinde düşündüklerinden daha kolay olduğunu düşünüyorum. En korkunç kısım başlıyor. İçeri girdikten sonra,
— içeri gir

1
Hata ayıklama modunun size ne kadar yardımcı olduğu için oldukça kolaydır, imho. Dokümanlar da oldukça iyi ve bilmeniz gerekenler açıklanıyor.
— Ven

Sadece referans olarak, bir daha kullanarak ._ve diğer bazı şeyler ile yara , ama büyük girişler için waaay yavaş:jjLkf!s.e%ib10hk._T.PUT
— FryAmTheEggman 5:16

3

MATL , 30 bayt

4Y2Z^!"@Sd@!U10G:q^/kPG:\~h?@!

Çevrimiçi deneyin!

Çok yavaş. İçin input 3kendisine çevrimiçi derleyici birkaç saniye sürer. Sayıları birer birer görmek için kodun sonuna a ekleyinD .

açıklama

4Y2       % predefined literal: string '0123456789'
Z^        % implicit input. Cartesian power: 2D char array. Each number is a row
!         % transpose
"         % for each column
  @       %   push current column
  Sd      %   sort and compute consecutive differences (*)
  @!U     %   push current column. Convert to number
  10G:q^  %   array [1 10 100 ... 10^(n-1)], where n is the input
  /k      %   divide element-wise. Round down
  P       %   reverse array
  G:      %   array [1 2 ... n]
  \~      %   modulo operation, element-wise. Negate: gives 1 if divisible (**)
  h       %   concatenate (*) and (**). Truthy if all elements are nonzero
  ?       %   if so
    @!    %     current number as a row array of char (string)
          %   implicitly end if
          % implicitly end if
          % implicitly display stack contents

Kodunuzla ilgili bir sorun var; 5'ten sonra benim için çıktı üretmeyi durduruyor ve 5 ile son sayı (kontrol etmek için uğraştığım tek kişi) yanlış. 986 3 ile bölünemez
— DavisDude

Güncelleme: 2 için 10, 12, 32, 34, 54, 56, 76, 78
— atlar DavisDude

Sanırım istemi yanlış anladın. Baktığımda 3birkaç endikasyonunuz olduğunu görebiliyorum (örn. 026). Ayrıca bir açıklama mutluluk
— duyacağız

Bu hala değil iş- 3 atlama 021, 024, vb ilk doğru numarayı 063. olduğunu yapar
— DavisDude

@DavisDude Düzenledi, şimdi meydan okumayı daha dikkatli okudum
— Luis Mendo

1

Ruby, 87 bayt

Temel özyinelemeli çözüm.

f=->n,x="",j=1{j>n ?puts(x):([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}}

Yazdırmak yerine permütasyonların bir listesini döndürmenize izin verilirse, 85 bayt:

f=->n,x="",j=1{j>n ?x:([*?0..?9]-x.chars).map{|i|f[n,x+i,j+1]if((x+i).to_i)%j<1}-[p]}

1

Python, 132 bayt

lambda n:[x for x in map(("{:0%s}"%n).format,(range(10**n)))if all(int(x[:i])%i<1and len(set(x))==len(x)for i in range(1,len(x)+1))]

26 bayt düştü itertools, Sp3000 sayesinde kullanmamam gerektiğini fark ettim.

filterSp3000'e bahşiş için tekrar teşekkürler, bir liste kavrayışı kullanarak 2 bayt düştü .

Çevrimiçi deneyin: Python 2 , Python 3

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.