Awalan terbagi

Nov 02 2020

Inspirasi

Diberikan bilangan bulat positif \$1 \le n \le 9\$, keluaran semua positif \$n\$-digit bilangan bulat \$i\$ yang mana hal berikut ini benar:

  • Setiap digit dari \$1\$ke \$n\$muncul tepat sekali dalam \$i\$. Oleh karena itu, \$i\$Angka adalah permutasi dari angka dari \$1\$ke \$n\$.
  • \$i\$dapat dibagi oleh \$n\$
  • Menghapus digit paling kanan dari \$i\$menghasilkan integer lain \$i_{\text{trunc}(1)}\$yang dapat dibagi oleh \$n-1\$
  • Menghapus digit paling kanan dari \$i_{\text{trunc}(1)}\$menghasilkan integer lain \$i_{\text{trunc}(2)}\$yang dapat dibagi oleh \$n-2\$
  • Dan seterusnya, sampai \$i_{\text{trunc}(n-1)}\$, yang habis dibagi 1.

Misalnya, untuk \$n = 3\$, salah satu bilangan bulat tersebut adalah \$321\$, sebagai \$321\$dapat dibagi oleh \$3\$, \$32\$oleh \$2\$dan \$3\$ dengan 1.

Untuk \$n = 4, 5, 7\$, tidak ada bilangan bulat seperti itu. Dalam hal ini, Anda mungkin keluaran sesuatu yang tidak dapat bingung dengan output mungkin (misalnya 0, [], tidak ada, dll). Untuk \$n = 3, 6\$, Anda dapat mengeluarkan dua angka dalam format apa pun yang memisahkan dua angka dengan jelas satu sama lain.

Ini adalah kode-golf jadi kode terpendek dalam byte menang.

Jika Anda menggunakan metode tabel pencarian, poin brownies \${}^\dagger\$ diberikan jika Anda juga menyertakan versi yang menghitung keluaran yang benar.

\${}^\dagger\$Poin brownies mungkin atau mungkin tidak dalam bentuk suara positif

Kasus uji

Kasus-kasus ini lengkap, jadi Anda tidak akan pernah menerima (atau harus menangani) masukan yang tidak disertakan di sini.

n -> i
1 -> [1]
2 -> [12]
3 -> [123, 321]
4 -> []
5 -> []
6 -> [123654, 321654]
7 -> []
8 -> [38165472]
9 -> [381654729]

Jawaban

5 ovs Nov 02 2020 at 19:28

05AB1E , 8 byte

LœJʒηāÖP

Cobalah secara online!

Berkomentar :

L         # push [1..n]
 œ        # push all permutations
  J       # join each permutation into a number
   ʒ      # filter those numbers on:
    η     #   each prefix ...
      Ö   #   ... is divisible ...
     ā    #   ... by its index
       P  #   take the product (all)
5 xnor Nov 02 2020 at 21:12

Python 2 , 68 byte

lambda n:[`s`[:n]for s in 321654,381654729,123654][380712>>n*2&3::2]

Cobalah secara online!

Menghasilkan daftar string.


71 byte

lambda n:[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729][n]

Cobalah secara online!

Hanya hardcode lurus yang membosankan. Menghasilkan satu angka, atau daftar dua angka, atau 0 tanpa output.

Tak satu pun dari metode lain yang saya coba tampaknya lebih pendek dari ini. Misalnya, salah satu idenya adalah menghasilkan angka sebagai awalan dari satu angka, menghasilkan suka 123654/10**(6-i).

Metode objek memberikan panjang yang sama. Sayangnya kami tidak dapat menggunakan lebih pendek .popkarena membuat fungsi tidak dapat digunakan kembali karena mengubah daftar dengan setiap panggilan.

[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729].__getitem__

Cobalah secara online!

Aliasing konstanta terpanjang juga memberikan panjang yang sama:

lambda n,c=381654729:[0,1,12,[123,321],0,0,[123654,321654],0,c/10,c][n]

Cobalah secara online!

4 xash Nov 02 2020 at 18:43

J , 42 37 byte

Menghitung angka.

0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.

Cobalah secara online!

  • 1+i. 1… n
  • i.@!…@A. semua permutasi yang mungkin dari 1… n
  • 10&#.\ mengubah setiap awalan permutasi menjadi angka
  • 0(…)@|: mengubah urutan matriks dan…
  • #\|] 1… n mod prefiks, misalnya 1 2 3 | 1 12 123
  • 0=[:+/jumlahkan hasilnya; apakah itu 0?
  • {:#~ kemudian ambil awalan terakhir dari permutasi (permutasi itu sendiri)
3 user Nov 02 2020 at 22:36

Scala, 81 80 byte

| =>1.to(|).mkString.permutations.filter{i=>1 to|forall(r=>i.take(r).toInt%r<1)}

Cobalah di Scastie

Penjelasan:

| =>                          //n, the input
  1.to(|)                     //Range to n
    .mkString                 //Turn it into a string
    .permutations             //Get all permutations
    .filter{ i =>             //Filter them
      1 to | forall(r =>      //For every r from 1 to n
        i.take(r).toInt       //The number made from i's first r digits
          % r < 1             //Should be divisible by r
      )
    }
2 Neil Nov 02 2020 at 19:50

Arang , 25 byte

NθΦEXχθIι⬤…·¹θ›№ιIλ﹪I…ιλλ

Cobalah secara online! Tautan adalah untuk verbose versi kode. Terlalu lambat untuk n>5di TIO. Penjelasan:

Nθ

Masukan n.

ΦEXχθIι

Cantumkan semua bilangan bulat ihingga 10ⁿ, sehingga ...

⬤…·¹θ

... untuk setiap bilangan bulat ldari 1hingga n...

›№ιIλ﹪I…ιλλ

ladalah digit dari idan lawalan -karakter dari ihabis dibagi l.

Versi 28-byte yang sedikit lebih cepat:

NθΦEX⊕θθ⍘ι⊕θ⬤…·¹θ›№ιIλ﹪I…ιλλ

Cobalah secara online! Tautan adalah untuk verbose versi kode. Penjelasan: Menghasilkan digit dalam basis, n+1bukan basis 10, sehingga memungkinkan untuk diselesaikan n=6di TIO.

Versi 29-byte tercepat menggunakan tabel pencarian terkompresi:

§⪪”)‴a3HSGS⸿Dπ¬Z⦄O<ε≔<πUθ8”0N

Cobalah secara online! Tautan adalah untuk verbose versi kode.

2 J42161217 Nov 02 2020 at 18:38

Bahasa Wolfram (Mathematica) , 78 byte

(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&

Cobalah secara online!

-8 byte dari @att

2 Razetime Nov 03 2020 at 03:47

Husk , 15 byte

mdföΛIṠz¦ŀmdḣPḣ

Cobalah secara online!

Jawabannya sama dengan pertanyaan lainnya, kecuali dengan parameter.

2 Noodle9 Nov 02 2020 at 18:44

C (gcc) lm, 67 101 96 bytes

Menambahkan 34 byte untuk memperbaiki bug yang ditunjukkan oleh xnor .
Disimpan 5 byte berkat ceilingcat !!!

f(n){write(1,"321654",n-3&&n-6?0:n);n=n<4?123/exp10(3-n):n>7?381654729/exp10(9-n):n-6?0:123654;}

Cobalah secara online!

Solusi berbasis pencarian total. Jika ada dua solusi: mengeluarkan satu ke stdout, dan mengembalikan yang lain. Jika hanya ada satu jawaban, itu akan dikembalikan. Kembali \$0\$ jika tidak ada jawaban.

Putaran bonus untuk poin brownies

C (gcc) , 232.212 byte

Menyimpan 20 byte kekalahan berkat ceilingcat !!!

p;m;j;char b[9],c[9];d;i;f(n){for(d=0,i=n;i;)d+=9*d+i--;for(sprintf(c,"%d",d);d/++i;)if(sprintf(b,"%d",i),qsort(b,n,1,L"\xf06be0f\xd02917beǃ"),!strcmp(b,c)){for(p=0,m=n,j=i;j;j/=10)p|=j%m--;p||printf("%d ",i);}}

Cobalah secara online!

Menghitung angka yang benar melalui kalkulasi dan mengeluarkannya ke stdout. Tidak menghasilkan apa-apa jika tidak ada jawaban. Waktu habis di TIO untuk \$n=9\$tetapi semuanya ada di 3m36.499slaptop saya.

2 JonathanAllan Nov 02 2020 at 18:44

Jelly ,  11  10 byte

-1 berkat koinheringaahing caird !

Ini adalah metode yang naif, mungkin ada metode yang lebih singkat.

Œ!JḍḌƤẠƲƇḌ

Tautan monadik menerima \$n\$yang menghasilkan 0jika tidak ada yang ditemukan atau daftar nomor yang valid.

Cobalah secara online! Atau lihat rangkaian pengujian .

Bagaimana?

Œ!JḍḌƤẠƲƇḌ - Link: n
Œ!         - all permutations of [1..n]
        Ƈ  - filter keep those (p for p in Œ!) for which:
       Ʋ   -   last four links as a monad f(p):
  J        -     range of length = [1..n]
     Ƥ     -     apply to prefixes (of p):
    Ḍ      -       un-decimal
   ḍ       -     divides? (vectorises)
      Ạ    -     all truthy?
         Ḍ - un-decimal
1 KjetilS. Nov 02 2020 at 20:41

Perl 5 , 64 byte

sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}

Cobalah secara online!

1 Arnauld Nov 02 2020 at 22:55

JavaScript (V8) , 97 byte

Fungsi rekursif yang menghitung dan mencetak bilangan bulat yang cocok.

f=(n,s='987654321'.slice(-n),d,p)=>p%d?0:s?[...s].map(v=>f(n,s.replace(v,''),-~d,[p]+v)):print(p)

Cobalah secara online!


JavaScript (ES6), 59 byte

Pengodean keras jelas lebih pendek.

n=>[,1,12,[321,123],,,[321654,123654],,q=38165472,q+[9]][n]

Cobalah secara online!

att Nov 03 2020 at 02:48

Bahasa Wolfram (Mathematica) , 71 byte

f[s_:0,l_:0]=0!=##2&&l∣s&&If[l<#,##~f[10s+i,l+1]~i~Do~{i,#},Print@s]&

Cobalah secara online!

Panggil sebagai f[][n]. Mencetak hasilnya.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 byte

=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)

Masukan masuk A1. Jawaban hardcode lebih pendek dari perhitungan.