質問

以下に示したサンプルの入力と出力に従って、任意のプレーンテキストを対応する暗号文に変換するプログラムの可能な限り短いソースコードで答えてください。最小CPU時間または最小メモリ使用量のボーナスポイント*。

例1:

平文:素早い茶色のキツネが怠zyな犬を飛び越えます。 Supercalifragilisticexpialidocious!

暗号文: eTh kiquc nobrw xfo smjup rvoe eth yalz .odg!uioiapeislgriarpSueclfaiitcxildcos

例2:

プレーンテキスト: 123 1234 12345 123456 1234567 12345678 123456789

暗号文: 312 4213 53124 642135 7531246 86421357 975312468

ルール:

  1. 句読点は、最も近い単語に含まれるように定義されています。
  2. 単語の中心はceiling((strlen(word)+1)/ 2)と定義されています。
  3. 空白は無視されます(または折りたたまれます)。
  4. 奇数語が最初に右に移動します。単語も最初に左に移動します。

これは、他のすべての文字を逆方向(単語の末尾から開始)に読み取り、残りの文字を順方向に読み取るものと考えることができます。 Corporation = <!> gt; XoXpXrXtXoX = <!> gt; niaorCoprto。

私の説明の矛盾を指摘してくれた人々に感謝します。これはあなたの多くを間違った道に導きました。ルール#4は事態を解決するはずです。

*ジェフアトウッドがそうすることを決めた場合にのみ、ボーナスポイントが与えられます。私は彼に確認していないので、チャンスはわずかです。ごめんなさい。

役に立ちましたか?

解決

Python、50文字

iの入力用:

' '.join(x[::-2]+x[len(x)%2::2]for x in i.split())

独自のIOを処理する代替バージョン:

print ' '.join(x[::-2]+x[len(x)%2::2]for x in raw_input().split())

空白を含む場合、合計66文字。 (技術的には、コードの評価値がデフォルトで出力として表示されるため、コマンドラインから実行する場合はprintを省略できます。)


reduceを使用した代替バージョン:

' '.join(reduce(lambda x,y:y+x[::-1],x) for x in i.split())

59文字。

<=>:

の入力のオリジナルバージョン(偶数と奇数の両方が最初に右に移動します)
' '.join(x[::2][::-1]+x[1::2]for x in i.split())

空白を含む48文字。

(もう少し長いですが)もう少し効率的な別の代替バージョン:

' '.join(x[len(x)%2-2::-2]+x[1::2]for x in i.split())

(53文字)

他のヒント

J 、58文字

>,&.>/({~(,~(>:@+:@i.@-@<.,+:@i.@>.)@-:)@<:@#)&.><;.2,&' '

Haskell 、64文字

unwords.map(map snd.sort.zip(zipWith(*)[0..]$cycle[-1,1])).words

さて、大丈夫、必要な<!> quot; import List <!> quot;を追加すると76。

Python-69文字

(空白および改行を含む)

これはすべてのI / Oを処理します。

for w in raw_input().split():
 o=""
 for c in w:o=c+o[::-1]
 print o,

Perl、78文字

$_の入力用。それが受け入れられない場合は、先頭の$_=<>;または$_=$s;に6文字を追加します。改行は読みやすくするためのものです。

for(split){$i=length;print substr$_,$i--,1,''while$i-->0;
print"$_ ";}print $/

C、140文字

適切なフォーマット:

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(' ');
  }
}

圧縮:

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文字関数、147文字関数プログラム

Luaはコードゴルフで十分な愛を獲得していません-function / endif / then / <pre></pre>などの長いキーワードがある場合、短いプログラムを書くのは難しいかもしれませんなど。

まず、説明付きの冗長な方法で関数を記述し、次に、圧縮されたスタンドアロン関数として書き直し、コマンドラインで指定された single 引数でその関数を呼び出します。

MarkdownはLuaをフォーマットするという恐ろしい仕事をするため、<=>タグでコードをフォーマットする必要がありました。

技術的には、関数をインライン化することで実行中のプログラムを小さくすることができますが、このようにモジュール化されています:

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

出力:

$ lua insideout.lua 'The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!'
eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos

私はまだLuaでかなり新しいので、もしあればもっと短い解決策を見たいです。


stdinへのすべての引数の最小暗号化のために、111文字を実行できます:

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

ただし、このアプローチでは、他のソリューションのように末尾のスペースが出力されます。

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文字。

TCL

125文字

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

Bash -133、入力が$ w変数にあると仮定

かわいい

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

圧縮

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

わかりました。したがって、後続のスペースが出力されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top