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:

  1. Die Interpunktion ist definiert, um in das Wort einbezogen zu werden, das dem am nächsten kommt.
  2. Die Mitte eines Wortes wird als Decke definiert ((Strlen (Wort) +1)/2).
  3. Whitespace wird ignoriert (oder zusammengebrochen).
  4. 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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top