Code Golf - Wort Scrambler
-
07-07-2019 - |
Frage
Bitte beantworten Sie mit dem kürzest möglichen Quellcode für ein Programm, das einen beliebigen Klartext in den entsprechenden Chiffretext umwandelt, der nach dem unten angegebenen Beispieleingang und Ausgang nachgegeben wird. Bonuspunkte* für die geringste CPU -Zeit oder die geringste Menge an Speicher.
Beispiel 1:
Klartext: Der schnelle braune Fuchs springt über den faulen Hund. Superkalifragilistischexpiallegetisch!
Geheimtext: Eth Kiquc Nobrw xfo smjup rvoe eth yalz .odg!
Beispiel 2:
Klartext: 123 1234 12345 123456 1234567 12345678 123456789
Geheimtext: 312 4213 53124 642135 7531246 86421357 975312468
Regeln:
- Die Interpunktion ist definiert, um in das Wort einbezogen zu werden, das dem am nächsten kommt.
- Die Mitte eines Wortes wird als Decke definiert ((Strlen (Wort) +1)/2).
- Whitespace wird ignoriert (oder zusammengebrochen).
- Odd Wörter bewegen sich zuerst nach rechts. Sogar Wörter bewegen sich zuerst nach links.
Sie können es als das Lesen jedes anderen Charakters vorwärts betrachten (ab dem Ende des Wortes), gefolgt von den verbleibenden Charakteren. Corporation => xoxpxRXTXOX => niaorcopro.
Vielen Dank an diejenigen, die auf die Inkonsistenz in meiner Beschreibung hingewiesen haben. Dies hat viele von Ihnen den falschen Weg geführt, für den ich mich entschuldige. Regel 4 sollte die Dinge aufklären.
*Bonuspunkte werden nur vergeben, wenn Jeff Atwood dazu beschließt. Da ich nicht mit ihm überprüft habe, sind die Chancen gering. Es tut uns leid.
Lösung
Python, 50 Zeichen
Für Eingabe in i
:
' '.join(x[::-2]+x[len(x)%2::2]for x in i.split())
Alternative Version, die seinen eigenen IO verarbeitet:
print ' '.join(x[::-2]+x[len(x)%2::2]for x in raw_input().split())
Insgesamt 66 Zeichen, wenn sie Whitespace enthalten. (Technisch gesehen die print
Es könnte weggelassen werden, wenn Sie aus einer Befehlszeile ausgeführt werden, da der ausgewertete Wert des Codes standardmäßig als Ausgabe angezeigt wird.)
Alternative Version verwenden reduce
:
' '.join(reduce(lambda x,y:y+x[::-1],x) for x in i.split())
59 Zeichen.
Originalversion (sowohl gleich und ungerade Gehen Sie zuerst nach rechts) für eine Eingabe in i
:
' '.join(x[::2][::-1]+x[1::2]for x in i.split())
48 Zeichen einschließlich Whitespace.
Eine andere alternative Version, die (zwar etwas länger) etwas effizienter ist:
' '.join(x[len(x)%2-2::-2]+x[1::2]for x in i.split())
(53 Zeichen)
Andere Tipps
J, 58 Zeichen
>,&.>/({~(,~(>:@+:@i.@-@<.,+:@i.@>.)@-:)@<:@#)&.><;.2,&' '
Haskell, 64 Zeichen
unwords.map(map snd.sort.zip(zipWith(*)[0..]$cycle[-1,1])).words
Okay, 76, wenn Sie die erforderliche Anforderungen hinzufügen "import List
".
Python - 69 Chars
(einschließlich Whitespace und LineBreaks)
Dies gilt mit allen I/O.
for w in raw_input().split():
o=""
for c in w:o=c+o[::-1]
print o,
Perl, 78 Zeichen
Für Eingabe in $_
. Wenn das nicht akzeptabel ist, fügen Sie sechs Zeichen für beide hinzu $_=<>;
oder $_=$s;
am Anfang. Die Newline dient nur zur Lesbarkeit.
for(split){$i=length;print substr$_,$i--,1,''while$i-->0;
print"$_ ";}print $/
C, 140 Zeichen
Schön formatiert:
main(c, v)
char **v;
{
for( ; *++v; )
{
char *e = *v + strlen(*v), *x;
for(x = e-1; x >= *v; x -= 2)
putchar(*x);
for(x = *v + (x < *v-1); x < e; x += 2)
putchar(*x);
putchar(' ');
}
}
Komprimiert:
main(c,v)char**v;{for(;*++v;){char*e=*v+strlen(*v),*x;for(x=e-1;x>=*v;x-=2)putchar(*x);for(x=*v+(x<*v-1);x<e;x+=2)putchar(*x);putchar(32);}}
Lua
130 char function, 147 char funktionierende Programm
Lua bekommt nicht genug Liebe im Code -Golf - vielleicht, weil es schwierig ist, ein kurzes Programm zu schreiben, wenn Sie lange Keywords wie haben function
/end
, if
/then
/end
, etc.
Zuerst schreibe ich die Funktion ausführlich mit Erklärungen, dann schreibe ich sie als komprimierte eigenständige Funktion neu, dann nenne ich diese Funktion auf dem Single Argument in der Befehlszeile angegeben.
Ich musste den Code mit formatieren <pre></pre>
Tags, weil Markdown eine schreckliche Aufgabe der Formatierung von Lua leistet.
Technisch gesehen könnten Sie ein kleineres laufendes Programm erhalten, indem Sie die Funktion einbinden, aber es ist modularer auf diese Weise :)
t = "The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!" T = t:gsub("%S+", -- for each word in t... function(w) -- argument: current word in t W = "" -- initialize new Word for i = 1,#w do -- iterate over each character in word c = w:sub(i,i) -- extract current character -- determine whether letter goes on right or left end W = (#w % 2 ~= i % 2) and W .. c or c .. W end return W -- swap word in t with inverted Word end) -- code-golf unit test assert(T == "eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos") -- need to assign to a variable and return it, -- because gsub returns a pair and we only want the first element f=function(s)c=s:gsub("%S+",function(w)W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end return W end)return c end -- 1 2 3 4 5 6 7 8 9 10 11 12 13 --34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 -- 130 chars, compressed and written as a proper function print(f(arg[1])) --34567890123456 -- 16 (+1 whitespace needed) chars to make it a functioning Lua program, -- operating on command line argument
Ausgabe:
$ lua insideout.lua 'The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!' eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos
Ich bin immer noch ziemlich neu in Lua, also würde ich gerne eine kürzere Lösung sehen, wenn es eine gibt.
Für eine minimale Chiffre für alle Argumente nach Stdin können wir 111 Chars machen:
for _,w in ipairs(arg)do W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end io.write(W ..' ')end
Dieser Ansatz gibt jedoch einen nachfolgenden Raum wie einige der anderen Lösungen aus.
Für einen Eingang in s
:
f=lambda t,r="":t and f(t[1:],len(t)&1and t[0]+r or r+t[0])or r
" ".join(map(f,s.split()))
Python, 90 Zeichen einschließlich Whitespace.
Tcl
125 Zeichen
set s set f foreach l {}
$f w [gets stdin] {$s r {}
$f c [split $w {}] {$s r $c[string reverse $r]}
$s l "$l $r"}
puts $l
Verprügeln - 133, unter der Annahme, dass die Eingabe in $ W Variable ist
Hübsch
for x in $w; do
z="";
for l in `echo $x|sed 's/\(.\)/ \1/g'`; do
if ((${#z}%2)); then
z=$z$l;
else
z=$l$z;
fi;
done;
echo -n "$z ";
done;
echo
Komprimiert
for x in $w;do z="";for l in `echo $x|sed 's/\(.\)/ \1/g'`;do if ((${#z}%2));then z=$z$l;else z=$l$z;fi;done;echo -n "$z ";done;echo
Ok, es gibt also einen nachverfolgenden Platz aus.