voranstellen, anhängen-Sequenz


14

Aufgabe

Die voranstehende, anhängende Sequenz wird wie folgt rekursiv definiert

  • a (1) = 1
  • a (n) = a (n-1) .n, wenn n gerade ist
  • a (n) = na (n-1), wenn n ungerade ist

bei dem die . repräsentiert eine ganzzahlige Verkettung.

Die ersten Begriffe sind also: 1,12,312,3124,53124,531246,7531246,...Dies ist A053064 .

Ihre Aufgabe ist es , einen ganze Zahl gegeben a> 0 zurückzukehren n solche, daß das n - te Element in den prepend append-Sequence gleich a , und wenn keine solche n existiert return 0, eine negative Zahl oder Fehler aus usw.

Regeln

  • Die Eingabe kann als Ganzzahl, Zeichenfolge, Liste von Zeichen / Ziffern usw. erfolgen.
  • Die Ausgabe kann auf STDOUT gedruckt oder zurückgegeben werden (Integer, String usw. sind in Ordnung).
  • Bei ungültiger Eingabe & falls kein solches n existiert, kann Ihr Programm alles tun, außer eine positive Ganzzahl zurückzugeben (zB Endlosschleife, Rückgabe von 0 usw.).
  • Sie können die 0-Indizierung verwenden, aber dann kann die Ausgabe, falls kein n vorhanden ist, nicht 0 sein

Testfälle

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100

Formeller: a(n-1)*(int(log(n))+1)+nund n*(int(log(n))+1)+a(n-1)?
Mr. Xcoder

1
@ Mr.Xcoder Ich würde das weniger formal nennen: P
Post Rock Garf Hunter

@ JonathanAllan Das ist schon in der Frage für ~ 10 Minuten.
Mr. Xcoder

2
Ich schlage vor, Fehler für ungültige Eingaben zuzulassen.
Kritixi Lithos

Ich schlage vor, undefiniertes Verhalten für ungültige Eingaben zuzulassen.
Mr. Xcoder

Antworten:


6

JavaScript (ES6), 40 Byte

Übernimmt die Eingabe als Zeichenfolge. Löst einen Rekursionsfehler aus, wenn kein Index gefunden wird.

f=(n,s=k='1')=>n==s?k:f(n,++k&1?k+s:s+k)

Demo


Ich denke, Sie können ein Byte mit diesem speichern: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock

@RickHitchcock Leider würde dies Zahlenvergleiche erzwingen und zu Fehlalarmen bei großen Eingaben führen, die durch den Genauigkeitsverlust verursacht werden.
Arnauld

Erwischt. Es funktioniert in den Testfällen, war sich aber nicht sicher, wie es mit anderen Situationen umgehen würde.
Rick Hitchcock

6

C # (.NET Core) , 83, 80, 60, 59 Bytes

n=>{int i=0;for(var t="";t!=n;)t=++i%2<1?t+i:i+t;return i;}

Probieren Sie es online!

Nimmt die Eingabe als Zeichenfolge in eine Lambda-Funktion auf. 1-indiziert. Liefert den Index des Wertes für truthy oder Endlosschleifen für eine "Falsey"


6

Python 2 , 63 Bytes

-1 Byte dank @EriktheOutgolfer .

f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j

Probieren Sie es online!

Python 2 , 64 Bytes

-18 Bytes dank @officialaimm , weil ich nicht bemerkt habe, dass Fehler erlaubt waren!

x,i,j=input(),'1',1
while i!=x:j+=1;i=[i+`j`,`j`+i][j%2]
print j

Probieren Sie es online!

Python 2 , 82 Bytes (keine Endlosschleife)

Dieser gibt 0für ungültige Eingaben zurück.

def f(n,t="",i=1):
 while len(t)<len(n):t=[t+`i`,`i`+t][i%2];i+=1
 print(n==t)*~-i

Probieren Sie es online!


2
Ninja'd: D 65 Bytes
offiziell

@officialaimm Vielen Dank! Ich habe nicht bemerkt, dass ein Fehler aufgetreten ist / eine Schleife für immer erlaubt war.
Mr. Xcoder

Speichern Sie ein Byte mit einem Lambda:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Erik der Outgolfer

@EriktheOutgolfer Warte, es wird für alles ein Rekursionsfehler ausgelöst, obwohl ich gesetzt habe sys.setrecursionlimit(). Können Sie ein tio zur Verfügung stellen?
Mr. Xcoder

@ Mr.Xcoder Wirft es einen Fehler für x=1? Oder x=12? Ich dachte, dass es nur für so einen Fehler x=151311975312468101214oder so etwas warf .
Erik der Outgolfer

3

Gelee , 12 Bytes

Rs2ZU1¦ẎVµ€i

Probieren Sie es online!

Erläuterung:

Rs2ZU1¦ẎVµ€i
         µ€  Eval this link for each (automatic [1..n] range)
R             Range
 s2           Split in pieces of: 2
   Z          Zip
    U1¦       Only keep index: 1 of: Vectorized reverse
       Ẏ      Flatten 1-deep
        V     Concatenate string versions and eval
           i Find index of y in x (y = implicit input)

3

05AB1E , 14 Bytes

$vDNÌNFs}«})Ik

Probieren Sie es online! oder als Testsuite

Erläuterung

0-indiziert .
Gibt -1 zurück, wenn sich die Eingabe nicht in der Sequenz befindet.

$                 # push 1 and input
 v                # for each y,N (element, index) in input do:
  D               # duplicate top of stack
   NÌ             # push N+2
     NF }         # N times do:
       s          # swap the top 2 elements on the stack
         «        # concatenate the top 2 elements on the stack
          })      # end loop and wrap in a list
            Ik    # get the index of the input in this list

Haha, das ist im Grunde meine Lösung mit dem gentfernten und dem gekürzten Append / Prepend-Ding. Ich werde meine Antwort löschen
Okx

@Okx: Oh ja, ich sehe, dass du nur wenige Minuten nach meinem Post auf fast genau das golfen hast. Großartige Köpfe;)
Emigna

2

R , 73 Bytes

p=paste0;n=scan(,'');l='';while(l!=n){F=F+1;l="if"(F%%2,p(F,l),p(l,F))};F

Liest aus stdin und gibt den Wert des Index zurück (implizit gedruckt). Endlosschleifen, wenn der Wert nicht in der Sequenz enthalten ist. Fist voreingestellt FALSEund wird 0bei Verwendung in der Arithmetik umgewandelt.

Probieren Sie es online!


1

Mathematica, 135 Bytes

s=t={};x=1;While[x<5!,{s~AppendTo~#&,s~PrependTo~#&}[[x~Mod~2+1]]@x;AppendTo[t,FromDigits@Flatten[IntegerDigits/@s]];x++];t~Position~#&

1

Jelly ,  19 18  15 Bytes

+ḂḶṚm2;RḤ$ṁµ€Vi

Eine monadische Verknüpfung, die ganze Zahlen aufnimmt und zurückgibt.

Probieren Sie es online! (Sehr langsam - benötigt ~ 50s für TIO, um zu bestätigen, dass3124der Index erreicht ist4)

Verwenden Sie für eine viel schnellere Version das vorherige 18-Byte-Format (prüft nur die Länge der Eingabe, die ausreicht).

Wie?

+ḂḶṚm2;RḤ$ṁµ€Vi - Link: number, v
           µ€   - perform the monadic link to the left for €ach k in [1,2,3,...v]
                -                 (v can be big, lots of k values makes it slow!)
 Ḃ              -   modulo k by 2  = 1 if odd 0 if even
+               -   add to k = k+isOdd(k)
  Ḷ             -   lowered range = [0,1,2,...,k+isOdd(k)]
   Ṛ            -   reverse = [k+isOdd(k),...,2,1,0])
    m2          -   modulo slice by 2 = [k+isOdd(k),k+isOdd(k)-2,...,3,1]
         $      - last two links as a monad:
       R        -   range(k) = [1,2,3,...,k]
        Ḥ       -   double = [2,4,6,...,2k]
     ;          - concatenate = [k+isOdd(k),k+isOdd(k)-2,...,3,1,2,4,6,...,2k]
         ṁ      - mould like range(k) = [k+isOdd(k),k+isOdd(k)-2,...,3,1,2,4,6,...,k-isOdd(k)]
                -   (this is a list of the integers to be concatenated for index k)
             V  - evaluate as Jelly code (yields a list of the concatenated integers)
              i - first index of v in that (or 0 if not found)

Wie lange würde die Berechnung dauern 211917151311975312468101214161820?
Okx

Eine lange, lange Zeit: p
Jonathan Allan

Ja aber wie lange
Okx

Nun sieht es so aus, als wäre es die Ordnung v im Quadrat, wobei v die ganze Zahl der Eingabe ist.
Jonathan Allan

@ JonathanAllan Technisch nennst du das : p
Erik the Outgolfer

1

Schnelle 4 , 92 Bytes

Dies ist eine Endlosschleife für ungültige Fälle, sodass ich sie nicht in den Testlink aufgenommen habe.

func f(x:String){var i="1",j=1;while i != x{j+=1;i=[i+String(j),String(j)+i][j%2]};print(j)}

Test Suite.

Amüsanterweise ist es länger mit einem Verschluss:

var f:(String)->Int={var i="1",j=1;while i != $0{j+=1;i=[i+String(j),String(j)+i][j%2]};return j}

Test Suite.




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.