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.