Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die bei zwei gleich langen Zeichenfolgen jedes andere Zeichen vertauscht und die resultierenden Zeichenfolgen in beliebiger Reihenfolge ausgibt bzw. zurückgibt.
Beispiele
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
Regeln
- Die Zeichenfolgen enthalten nur ASCII-Zeichen (32-126).
- Die Zeichenfolgen haben immer die gleiche Länge und sind niemals leer.
- Sie können Eingaben in jedem geeigneten Format akzeptieren: separate Parameter, Elemente in einem Array, getrennt durch eine oder mehrere Zeilenumbrüche, sogar verkettet. Die einzige Einschränkung ist, dass ein String vollständig vor dem anderen stehen muss (z. B.
a1\nb2\nc3
für"abc", "123"
ist ungültig). - Die Ausgabe kann in beliebiger Reihenfolge erfolgen (dh Sie können mit dem Auswechseln des ersten oder des zweiten Zeichens beginnen) und in einem beliebigen oben genannten gültigen Format erfolgen. (Array mit 2 Elementen, durch Zeilenumbrüche getrennt, verkettet usw.)
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes für jede Sprache.
DrMcMoylex
. : DAntworten:
Haskell, 37 Bytes
Komprimiert die beiden Zeichenfolgen, tauscht die Zeichen abwechselnd aus und dekomprimiert sie dann.
Eine 37-Byte-rekursive Alternative:
quelle
Python, 42 Bytes mit I / O-Golf
Vertauscht jedes andere Zeichen der beiden Listen. Nimmt als Eingabe zwei Listen von Zeichen und gibt sie durch Ändern aus .
gibt
quelle
Vim,
18, 17 BytesProbieren Sie es online!
Dies verwendet den V-Interpreter aus Gründen der Abwärtskompatibilität. Die Eingabe erfolgt in folgendem Format:
Erläuterung:
quelle
x
anstelle vonyl
und dann jusP
anstelle von second verwendenvP
:lqqxjvPkPll@qq@q
[save]
Knopf gedrückt? In jedem Fall funktioniert es bei mir nicht . Der wahre Grund dafür ist, dass wenn Siex
das letzte Zeichen in der Zeile sind, der Cursor nach links bewegt wird, wodurch die Platzierung des Wechsels durcheinander gebracht wird.Haskell, 41 Bytes
Gibt ein Paar mit den Strings zurück. Anwendungsbeispiel:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Einfacher rekursiver Ansatz: Nehmen Sie das erste Zeichen jeder Zeichenfolge als Paar und fügen Sie einen rekursiven Aufruf hinzu, wobei die (übrigen) Zeichenfolgen vertauscht werden.
unzip
macht aus der Liste der Paare ein Paar von Listen.quelle
05AB1E ,
1110 BytesProbieren Sie es online!
Erläuterung
Eingabe =
["code", "golf"]
wird als Beispiel verwendet.quelle
Perl, 48 Bytes
Bytecount enthält 47 Byte Code und
-p
Flag.Laufen Sie mit
-p
und-E
kennzeichnen Sie. Erwarten Sie jede Zeichenfolge in einer anderen Zeile:Erklärungen :
-p
: Eingabe erfassen$_
und am Ende ausdrucken. (um die erste Zeichenfolge abzurufen und auszudrucken)<>
: Eine Eingabezeile abrufen. (um die zweite Zeichenfolge zu erhalten).=~
: wende einen regulären Ausdruck an<>
: ans%%%geer
, wo dankr
der geänderten Zeichenfolge zurückgegeben wird (und dann dank ausgedruckt wirdsay
).Der reguläre Ausdruck:
.\K(.)
findet zwei Zeichen und ersetzt das zweite mit dem Ergebnis der Auswertung dieses Codes"s/.{$-[0]}\\K(.)/$1/;\$1"
:Der erste Teil
s/.{$-[0]}\\K(.)/$1/
wendet einen regulären Ausdruck an auf$_
:.{$-[0]}
überspringt die ersten Zeichen, um zum gleichen Punkt wie der äußere reguläre Ausdruck zu gelangen (da$-[0]
enthält den Index der ersten Erfassungsgruppe, also in diesem Fall der Index der zu ersetzenden Zeichen), und dann erfassen wir ein Zeichen mit(.)
und ersetzt ihn durch das Zeichen des äußeren regulären Ausdrucks ($1
). Und dann fügen wir hinzu,$1
dass das Ergebnis"s/.{$-[0]}\\K(.)/$1/;\$1"
der Charakter ist, den wir in der inneren Regex erfasst haben.Sie haben das vielleicht bemerkt
$1
Beziehen Sie sich auf das Zeichen, das in beiden Zeichenfolgen ersetzt werden soll (also auf zwei verschiedene Zeichen), und spielen Sie mit dem/ee
Modifikator des regulären Ausdrucks, der die rechte Seite des regulären Ausdrucks zweimal auswertet. Der erste ersetzt nur das Zeichen, dem$1
nicht das vorangestellt ist\
.quelle
Python, 55 Bytes
Schneiden!
58 Bytes:
64 Bytes:
Akkumuliert rekursiv die Zeichen der beiden Zeichenfolgen in
s
undt
und gibt das Paar am Ende aus. Der Wechsel erfolgt durch Umschalten der Eingabezeichenfolgen bei jedem rekursiven Aufruf. Die Ausgabe einer durch Leerzeichen getrennten Zeichenfolge hatte dieselbe Länge:Dies schlägt eine andere rekursive Strategie der abwechselnden Entnahme von Zeichen aus jeder Zeichenfolge mit jeder der beiden möglichen Zeichenfolgen als der ersten knapp aus. (65 Bytes)
quelle
MATL ,
111098 BytesDanke an ETHproductions für 1 Byte!
Die Eingabe ist ein 2D-Array, das die beiden Zeichenfolgen enthält, z
['Halloween'; 'Challenge']
. Die Ausgabezeichenfolgen sind in umgekehrter Reihenfolge.Probieren Sie es online!
Erläuterung
Alte Version: 9 Bytes
Erläuterung
quelle
Gelee , 5 Bytes
Die Eingabe erfolgt als separate Argumente, die Ausgabe wird verkettet.
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Jelly ,
986 BytesDanke an Dennis für das Speichern von 2 Bytes!
Verwendet die Jelly- Codierung .
Probieren Sie es online!
quelle
ṙ"J$
anstelle von verwendenĖṙ@/€
. Außerdem ist das Trennen der Zeichenfolge nicht erforderlich, sodass Sie die Zeichenfolge ablegen könnenY
.V , 12 Bytes
Probieren Sie es online!
Nichts zu interessantes, nur ein direkter Port meiner vim Antwort, damit ich mit 05AB1E mithalten kann (aber nicht schlagen kann).
quelle
Pyke, 9 Bytes
Probieren Sie es hier aus!
quelle
JavaScript (ES6), 51
54Bearbeite 3 Bytes, die dank @Neil gespeichert wurden
Funktion mit Array-Ein- / Ausgang
Ich mag dieses noch, aber es ist 55 (2 Strings in der Eingabe, Array in der Ausgabe)
Prüfung
quelle
replace
sparen Sie 3 Bytes:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pyth, 8 Bytes
Probieren Sie es online aus: Demonstration
Transponiert die Wörter, kehrt jedes Buchstabenpaar um, transponiert erneut.
quelle
JavaScript (ES6), 55 Byte
Ich wollte klug , etwas zu tun mit regexp mit alternativen Zeichen zu ersetzen , sondern dass am Ende unter
6757 Bytes:quelle
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
für die gleiche Länge.map
, es hat 10 Bytes meiner regulären Ausdrucksantwort entfernt. Immer noch zu lang.Perl, 40 Bytes
Beinhaltet +1 für
-n
Geben Sie Strings als Zeilen in STDIN ein
interlace.pl
quelle
Java,
132103100 BytesVielen Dank an Kevin Cruijssen, der unter anderem vorgeschlagen hat, das Array zurückzugeben und 29 Byte zu sparen! Auch Olivier Grégoire für 3 Bytes!
So genannt:
Ausgabe:
Hollo,werld!
Nutzt die Tatsache, dass Eingaben grundsätzlich auf jede Art und Weise formatiert werden können (in diesem Fall ein einzelnes Zeichen-Array von Zeichenfolgen, die durch ein Komma getrennt sind) und auch ziemlich milde Ausgaberegeln.
quelle
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 Bytes ), wobei die Ausgabe zurückgegeben wird, anstatt direkt gedruckt zu werden. Beispiel Eingabe:System.out.println(c("Hello,world!".toCharArray(), 5));
; Beispiel Ausgabe:Hollo,werld!
.Hollo!werld,
und nichtHollo,werld!
(die Interpunktion ist falsch). Ich glaube, dass dies mit einem Eingabewert von 6 statt 5 behoben werden kann.t
zuchar
, warum nicht erklären Sie es in der für so eine direkt Schleifechar
? Sie würden ein paar Bytes sparen.C 124 Bytes
Rufen Sie an mit:
Die Länge der Zeichenfolge ist auf 98 Zeichen begrenzt.
quelle
Oktave ,
6461 BytesAnonyme Funktion, die mit jeder Zeichenfolge in einer Zeile ein 2D-Zeichen-Array eingibt und die Ausgabe im gleichen Format erstellt.
Probieren Sie es bei Ideone .
quelle
Schläger 208 Bytes
Ungolfed:
Testen:
Ausgabe:
Oben ist die rekursive Version.
Iterative Version:
Ungolfed:
quelle
PowerShell v2 +, 82 Byte
Immer noch Golf spielen ...Nein. Kann nicht scheinen, dieses herunter zu spielen, ohne einen regulären Ausdruck wie andere Antworten zu verwenden (Boo auf Kopieralgorithmen).Also nehmen wir
$a
und$b
als Strings, setzen den Index$i
auf0
, wandeln ihn$a
alschar
-array um und senden ihn durch eine Schleife|%{...}
. Bei jeder Iteration verketten wir Zeichenfolgen$c
und$d
indizieren sie in eine Array-Auswahl (dh, sie wechselt abwechselnd hin und her). Dann verlassen wir$c
und befinden uns$d
in der Pipeline, und die Ausgabe erfolgt implizitWrite-Output
nach Abschluss des Programms.quelle
Lithp , 120 Zeichen (+3 für -v1 Flag)
Zeile zweigeteilt zur besseren Lesbarkeit:
Benötigt die
-v1
Flagge umrun.js
da einige Funktionen noch nicht Teil der Standardbibliothek sind.Beispielnutzung:
Diese Art von Highlights, die ich nicht genug Zeit für die Standardbibliothek aufgewendet habe. Das
js-bridge/1
zweimalige Verwenden des langen regulären Ausdrucks sowie das Aufrufen von map usinginvoke/*
all tragen dazu bei, dass dieser Vorgang viel länger dauert als erforderlich.Zeit, an meiner Standardbibliothek mehr zu arbeiten, denke ich.
quelle
PHP, 79 Bytes
Vorherige Version PHP, 82 Bytes
quelle
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
ist ein weiterer -2, obwohl es PHP 7Notice: String offset cast occurred in Command line code on line 1
C
5452 BytesAngenommen, die Ausgabe
c
hat bereits die gewünschte Länge.Verwendung:
}
Wenn Sie darauf bestehen, die Ausgabe zu erstellen, finden Sie hier eine 91-Byte- Lösung:
Verwendung:
quelle
C 150 Bytes
Ich habe die typischen Auslassungen von Header-Dateien sowie
main()
den Rückgabetyp und die Rückgabeanweisung verwendet. Es gibt eine Warnung aus, wird jedoch ohne Probleme kompiliert. Ich habe auch einen GCC-spezifischen Trick verwendet, der Array-Deklarationen mit variablen Ausdrücken ermöglicht.Das Programm erwartet die Zeichenfolgen von der Befehlszeile und als solche sollte das Programm mit ausgeführt werden
./a.out string1 string2
.Oder besser leserlich,
quelle
Mathematica, 51 Bytes
Nimmt die Eingabe als Array von zwei Zeichen-Arrays entgegen, wobei die Ausgabe im gleichen Format erfolgt. Die Funktion erstellt einfach das neue Array mit einer (mod 2) -Operation.
quelle
QBasic 4.5, 172 Bytes
Autsch, dieser wird mit dem alten QBasic schmerzhaft ...
Witzige Tatsache: Mit
DEFSTR
mehr Bytes gespart, als es kostet, weil ich jetztA
anstelle von verwenden könntea$
.quelle
QBIC , 112 Bytes
QBIC kann einen Großteil der QBasic-Boilerplate rationalisieren, aber die Hauptmaschine
MID$
muss noch in QBasic erstellt werden, da QBIC keine Teilzeichenfolgenfunktion besitzt. Trotzdem spart mir 60 Bytes.quelle
MIND$
=>MIN$
im Text.Java, 68 Bytes
Ungolfed und Prüfung
quelle
APL, 12
Erklärung: {...} definiert eine Funktion, ⍵ ist das richtige Argument. Der Take (↑) erstellt eine Matrix aus den beiden Strings und dreht dann jede Spalte (⊖) n-mal, wobei n der Teil in Klammern (⍳⍴⊃⍵) ist. Das ist definiert als das Jota der Länge des ersten Arguments. (Beispiel: Länge = 5 ==> 1 2 3 4 5). Die erste Spalte wird also einmal gedreht, die zweite wird zweimal gedreht (um zu den ursprünglichen Positionen zurückzukehren), die dritte Spalte wird dreimal gedreht usw.
Probieren Sie es bei tryapl.org
quelle