Präfixteilbarkeit

Nov 02 2020

Inspiration

Bei einer positiven ganzen Zahl \$1 \le n \le 9\$, alle positiv ausgeben \$n\$-digit integers \$i\$ für die Folgendes gilt:

  • Jede Ziffer von \$1\$zu \$n\$erscheint genau einmal in \$i\$. Daher \$i\$Die Ziffern sind eine Permutation der Ziffern von \$1\$zu \$n\$.
  • \.$i\$ist teilbar durch \$n\$
  • Entfernen der am weitesten rechts stehenden Ziffer aus \$i\$ergibt eine andere ganze Zahl \$i_{\text{trunc}(1)}\$das ist teilbar durch \$n-1\$
  • Entfernen der am weitesten rechts stehenden Ziffer aus \$i_{\text{trunc}(1)}\$ergibt eine andere ganze Zahl \$i_{\text{trunc}(2)}\$das ist teilbar durch \$n-2\$
  • Und so weiter, bis \$i_{\text{trunc}(n-1)}\$, die durch 1 teilbar ist.

Zum Beispiel für \$n = 3\$ist eine solche ganze Zahl \$321\$, als \$321\$ist teilbar durch \$3\$, \$32\$von \$2\$und \$3\$ um 1.

Für \$n = 4, 5, 7\$gibt es keine solchen ganzen Zahlen. In diesem Fall können Sie die Ausgabe alles , was mit einem möglichen Ausgang (zB damit verwechselt werden können 0, []nichts, etc.). Für \$n = 3, 6\$können Sie die beiden Zahlen in einem beliebigen Format ausgeben, in dem die beiden Zahlen klar voneinander getrennt sind.

Dies ist Code-Golf, also gewinnt der kürzeste Code in Bytes.

Wenn Sie eine Nachschlagetabellenmethode verwenden, zeigt Brownie Points \${}^\dagger\$ werden vergeben, wenn Sie auch eine Version hinzufügen, die die korrekte Ausgabe berechnet.

\.${}^\dagger\$Brownie-Punkte können in Form einer Gegenstimme vorliegen oder nicht

Testfälle

Diese Fälle sind erschöpfend, sodass Sie niemals eine Eingabe erhalten (oder bearbeiten müssen), die hier nicht enthalten ist.

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

Antworten

5 ovs Nov 02 2020 at 19:28

05AB1E , 8 Bytes

LœJʒηāÖP

Probieren Sie es online aus!

Kommentiert :

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 Bytes

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

Probieren Sie es online aus!

Gibt eine Liste und Zeichenfolgen aus.


71 Bytes

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

Probieren Sie es online aus!

Nur ein langweiliger gerader Hardcode. Gibt eine einzelne Zahl oder eine Liste mit zwei Zahlen oder 0 für keine Ausgabe aus.

Keine der anderen Methoden, die ich ausprobierte, schien kürzer zu sein. Eine Idee ist zum Beispiel, Zahlen als Präfixe einer einzelnen Zahl zu generieren und wie zu generieren 123654/10**(6-i).

Eine Objektmethode gibt die gleiche Länge an. Leider können wir das nicht viel kürzer verwenden, .popda es die Funktion nicht wiederverwendbar macht, da es die Liste bei jedem Aufruf ändert.

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

Probieren Sie es online aus!

Das Aliasing der längsten Konstante ergibt ebenfalls die gleiche Länge:

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

Probieren Sie es online aus!

4 xash Nov 02 2020 at 18:43

J , 42 37 Bytes

Berechnet die Zahlen.

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

Probieren Sie es online aus!

  • 1+i. 1… n
  • i.@!…@A. alle möglichen Permutationen von 1… n
  • 10&#.\ Konvertieren Sie jedes Präfix einer Permutation in eine Zahl
  • 0(…)@|: transponiere die Matrix und…
  • #\|] 1… n mod die Präfixe, z 1 2 3 | 1 12 123
  • 0=[:+/summiere das Ergebnis; ist es 0?
  • {:#~ Nehmen Sie dann das letzte Präfix der Permutation (die Permutation selbst).
3 user Nov 02 2020 at 22:36

Scala, 81 80 Bytes

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

Probieren Sie es in Scastie

Erläuterung:

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

Holzkohle , 25 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Zu langsam für n>5TIO. Erläuterung:

Nθ

Eingabe n.

ΦEXχθIι

Listen Sie alle Ganzzahlen ibis auf 10ⁿ, so dass ...

⬤…·¹θ

... für jede ganze Zahl lvon 1bis n...

›№ιIλ﹪I…ιλλ

list eine Ziffer von iund das l-Zeichenpräfix von iist teilbar durch l.

Etwas schnellere 28-Byte-Version:

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung: Erzeugt die Ziffern in der Basis n+1anstelle der Basis 10und ermöglicht so die Vervollständigung n=6auf TIO.

Schnellste 29-Byte-Version mit einer komprimierten Nachschlagetabelle:

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes.

2 J42161217 Nov 02 2020 at 18:38

Wolfram Language (Mathematica) , 78 Bytes

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

Probieren Sie es online aus!

-8 Bytes von @att

2 Razetime Nov 03 2020 at 03:47

Schale , 15 Bytes

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

Probieren Sie es online aus!

Almos das gleiche wie die andere Frage, außer mit Parametern.

2 Noodle9 Nov 02 2020 at 18:44

C (gcc) -lm, 67 101 96 Bytes

34 Bytes hinzugefügt, um einen Fehler zu beheben, auf den xnor freundlicherweise hingewiesen hat .
5 Bytes dank Ceilingcat gespart !!!

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

Probieren Sie es online aus!

Total Lookup-basierte Lösung. Wenn es zwei Lösungen gibt: Gibt eine an aus stdoutund gibt die andere zurück. Wenn es nur eine Antwort gibt, wird sie einfach zurückgegeben. Gibt \ zurück$0\$ wenn es keine Antwort gibt.

Bonusrunde für Brownie-Punkte

C (gcc) , 232 212 Bytes

Dank Ceilingcat satte 20 Bytes gespart !!!

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

Probieren Sie es online aus!

Berechnet die korrekten Zahlen durch Berechnung und gibt sie an aus stdout. Gibt nichts aus, wenn keine Antwort vorliegt. Zeitüberschreitung bei TIO für \$n=9\$aber macht sie alle 3m36.499sauf meinem Laptop.

2 JonathanAllan Nov 02 2020 at 18:44

Gelee ,  11  10 Bytes

-1 dank caird coinheringaahing !

Dies ist eine naive Methode, es könnte eine knappere geben.

Œ!JḍḌƤẠƲƇḌ

Ein monadischer Link, der \ akzeptiert$n\$was ergibt, 0wenn keine gefunden werden oder eine Liste gültiger Zahlen.

Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an .

Wie?

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

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

Probieren Sie es online aus!

1 Arnauld Nov 02 2020 at 22:55

JavaScript (V8) , 97 Byte

Eine rekursive Funktion, die die übereinstimmenden Ganzzahlen berechnet und druckt.

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)

Probieren Sie es online aus!


JavaScript (ES6), 59 Byte

Die Hardcodierung ist offensichtlich kürzer.

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

Probieren Sie es online aus!

att Nov 03 2020 at 02:48

Wolfram Language (Mathematica) , 71 Bytes

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

Probieren Sie es online aus!

Rufen Sie an als f[][n]. Druckt die Ergebnisse.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 Bytes

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

Eingabe ist in A1. Die fest codierte Antwort ist kürzer als die Berechnung.