In dieser Herausforderung musst du einen Frosch simulieren, der auf Seerosenblättern vor und zurück springt. Der Teich ist unendlich groß, hat eine Reihe mit unendlich vielen Seerosenblättern und der Frosch kann über so viele Seerosenblätter springen, wie er möchte.
Dieser Frosch springt gern hin und her: Nach einem Sprung nach vorne springt er immer rückwärts und umgekehrt.
Ihnen wird eine Liste von ganzen Zahlen übergeben, die seine Sprünge darstellt. Sie müssen das Ergebnis seiner Sprünge ausgeben.
Angenommen, Sie sind bestanden [2,3,6,8,2]
:
Unser Frosch springt zunächst zwei Seerosenblätter nach vorne:
_2
Dann 3 Seerosenblätter zurück:
3__2
Dann 6 Seerosenblätter vorwärts:
3__2__6
8 zurück:
8_3__2__6
Dann schliesslich 2 Seerosenblöcke nach vorne (beachten Sie, wie die 2 die 3 überschreibt):
8_2__2__6
Genauer gesagt: Ihre Eingabe ist ein Array von Zahlen S
, die Sie S[K]
an der Position ausgeben müssen S[K] - S[K-1] + S[K-2] - S[K-3]...
.
- Wenn mehrere Nummern an einem bestimmten Ort gedruckt werden sollen, drucken Sie nur die mit dem höchsten Index.
- Sie sind zu verwenden,
_
wenn ein bestimmter Ort leer ist - Wenn eine Nummer aus mehreren Ziffern besteht, werden nicht mehrere Stellen belegt. (Mit anderen Worten, ein Ort kann aus mehreren Zeichen bestehen.)
- Sie können davon ausgehen, dass Ihre Liste nicht leer ist und alle Ganzzahlen größer als 0 sind.
Testfälle:
5 ____5
2,2 2_2
4,3,2,1 3124
5,3,2,1 _3125
2,3,6,8,2 8_2__2__6
10,3,12,4,1,12,16 ___12__3__10____41__1216
100,4,7,2,2 _______________________________________________________________________________________________4___1002_2
Dies ist ein Code-Golf , also beantworte es mit so wenig Zeichen wie möglich!
Antworten:
MATL ,
3534 BytesVielen Dank an @Emigna für das Speichern von 1 Byte!
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Spielen Sie Ihren Code, nicht Ihre Erklärungen!
Im Folgenden wird die Eingabe
[2,3,6,8,2]
als Beispiel verwendet. Um Zwischenergebnisse im tatsächlichen Code anzuzeigen, können Sie ein%
(Kommentarsymbol) einfügen , um das Programm an dieser Stelle anzuhalten und den Stapelinhalt anzuzeigen. Dies zeigt zum Beispiel den Stapel nach AnweisungYs
(kumulative Summe).quelle
'0'
anstelle von ersetzen' 0 '
, weilXz
die Leerzeichen nach entfernt'0'
in'10'
ersetzt. Deshalb habe ich einen anfänglichen hinzufügen32
zu' 0'
genauso gut funktionieren?PHP,
10010199104 BytesNimmt Eingaben von Befehlszeilenargumenten entgegen. renn mit
-nr
.Nervenzusammenbruch
quelle
2,3,6,8,2
, bei der die8
Sprünge "rückwärts" über den "Anfang" der Seerosenblöcke hinausgehen?JavaScript (ES6),
99107 BytesBearbeiten: Da das OP klarstellte, dass das einzige Limit der verfügbare Speicher sein sollte, wurde dieses Update aktualisiert, um genau den erforderlichen Speicherplatz zuzuweisen, anstatt sich auf einen fest codierten Maximalbereich zu verlassen.
Wie es funktioniert
Diese Funktion arbeitet in zwei Durchgängen:
Während des ersten Durchgangs:
p
wird auf initialisiert0
.x
Variable ist auf eine leere Zeichenfolge festgelegt, sodass alle Änderungsversuche einfach ignoriert werden.m
undM
welche sind die minimalen und maximalen Werte, die von erreicht werdenp
.f()
.Während des zweiten Durchgangs:
p
wird initialisiert zu-m
.x
ist auf ein Array mit einer Größe festgelegtM-m
, die mit_
Zeichen gefüllt ist .x
.x
, die das Endergebnis ist.Testfälle
Code-Snippet anzeigen
quelle
[1100]
Die Zahl wird an der Position1002
anstelle der Position gedruckt1100
.R ,
1009796 BytesProbieren Sie es online!
Zeile 1 findet alle Positionen, an denen gesprungen werden soll. Zunächst werden alle Einsprünge
x
mit 1 oder –1 multipliziert und dann mit kumulativer Summierung zu Endpositionen transformiert. Der Vektorc(-1,1)
wird bei Bedarf recycelt, wenn er jedoch diex
Länge 1 hat,x
wird er stattdessen recycelt. Daher werden nurseq(x^0)
(äquivalenteseq_along(x)
) Beträge berücksichtigt. (Eine Warnung wird generiert, wenn die Länge vonx
nicht ein Vielfaches von 2 ist, aber das Ergebnis nicht beeinflusst.)Zeile 2 erhöht die Sprungpositionen, sodass alle mindestens 1 sind.
In den Zeilen 3 und 4 wird die Ausgabe erstellt und gedruckt.
−1 Byte von Giuseppe
quelle
seq(x^0)
!-p+1
kann1-p
für ein Byte weniger sein.Javascript (ES6), 109 Byte
Kommentiert:
quelle
Perl 6 ,
6867 BytesProbieren Sie es online!
Wie es funktioniert
Zunächst werden die kumulativen Sprungstellen ermittelt:
Dann werden sie in 0-basierte Array-Indizes umgewandelt, indem die minimale Zahl (aber höchstens 1) von allen Zahlen subtrahiert wird:
Dann erstellt es ein Array mit den Eingangsnummern, die diesen Indizes zugewiesen sind:
Schließlich wird das Array zu einer Zeichenfolge verkettet, wobei der Unterstrich anstelle von undefinierten Elementen verwendet wird:
quelle
Jelly ,
2824 Bytes-2 (und weitere -2 zulassen) dank FrownyFrog (benutze schnell die [post-challenge] -Funktion der Präfix-Anwendung
Ƥ
)Probieren Sie es online! Das vollständige Programm für eine Testsuite mit derselben Funktionalität finden Sie hier .
Wie?
Anmerkungen:
Die letzte Verkettung einer neuen Zeile
;⁷
ist für Fälle vorgesehen_
, in denen in der Ausgabe kein Eintrag vorhanden ist. In diesem Fall zeigt der implizite Ausdruck eine Darstellung der Liste an, z. B.[3, 1, 2, 4]
anstelle des Beispiels_3125
. Für keine nachlauf Newline ersetzen könnte;⁷
mit;““
einer Liste von Zeichenlisten anhängen,[[''],['']]
(nein schließen”
erforderlich , da es das letzte Zeichen eines Programms ist).Die Unwahrheitsfunktion Ṭ gibt eine Liste mit
1
s an den Indexen in ihrer Eingabe für eine einzelne natürliche Zahl an, n mit n-10
s, gefolgt von einem1
Ermöglichen, dass die eingegebenen Zahlen durch Multiplikation in ihrem korrekten Abstand von links platziert werden . Die UmkehrṚ
ist, erforderlich haben späte Frosch-Besuche überschreiben , anstatt früher diejenigen , wenn die Reduktion mit odero/
, durchgeführt wird.quelle
1,-ṁ×µ+\
→UƤ_@/€
?Ƥ
war an der stelle kein feature das dies geschrieben wurde, aber ja das wird funktionieren. Besser istUƤḅ€-
(da die Umrechnung von der Basis -1 wie das Multiplizieren mit...,1,-1,1,-1,1,-1,1
und dann das Summieren ist).UƤḅ-
seitḅ
Vektorisierungen :) (Ich ging auch mit einfachen Reverse,Ṛ
da wir die Komplexität des Upends nicht benötigen,U
)APL (Dyalog Unicode) ,
4530 Byte SBCSProbieren Sie es online!
-\⍵
scannen Sie das Argument abwechselnd mit-
und+
(⊢ - 1 ⌊ ⌊/)
von diesem (⊢
) subtrahiere 1 oder das Minimum (⌊/
), je nachdem, welches kleiner ist (⌊
)i←
zuweiseni
⌈/ 1+
inkrementieren und das Maximum nehmen⍴∘'_'
produzieren so viele Unterstriche⍵@i
Setzen Sie die Zahlen aus dem Argument (⍵
) an die Positioneni
∊⍕¨
jeweils formatieren und abflachenquelle
Ruby , 85 Bytes
Probieren Sie es online!
Zeichnet die Positionen nach jedem Sprung auf, konvertiert das resultierende Array in einen Hash, um Duplikate zu entfernen (wobei der letzte Wert an jeder duplizierten Position beibehalten wird), und klebt dann die Werte mit der erforderlichen Anzahl von Unterstrichen.
quelle
Python 2 ,
113110 BytesProbieren Sie es online!
quelle