Angka ajaib dengan panjang tertentu

13

Program Anda harus mengambil input ( nuntuk tujuan deskripsi) dan mengeluarkan semua permutasi dari angka yang npanjang digit tanpa digit berulang, di mana masing-masing digit sebelum dan termasuk indeksnya dapat dibagi dengan tempat di nomor yang jatuh. .

Anda dapat membaca tentang angka ajaib di sini .

Aturan:

  • 1 <= n <= 10
  • Tidak ada digit yang dapat diulang
  • 0 di depan harus ada (jika ada)
  • xDigit ke -1 dari angka (dimulai dengan karakter pertama sebagai 1) harus dapat dibagi dengan x, yaitu dalam 30685, 3dapat dibagi dengan 1, 30dapat dibagi dengan 2, 306dapat dibagi dengan 3, 3068dapat dibagi dengan 4, dan dapat dibagi dengan 4, dan30685 dapat dibagi dengan 5 .
  • Program harus mengambil integer sebagai input (melalui baris perintah, sebagai argumen fungsi, dll.) Dan mencetak semua permutasi yang memenuhi aturan.
  • Output harus dipisahkan oleh 1 atau lebih karakter spasi
  • Permutasi dapat dimulai dan dengan nol (jadi itu bukan angka ajaib secara teknis ).
  • Urutan output tidak masalah
  • Anda tidak perlu menangani input yang tidak terduga
  • Karakter paling tidak dalam bytes menang

Contohnya

Diberikan 1:

0
1
2
3
4
5
6
7
8
9

Diberikan 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

Diberikan 10:

3816547290

Kredit ke Pizza Hut & John H. Conway untuk teka-teki asli (Opsi A). Terima kasih kepada @Mego dan @ sp3000 untuk tautan mereka .

Davis Bung
sumber
6
@DavisDude "Terkait" tidak berarti "duplikat". Tujuan memposting tautan terkait adalah agar tantangan tersebut muncul sebagai "Tertaut" di bilah samping.
Martin Ender
1
Bacaan terkait: angka
polydivisible
3
Apakah awalan 0 perlu menyertakan angka output yang memilikinya?
xnor
4
Anda menyebutkan pencetakan dan spasi putih ketika datang ke output, tetapi untuk suatu fungsi, bentuk output paling alami mungkin akan mengembalikan daftar. Apakah itu diizinkan?
Dennis

Jawaban:

4

Jelly , 20 17 16 byte

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

Ini sangat lambat dan memori intensif ... Coba online!

Bagaimana itu bekerja

Ø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.
Dennis
sumber
3
Jika ini lambat ... jawabanku siput mengantuk
Luis Mendo
6

JavaScript (Firefox 30-57), 77 byte

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

Sunting: Disimpan 1 byte berkat @ edc65.

Neil
sumber
Sebuah permata! cukup simpan 1 byte dengan...of"012...
edc65
@ edc65 Ugh, saya tidak percaya saya mengabaikannya.
Neil
3

Pyth, 19 byte

jf!s%VsM._TS;.PjkUT

Demonstrasi

Solusi brute force. Penjelasan untuk diikuti. Inspirasi terima kasih kepada FryAmTheEggman


22 byte

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

Demonstrasi

Angka dibangun dan disimpan sebagai string, dan hanya dikonversi ke int untuk memeriksa pembagian.

Penjelasan:

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.
isaacg
sumber
Saya ingin tahu: seberapa masokistik Anda harus belajar Pyth? / s
DavisDude
2
@ Davidvis saya pikir itu lebih mudah daripada apa yang orang pikirkan ketika mereka melihatnya. Bagian paling menakutkan dimulai. Begitu Anda masuk, Anda masuk.
FliiFe
1
Ini cukup mudah, imho, karena seberapa banyak mode debug membantu Anda. Dokumen juga cukup bagus, dan jelaskan apa yang perlu Anda ketahui.
Ven
Hanya untuk referensi, saya berakhir dengan satu lagi menggunakan ._dan beberapa hal lain, tapi itu lebih lambat untuk input besar:jjLkf!s.e%ib10hk._T.PUT
FryAmTheEggman
3

MATL , 30 byte

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

Cobalah online!

Sangat lambat. Untuk input 3itu dibutuhkan beberapa detik dalam kompiler online. Untuk melihat angka yang muncul satu per satu, masukkan a Ddi akhir kode .

Penjelasan

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
Luis Mendo
sumber
Ada yang salah dengan kode Anda; Ini berhenti menghasilkan output untuk saya setelah 5, dan dengan 5 angka terakhir (satu-satunya yang saya susah untuk memeriksa) salah. 986 tidak dapat dibagi oleh 3
DavisDude
Pembaruan: untuk 2 ini melompati 10, 12, 32, 34, 54, 56, 76, 78
DavisDude
Saya pikir Anda salah memahami prompt. Melihat 3saya dapat melihat Anda memiliki indikasi pasangan (misalnya 026). Juga penjelasan akan dihargai
DavisDude
Ini masih tidak berfungsi- 3
lompati
@ Davidvis Diedit, sekarang saya membaca tantangan dengan lebih hati
Luis Mendo
1

Ruby, 87 byte

Solusi rekursif dasar.

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}}

Jika Anda diizinkan untuk mengembalikan daftar permutasi alih-alih mencetak, 85 byte:

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]}
Nilai Tinta
sumber
1

Python, 132 byte

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))]

Menjatuhkan 26 byte dengan menghilangkan itertools, terima kasih kepada Sp3000 untuk membuat saya sadar bahwa saya seharusnya tidak menggunakannya.

Turun 2 byte dengan menggunakan pemahaman daftar daripada filter, terima kasih lagi untuk Sp3000 untuk tipnya.

Cobalah online: Python 2 , Python 3

Mego
sumber