문제

아래에 제공 한 샘플 입력 및 출력에 따라 임의의 일반 텍스트를 해당 암호 텍스트로 변환하는 프로그램에 대한 최대 가능한 소스 코드로 답변하십시오. 보너스 포인트* 최소 CPU 시간 또는 사용 된 메모리의 최소 금액.

Example 1:

일반 텍스트: 빠른 갈색 여우가 게으른 개 위로 뛰어 들었습니다. Supercalifragilisticexpialidocious!

암호 텍스트 : eth kiquc nobrw xfo smjup rvoe eth yalz .odg! uioiapeislgriarpsueclfaiitcxildcos

Example 2:

일반 텍스트: 123 1234 12345 123456 1234567 12345678 123456789

암호 텍스트 : 312 4213 53124 642135 7531246 86421357 975312468

규칙 :

  1. 구두점은 가장 가까운 단어에 포함되도록 정의됩니다.
  2. 단어의 중심은 천장으로 정의됩니다 ((strlen (Word) +1)/2).
  3. 공백은 무시 (또는 붕괴)됩니다.
  4. 이상한 단어가 오른쪽으로 먼저 움직입니다. 단어조차도 먼저 왼쪽으로 이동합니다.

당신은 그것을 다른 모든 캐릭터를 뒤로 읽는 것으로 생각할 수 있으며 (단어의 끝에서 시작) 나머지 캐릭터가 앞으로 나아갈 수 있습니다. Corporation => xoxpxrxtxox => niaorcoprto.

내 설명에서 불일치를 지적한 사람들에게 감사합니다. 이것은 많은 사람들을 잘못된 길로 인도했습니다. 규칙 #4는 상황을 정리해야합니다.

*보너스 포인트는 Jeff Atwood가 그렇게하기로 결정한 경우에만 수여됩니다. 내가 그와 확인하지 않았기 때문에 기회는 얇습니다. 죄송합니다.

도움이 되었습니까?

해결책

파이썬, 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 자.

입력을 위해 원본 버전 (짝수와 홀수가 우선) i:

' '.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 자)

다른 팁

제이, 58 자

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

Haskell, 64 자

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

글쎄, 알았어, 76 당신이 필수를 추가한다면 "import List".

파이썬 -69 숯

(공백 및 라인 브레이크 포함)

이것은 모든 I/O를 처리합니다.

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

Perl, 78 자

입력을 위해 $_. 허용되지 않는 경우 6자를 추가하십시오. $_=<>; 또는 $_=$s; 처음에. Newline은 가독성만을위한 것입니다.

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

루아

130 Char 기능, 147 Char 기능 프로그램

Lua는 코드 골프에서 충분한 사랑을 얻지 못합니다. function/end, if/then/end, 등.

먼저 설명과 함께 장점으로 함수를 작성한 다음 압축 된 독립형 함수로 다시 작성 한 다음 해당 기능을 하나의 명령 줄에 지정된 인수.

코드를 함께 포맷해야했습니다 <pre></pre> 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에 대한 모든 args에 대한 최소한의 암호를 위해, 우리는 111 Chars를 수행 할 수 있습니다.

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, Whitespace를 포함한 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

세게 때리다 -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