Interessanter Generator für den Primzahl-Permutationsindex des verrückten Bibliothekars

13

Sie haben den Tag mit Ihrem Prim-Sequence-Code gerettet , und der Mathematiklehrer war begeistert. So sehr, dass der Bibliothekar (a / k / a, Ihr Chef) vor eine neue Herausforderung gestellt wurde. Herzlichen Glückwunsch, Sie können die Lösung codieren, damit der Bibliothekar den Mathematiklehrer erneut beeindrucken kann.

Beginnen Sie mit der Folge natürlicher Zahlen in Basis 10, N

0, 1, 2, 3, 4, 5, 6 ...

Ohne 0und 1ist jede Zahl in dieser Folge entweder eine Primzahl, P

2, 3, 5, 7, 11, 13 ...

oder zusammengesetzt, C

4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20 ...

Der Mathematiklehrer dachte darüber nach, wie der Bibliothekar dachte, eine Ganzzahl in die Dezimalerweiterung einer Zahl aus P einzufügen , und erstellte stattdessen eine Funktion G (x, y) , die eine Zahl xaus N mit 1 <= x <= 9und eine Zahl yaus C nimmt und xin die einfügt Dezimalerweiterung yin jeder Position, von links nach rechts, wobei nur eindeutige Zahlen ausgewählt werden.

Zum Beispiel G (3,14) ist 314, 134, 143. Allerdings G (1.14) ist nur 114, 141als ob Sie voranstellen oder Einsatz der 1in 14die gleiche Anzahl 114erzeugt.

Der Mathematiklehrer fragte sich, wie oft Sie diese Permutationen durchführen müssten, bevor Sie eine Zahl in P erhalten , wenn Sie xin aufsteigender Reihenfolge vorgehen. Der Mathematiklehrer nannte dies den Composite-Prime-Index einer Zahl und schrieb ihn als CPI (y) .

Zum Beispiel 4muss nur zweimal getan werden: 14, 41Da 41Primzahl ist, so CPI (4) ist 2. Allerdings 8muss 6 mal durchgeführt werden, 18, 81, 28, 82, 38, 83vor dem Erreichen 83als Primzahl, so CPI (8) ist 6.

Ihre Aufgabe ist es, Code zu schreiben, der diesen Composite-Prime-Index mit einer eingegebenen Nummer ausgibt .

Eingang

  • Eine einzelne Ganzzahl y, z. B. yin C , die über das Funktionsargument STDIN oder ein Äquivalent eingegeben wird.
  • Für die Zwecke der Berechnung können Sie davon ausgehen y, dass sie in die üblichen ganzzahligen Bereiche passen (z. B. 2 31 -1 als Obergrenze annehmen ).
  • Verhalten für ynicht in C ist undefiniert.

Ausgabe

Der sich ergebende Composite-Prime-Index , der wie oben beschrieben berechnet wurde, wird mit zwei Ausnahmen an STDOUT oder einen gleichwertigen Index ausgegeben:

  • Wenn die allerletzte Permutation (dh das Anhängen 9an y) diejenige ist, die zu einer Primzahl führt, wird ausgegeben -1. Ein Beispiel, das unten erweitert wird, ist y=14.
  • Wenn es keine Permutation gibt (dh G (x, y) ist eine Teilmenge von C für alle 1 <= x <= 9), wird ausgegeben 0. Ein Beispiel, das unten erweitert wird, ist y=20.

Beispiele

 y -> operations             : output
 4 -> 14, 41                 : 2
 6 -> 16, 61                 : 2
 8 -> 18, 81, 28, 82, 38, 83 : 6
 9 -> 19                     : 1
10 -> 110, 101               : 2
12 -> 112, 121, 212, 122, 312, 132, 123, 412, 142, 124, 512, 152, 125, 612, 162, 126, 712, 172, 127 : 19
14 -> 114, 141, 214, 124, 142, 314, 134, 143, 414, 144, 514, 154, 145, 614, 164, 146, 714, 174, 147, 814, 184, 148, 914, 194, 149 : -1
15 -> 115, 151               : 2
16 -> 116, 161, 216, 126, 162, 316, 136, 163 : 8
18 -> 118, 181               : 2
20 -> 120, 210, 201, 220, 202, 320, 230, 203, 420, 240, 204, 520, 250, 205, 620, 260, 206, 720, 270, 207, 820, 280, 208, 920, 290, 209 : 0

Beschränkungen

  • Dies ist Codegolf, da Sie dies auf eine Karteikarte übertragen müssen, damit der Bibliothekar dem Mathematiklehrer zeigen kann, und Ihre Hand verkrampft sich leicht.
  • Es gelten die üblichen Lückenbeschränkungen. Der Bibliothekar toleriert keine Betrüger.

Bestenliste

AdmBorkBork
quelle
Ist für 9 die 19Primzahl, sollte die Ausgabe also nicht 1 sein?
Isaacg
Wow, coole Antwortkarte!
Cascading-Stil
1
@ cascading-style Wenn du das Leaderboard meinst, das ist hauptsächlich Martins Handarbeit .
AdmBorkBork

Antworten:

1

Pyth, 35 Bytes

&sKm}dPdsm{msj`dcz]khlzS9|%hxK1lK_1

Testsuite

isaacg
quelle
2

Haskell, 166 161 Bytes

p n=mod(product[1..n-1]^2)n>0
q=p.read
n#c=[h++c:t|i<-[0..length n],(h,t)<-[splitAt i n]]
[y]%i|q y= -1|1<2=0
(y:z)%i|q y=i|1<2=z%(i+1)
f n=((n#)=<<['1'..'9'])%1 

Anwendungsbeispiele: f "8"->6 , f "14"-> -1, f "20"-> 0.

So funktioniert es: pIst der Primalitätstest (gestohlen aus @ Mauris Antwort in einer anderen Herausforderung). qEin Wrapper pzum Konvertieren von Typen von Strings in Integer. n # cfügt can jeder Stelle in n. %Nimmt eine Liste von Zahlen und einen Index i. Wenn das erste Element der Liste Primzahl ist, kehren Sie zurück i, andernfalls wiederholen Sie mit dem Ende der Liste und i+1. Stoppen Sie, wenn ein einzelnes Element übrig ist, und kehren -1Sie zurück, wenn es prim und ist0 sonst ist.

nimi
quelle
1

Minkolang 0,11 , 85 Bytes

n1(l*$d`)d9[i3G(0c2c$%$r2c*l*2c3c1+*++2gl:d2G)2gx1c2G3gx]r3XS(2M4&I)N.ikI1-4&1~N.1+N.

Probieren Sie es hier aus.

Erklärung (in Kürze)

n            Take integer from input (say, n)
1(           Calculate smallest power of 10 greater than n (say, a)
  l*         Multiply by 10
    $d`      Duplicate stack and push n>a
       )     Close while loop (ends when n<=a)
        d    Duplicates a (let's call it b)

9[                                                 For loop that runs 9 times 
  i1+                                              Loop counter + 1 (say, i)
     3G                                            Puts the loop counter in position 3
       (                                           Opens while loop
        0c2c$%                                     Copies n and b and pushes n//b, n%b
              $r                                   Swaps top two elements of stack
                2c*l*                              Copies b and multiplies by 10
                     2c3c*                         Copies b and i and multiplies them
                          ++                       Adds it all together (inserts i)
                            2gl:                   Gets b and divides by 10
                                d2G                Duplicates and puts one copy back
                                   )               Closes while loop (breaks when b=0)
                                    2gx            Gets and dumps b
                                       1c2G        Copies a and puts it in b's place
                                           3gx     Get and dumps i
                                              ]    Close for loop

r       Reverses stack
 3X     Dumps the top three elements (namely, n, a, and b)
   S    Removes duplicates

(                           Opens while loop
 2M                         Pushes 1 if top of stack is prime, 0 otherwise
   4&                       Jump four spaces if prime
     I)N.                   If the loop actually finishes, then all were composite,
                             so output 0 and stop.
         ik                 Pushes loop counter and breaks
           I1-              Pushes length of stack minus 1 (0 if last one was prime)
              4&1~N.        If this is 0, pushes -1, outputs as integer, and stops.
                    1+N.    Adds 1, outputs as integer, and stops.
El'endia Starman
quelle
1

Javascript, 324 Bytes

y=>(p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,u=a=>a.filter((c,i)=>a.indexOf(c)==i),g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),console.log(p(y,2)||y<2?'':i==h(1,y).length?-1:i))

Wenn y nicht in C ist, ist die STDOUT-Ausgabe leer.

Erläuterung

y=>(
    //Prime Test function
    p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,

    //Unique function
    u=a=>a.filter((c,i)=>a.indexOf(c)==i),

    //Generates numbers from a couple x and y
    g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),

    //Generates all possible numbers from y using recusion
    h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),

    //Check if any prime in the generated numbers
    i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),

    console.log(
        //Is Y in C ?
        p(y,2)||y<2?
            ''
            :
            // Check if the answer is not the last one
            i==h(1,y).length?-1:i)
    )
Naouak
quelle
Könnte sehr spät sein , dies zu kommentieren, aber könnten Sie nicht ein paar Bytes durch Ersetzen sparen n%c!=0mit n%c; c>=n-1mit c>n-2; und x==9mit x-9?
Zacharý