In dem absurden Stück Rosencrantz und Guildenstern sind tot , die beiden Hauptfiguren Rosencrantz und Guildenstern (oder sind sie?) Verwechseln immer welche von ihnen wer - oder manchmal welche ihrer eigenen Körperteile welche - wegen eines wahrgenommenen Mangels an individuelle Identität. Wäre es nicht absurd, wenn sie überhaupt um ihre Namen schlurften?
Ihre Aufgabe ist es, eine Funktion zu schreiben, die eine Zeichenfolge mit einer geraden Länge (und standardmäßig einem Vielfachen von 4) mit mehr als 7 Zeichen enthält, sie zu teilen und zu mischen.
Die Aufteilung muss wie folgt sein : Die Zeichenfolge hat das Format "abscd"
, wobei s als Trennzeichen fungiert. Der erste Abschnitt und das Trennzeichen sind abs
die erste Hälfte der Zeichenfolge, die zweite Hälftecd
Die Länge von a
wird sein(string length / 4) - 1
Die Länge von b
wird sein(string length / 4)
Die Länge von s
wird sein1
Die Länge von c
wird sein(string length / 4) + 1
Die Länge von d
wird sein(string length / 4) - 1
Dies kann sehr verwirrend sein. Lassen Sie mich Ihnen einige Beispiele zeigen
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Schließlich:
Anschließend mischen Sie die Teile und geben sie aus adscb
Ex. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- Standardlücken sind verboten
- Akzeptable Antworten: Eine Funktion, die Eingaben über eine Eingabezeichenfolge und eine Ausgabezeichenfolge zurückgibt
- Wenn die Eingabezeichenfolge nicht den oben angegebenen Anforderungen entspricht, MUSS Ihr Code fehlerhaft sein (egal welche Art von
Exception
oderError
) - Dies ist
code-golf
, also gewinnt die kürzeste (gültige) Antwort (in jeder Sprache)! - Bonuspunkte für einen Einzeiler :-) (Nicht wirklich, nur coole Punkte)
Antworten:
K (oK) ,
353433 BytesProbieren Sie es online aus!
Ohne Eingabevalidierung (für ngns Kopfgeld)
252423 BytesProbieren Sie es online aus!
Ich lernte schnell ein bisschen K und als ich mir die Liste der Verben ansah, dachte ich, dass ein alternativer Ansatz ( ohne Cut) hier funktionieren könnte. Und es hat perfekt funktioniert.
Wie es funktioniert
quelle
Perl 6 ,
6058 Bytes-2 Bytes dank Jo King
Probieren Sie es online aus!
Wirft im Fehlerfall "Rotorizing Sublist Length liegt außerhalb des Bereichs".
Erläuterung
quelle
J ,
3635 BytesProbieren Sie es online aus!
-1 Byte mal
{.
+ negative Längen &;.2
die stattdessen als "Endmarker" auf diejenigen schneiden.Ursprüngliche Antwort, 36 Bytes
Probieren Sie es online aus!
ngn erwähnte "cut" in einem Kommentar zu einer früheren K-Antwort und brachte mich dazu, J zu versuchen, das den gleichen "cut" hat (ich habe keine Ahnung, wie K funktioniert).
Wie es funktioniert
Beachten Sie, dass diese Funktion ungültige Eingaben automatisch verarbeitet:
{.
ausgelöst,domain error
da das Längenargument Ganzzahlen sein muss.5 A.
wirftindex error
.length error
ausgelöst.quelle
Python 3 ,
10310210197888684 BytesProbieren Sie es online aus!
Nicht wirklich ein
;
Einzeiler , aber ein Byte weniger pro Zeile als Zeilenumbruch und Einzug.ZeroDivisionError
Wird ausgelöst, wenn die Länge der Eingabezeichenfolge kleiner als 8 ist oder kein ganzzahliges Vielfaches von 4.Funktioniert auch in Python 2.
-4 Bytes dank Jo King
-9 Bytes dank Ovs
-2 Bytes dank Jonathan Frech
-2 Bytes dank Bubbler
quelle
//=
äußersten Paar überflüssig wurde. Vielen Dank!-l+1
<->1-l
?Perl 6 , 78 Bytes
Probieren Sie es online aus!
Anonymer Codeblock, der eine Zeichenfolge verwendet und die geänderte Zeichenfolge zurückgibt, falls gültig, andernfalls wird ein Fehler durch Division durch Null zurückgegeben. Ich weiß, dass ich ein Array direkt ändern kann, damit ich die beiden Abschnitte der Zeichenfolge austauschen kann, aber ich kann es nicht ganz herausfinden.
quelle
K (ngn / k) ,
1201131039995 BytesHoffentlich kann mehr Golf gespielt werden, eine zusätzliche Funktion zum Testen, ob die Stringlänge durch vier teilbar ist, gibt einen Fehler in Bezug auf eine nicht deklarierte Variable aus, wenn die Eingabe ungültig ist
BEARBEITEN: Fehlende Bedingung bei einer Länge von mehr als 7, inklusive
BEARBEITEN: In einer Funktion zusammengefasst, wurden redundante Variablendeklarationen entfernt
Probieren Sie es online aus!
quelle
indices_string
)? ping mich im Obstgarten, wenn ich es erklären sollteRetina 0,8,2 , 58 oder 73 oder 83 oder 93 Bytes
Probieren Sie es online aus! Erläuterung:
Capture
a
in$1
und macht es so kurz wie möglich*?
.$#2
,$#3
Und$#4
bis zu der Länge des Endea
.Erfassen
b
in$4
. Der(?<-2>.)+
erfasst bis zur Länge vona
, während der andere.
nach Bedarf 1 zu seiner Länge hinzufügt.Erfassen
s
undc
ein$6
. Ihre kombinierte Länge ist drei mehr als die Länge vona
.Erfassen
d
in$7
. Seine Länge ist nicht größer als die Länge vona
.Wir haben
a
so kurz wie möglich gemacht, aber wir wollen immer noch das Ende der Eingabe erreichen.Austausch
b
undd
.Die obige Stufe validiert ihre Eingabe nicht. Da Retina keine Laufzeitfehler aufweist, gibt es eine Reihe von Optionen für die Eingabevalidierung:
Gibt nichts aus, wenn die Länge kleiner als 8 ist oder nicht ein Vielfaches von 4. (+15 Bytes)
Error
Wird ausgegeben, wenn die Länge weniger als 8 oder nicht ein Vielfaches von 4 beträgt. (+25 Byte)Hängt, wenn die Länge weniger als 8 beträgt oder nicht ein Vielfaches von 4. (+35 Bytes)
quelle
C (GCC) mit
-Dx=memcpy
und-DL=(l-1)
,154158160 ByteGibt NULL zurück, wenn die Länge der Eingabezeichenfolge nicht durch 4 oder weniger als 8 Zeichen teilbar ist.
Vielen Dank an Rogem und Jonathan Frech für die Vorschläge.
BEARBEITEN: Der verschobene Präprozessor definiert die Befehlszeile und hat die Zeichenfolge dynamisch zugewiesen, um sie genau an das Puzzle anzupassen.
Probieren Sie es online aus!
quelle
t[80]
? Es scheint keine Obergrenze für die Eingabelänge zu geben.malloc()
stattdessen zu verwenden .NULL
für ungültige Ausgabe, Rückgabewerte vonmemcpy()
, ein funktionsähnliches Makro zum Überspringen der Typen und C99-Arrays variabler Länge zum Überspringenmalloc()
.//
oder das-w
?-w
ist nur eine Annehmlichkeit, um Warnungen zu unterdrücken (damit Fehler leichter zu finden sind). Normalerweise füge ich Befehlszeilenargumente nach a hinzu//
, damit TIO ihre Bytes für mich zählt, und ziehe dann 1 von der Summe ab, um das eine zusätzliche Zeichen zu berücksichtigen, das dafür benötigt wird.Gelee , 28 Bytes
(Wenn ein vollständiges Programm erlaubt ist, können wir das Trailing entfernen.
F
)Wenn die Länge kleiner als 8 ist oder nicht durch vier teilbar
ValueError
ist, wird a während der ganzzahligen Division voninf
(einem Float) durch4
- die Division ergibtNaN
(auch ein Float), was dann nicht kann zu einem gegossen werdenint
.Probieren Sie es online aus!
Wie?
quelle
Gelee , 25 Bytes
Probieren Sie es online aus!
Das
Ẏ
kann entfernt werden, um daraus ein vollständiges Programm zu machen.quelle
Ruby , 64 Bytes
Probieren Sie es online aus!
quelle
JavaScript (ES6),
9789 Byte8 Bytes dank @ l4m2 gespeichert
Probieren Sie es online aus!
quelle
JavaScript (Node.js) , 80 Byte
Probieren Sie es online aus!
JavaScript (Node.js) , 84 Byte
Probieren Sie es online aus!
JavaScript (Node.js) , 87 Byte
Probieren Sie es online aus!
Kürzer als RegExp
quelle
Java 8, 135 Bytes
Wirft
ArithmeticException
(dividiert durch Null), wenn die Eingabezeichenfolge nicht den Anforderungen entspricht. Probieren Sie es hier online aus .Ungolfed:
quelle
l/=l>7&l%4<1?4:0;
stattl=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 Bytes
Rückgabe durch Änderung. Kompilieren mit:
Quelldatei:
Probieren Sie es online aus!
Degolf
quelle