Önek bölünebilirliği

Nov 02 2020

İlham

Pozitif bir tam sayı verildiğinde \$1 \le n \le 9\$, tümü pozitif çıktı \$n\$-digit tamsayılar \$i\$ bunun için aşağıdakiler doğrudur:

  • Her rakam \$1\$için \$n\$tam olarak bir kez \$i\$. Bu nedenle, \$i\$'nin rakamları, \ ' deki rakamların permütasyonudur.$1\$için \$n\$.
  • \$i\$\ ile bölünebilir$n\$
  • En sağdaki rakam \ ' den kaldırılıyor$i\$başka bir tamsayı verir \$i_{\text{trunc}(1)}\$\ ile bölünebilen$n-1\$
  • En sağdaki rakam \ ' den kaldırılıyor$i_{\text{trunc}(1)}\$başka bir tamsayı verir \$i_{\text{trunc}(2)}\$\ ile bölünebilen$n-2\$
  • Ve böylece, \$i_{\text{trunc}(n-1)}\$, 1'e bölünebilir.

Örneğin, \ için$n = 3\$böyle bir tam sayı \$321\$, olarak \$321\$\ ile bölünebilir$3\$, \$32\$tarafından \$2\$ve \$3\$ 1 ile.

için \$n = 4, 5, 7\$böyle bir tamsayı yok. Bu durumda, olası bir çıkış (örneğin ile çıkış şey karıştırılmamalıdır olamaz ki 0, []hiçbir şey, vs.). için \$n = 3, 6\$, iki sayıyı, iki sayının birbirinden açıkça ayrıldığı herhangi bir biçimde yazdırabilirsiniz.

Bu kod golfü olduğundan bayt cinsinden en kısa kod kazanır.

Bir arama tablosu yöntemi kullanıyorsanız, kek noktaları \${}^\dagger\$ Doğru çıktıyı hesaplayan bir sürümü de eklerseniz verilir.

\${}^\dagger\$Brownie puanları olumlu oy şeklinde olabilir veya olmayabilir

Test durumları

Bu durumlar ayrıntılıdır, bu nedenle burada yer almayan bir girdiyi asla almayacaksınız (veya ele almanız gerekmeyecek).

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

Yanıtlar

5 ovs Nov 02 2020 at 19:28

05AB1E , 8 bayt

LœJʒηāÖP

Çevrimiçi deneyin!

Yorum yaptı :

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 bayt

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

Çevrimiçi deneyin!

Bir dizge listesi çıkarır.


71 bayt

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

Çevrimiçi deneyin!

Sadece sıkıcı, düz bir kod. Tek bir sayıyı veya iki sayıdan oluşan bir listeyi veya çıkış yoksa 0 verir.

Denediğim diğer yöntemlerin hiçbiri bundan daha kısa görünmüyordu. Örneğin, bir fikir, tek bir sayının önekleri olarak sayılar üretmek ve benzerlerini oluşturmaktır 123654/10**(6-i).

Bir nesne yöntemi aynı uzunluğu verir. Maalesef çok daha kısa .popolanı kullanamıyoruz çünkü her aramada listeyi değiştirdiği için işlevi tekrar kullanılamaz hale getiriyor.

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

Çevrimiçi deneyin!

En uzun sabiti takma ad aynı uzunluğu da verir:

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

Çevrimiçi deneyin!

4 xash Nov 02 2020 at 18:43

J , 42 37 bayt

Sayıları hesaplar.

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

Çevrimiçi deneyin!

  • 1+i. 1… n
  • i.@!…@A. 1… n'nin tüm olası permütasyonları
  • 10&#.\ bir permütasyonun her önekini bir sayıya dönüştür
  • 0(…)@|: matrisi aktarın ve…
  • #\|] 1… n mod ön ekleri, ör. 1 2 3 | 1 12 123
  • 0=[:+/sonucu toplamak; 0 mı
  • {:#~ sonra permütasyonun son önekini alın (permütasyonun kendisi)
3 user Nov 02 2020 at 22:36

Scala, 81 80 bayt

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

Scastie'de deneyin

Açıklama:

| =>                          //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

Kömür , 25 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. n>5TIO için çok yavaş . Açıklama:

Nθ

Giriş n.

ΦEXχθIι

Bütün tamsayılar Liste ikadar 10ⁿ, öyle ki ...

⬤…·¹θ

... Her tamsayı için lgelen 1için n...

›№ιIλ﹪I…ιλλ

lbir rakamdır ive lkarakter öneki iile bölünebilir l.

Biraz daha hızlı 28 baytlık sürüm:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Açıklama: Basamak n+1yerine temelde rakamlar üretir 10, böylece n=6TIO'da tamamlamayı mümkün kılar .

Sıkıştırılmış bir arama tablosu kullanan en hızlı 29 baytlık sürüm:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir.

2 J42161217 Nov 02 2020 at 18:38

Wolfram Dili (Mathematica) , 78 bayt

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

Çevrimiçi deneyin!

@Att'tan -8 bayt

2 Razetime Nov 03 2020 at 03:47

Kabuk , 15 bayt

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

Çevrimiçi deneyin!

Parametreler dışında diğer soru ile aynıdır.

2 Noodle9 Nov 02 2020 at 18:44

C (GCC) -lm, 67 101 96 bayt

Xnor tarafından nazikçe belirtilen bir hatayı düzeltmek için 34 bayt eklendi . Ceilingcat
sayesinde 5 bayt tasarruf edin !!!

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

Çevrimiçi deneyin!

Toplam arama tabanlı çözüm. İki çözüm varsa: birini verir stdoutve diğerini döndürür. Tek bir cevap varsa, o basitçe iade edilir. İade \$0\$ cevap yoksa.

Brownie puanları için bonus turu

C (gcc) , 232 212 bayt

Tavan kedisi sayesinde 20 baytlık bir tasarruf !!!

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

Çevrimiçi deneyin!

Doğru sayıları hesaplama yoluyla hesaplar ve çıktılar stdout. Cevap yoksa hiçbir çıktı vermez. TIO'da \ için zaman aşımına uğradı$n=9\$ama hepsini 3m36.499sdizüstü bilgisayarımda yapıyor.

2 JonathanAllan Nov 02 2020 at 18:44

Jöle ,  11  10 bayt

Caird coinheringaahing'e -1 teşekkürler !

Bu saf bir yöntem, daha kısa bir yöntem olabilir.

Œ!JḍḌƤẠƲƇḌ

Monadik bir Bağlantı kabul ediyor \$n\$0hiçbiri bulunamazsa veya geçerli sayıların bir listesi varsa verir .

Çevrimiçi deneyin! Veya test süitine bakın .

Nasıl?

Œ!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 bayt

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

Çevrimiçi deneyin!

1 Arnauld Nov 02 2020 at 22:55

JavaScript (V8) , 97 bayt

Eşleşen tam sayıları hesaplayan ve yazdıran özyinelemeli bir işlev.

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)

Çevrimiçi deneyin!


JavaScript (ES6), 59 bayt

Sabit kodlama açıkça daha kısadır.

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

Çevrimiçi deneyin!

att Nov 03 2020 at 02:48

Wolfram Dili (Mathematica) , 71 bayt

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

Çevrimiçi deneyin!

Olarak ara f[][n]. Sonuçları yazdırır.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 bayt

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

Giriş girildi A1. Sabit kodlu yanıt, hesaplamanın olacağından daha kısadır.