Önek bölünebilirliği
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
05AB1E , 8 bayt
LœJʒηāÖP
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)
Python 2 , 68 bayt
lambda n:[`s`[:n]for s in 321654,381654729,123654][380712>>n*2&3::2]
Bir dizge listesi çıkarır.
71 bayt
lambda n:[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729][n]
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__
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]
J , 42 37 bayt
Sayıları hesaplar.
0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.
1+i.1… ni.@!…@A.1… n'nin tüm olası permütasyonları10&#.\bir permütasyonun her önekini bir sayıya dönüştür0(…)@|:matrisi aktarın ve…#\|]1… n mod ön ekleri, ör.1 2 3 | 1 12 1230=[:+/sonucu toplamak; 0 mı{:#~sonra permütasyonun son önekini alın (permütasyonun kendisi)
Scala, 81 80 bayt
| =>1.to(|).mkString.permutations.filter{i=>1 to|forall(r=>i.take(r).toInt%r<1)}
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
)
}
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.
Wolfram Dili (Mathematica) , 78 bayt
(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&
@Att'tan -8 bayt
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;}
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);}}
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.
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
Perl 5 , 64 bayt
sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}
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)
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]
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]&
Olarak ara f[][n]. Sonuçları yazdırır.
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.