Ot Wes Thi Bist uf Tomis


36

나는이 단순한 암호를 좋아한다. 인간이 읽을 수없는 단어를 읽고 그 차이를 메우는 것은 너무 재미있다.

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

규칙은 매우 간단합니다.

  • 일부 텍스트를 입력으로 허용하십시오 (아스키 문자, 대문자 / 소문자 및 문장 부호).
  • 각 모음마다 다음 모음으로 돌리거나 처음으로 돌아갑니다.
    • a => 전자
    • e => 나는
    • 나는 => o
    • o => u
    • u => a
  • 대문자 모음은 대문자를 유지하고 소문자 모음은 소문자를 유지합니다.
  • 이러한 변환 후 텍스트를 출력하십시오.
  • 악센트를 지원할 필요가 없습니다.
  • 다른 모든 문자는 변경되지 않아야합니다.
  • 가장 적은 바이트 수로 시도하십시오.
  • 당신이 좋아하는 오래된 언어.

테스트 사례

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.

아웃:

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

에서:

The quick brown fox jumps over the lazy dog.

아웃:

Thi qaock bruwn fux jamps uvir thi lezy dug.

에서:

Home is where the heart is.

아웃:

Humi os whiri thi hiert os.

에서:

Boaty McBoatface

아웃:

Buety McBuetfeci

에서:

AEIOUaeiou

아웃:

EIOUAeioua

에서:

Programming Puzzles And Code Golf

아웃:

Prugremmong Pazzlis End Cudi Gulf


4
흠. 올드 영어?
iammax

10
베오 울프보다 여전히 읽기 쉽다.
Smeato

4
키위 번역기 같아
Magoo

1
암호가“ivol”일 때“악”이 효과적으로 같은 방식으로 발음되는 것을 좋아합니다.
Enrico Borba

답변:



22

MS-SQL, 51 바이트

SQL 2017 이상에서 작동합니다.

SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

새로운 기능 TRANSLATE은 개별 문자 교체를 수행하므로이 과제에 가장 적합합니다.

입력은 기존의 테이블을 통해입니다 t varchar 열을 가진 V , 우리의 IO의 규칙에 따라 .

이 경우, 대소 문자 구분 서버에서 실행하거나 키워드 (문자 총계에 포함되지 않음)를 사용하여 대소 문자 구분 데이터 정렬을 사용하여 테이블을 작성해야합니다 COLLATE.

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

편집 : SSMS 결과 "텍스트 결과"창에 결과를 반환 할 때 위의 긴 따옴표를 잘라낼 수 있습니다. 이것은 내 프로그램의 버그가 아니라 클라이언트 설정 입니다.

수정하려면 Tools > Options > Query Results > SQL Server > Results to Text"각 열에 표시되는 최대 문자 수" 로 이동 하십시오.


1
나는 SQL이 이것에 대해 경쟁에 가깝다 는 사실에 정말로 충격을 받았다 . 또한 멋진 기능입니다! 알려 주셔서 감사합니다 :)
Nic Hartley

@NicHartley 네, 각 버전마다 몇 가지 유용한 기능을 추가하는 것 같습니다. 예를 들어 문자열에서 모든 숫자를 제거하려면 REPLACE몇 가지 트릭을 사용 하여 중첩 할 수 있습니다 REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x',''). 여전히 길지만 중첩 된 10 개보다 훨씬 짧습니다 REPLACE.
BradC


14

하스켈 , 52 바이트

(a:b)!c|a/=c=b!c|1>0=b!!0
a!b=b
map("aeiouaAEIOUA"!)

온라인으로 사용해보십시오!

Lynn !!0은보다 짧은 것을 지적하여 2 바이트를 절약했습니다 head.

설명

Haskell로 코드를 작성하지 않은 경우 아마도 지겹게 보일 것입니다. 먼저 풀고 나서 분해하십시오 :

(a:b)!c
 |   a/=c   = b!c
 |otherwise = b!!0
a!b=b
map("aeiouaAEIOUA"!)

먼저 !문자열 s과 문자를 받는 함수가 있습니다 c. 첫 번째 패턴 일치 캐치는 문자열이 비어 있지 않은 경우 입력을 받아들입니다. 문자열이 비어 있지 않으면 첫 번째 문자를와 비교합니다 c. 첫 번째 문자가 같지 않으면 c우리는 그것을 던지고 !나머지 문자열과로 다시 호출 합니다 c. 같으면 문자열의 두 번째 문자를 반환합니다.

다음 패턴 일치는 다른 모든 경우, 즉 문자열이 비어있는 경우 문자열을 잡습니다. 이 경우 우리는 단지을 반환 c합니다.

이 함수는 모두 문자 c와 문자열 s을 사용하여 cin 의 첫 번째 문자를 반환합니다 s. 이것을 전달하면 aeiouaAEIOUA단일 문자에서 암호를 수행합니다. 전체 기능을 사용하려면 문자열 전체에 이것을 매핑해야합니다.


12

망막 ,10 9 8 바이트

T`uo`vVA

온라인으로 사용해보십시오!

Neil 덕분에 1 바이트를 절약했습니다! 그리고 마틴 ​​덕분에 또 다른 바이트!

레티 나의 새로운 버전에는 모음 클래스가있어 결과가 조금 짧아집니다. 음역은 또한 "다른"클래스를 사용합니다. 소위 to"aeiouAEIOUA"와 같은 수준의 외모 동안 from"uaeiouAEIOUA"와 같은 수준의 외모

이미 매핑 된 이후 로 두 번째 u매핑 이 수행되지 않으므로 아무런 문제가 발생하지 않습니다 .Aua


9 바이트 : T`_o`uvUV.
Neil

이것은 매우 짧은 대답입니다!
AJFaraday

@ 닐 영리한 감사합니다! 나는 _from 세트를 넣는 것이 문자 그대로 취급 할 것이라고 생각 했지만 그렇게하지 않는 것처럼 보입니다.
FryAmTheEggman

3
하나 더 면도 할 수는 있지만 불행히도 Stax를 묶을 수없는 것 같습니다 : tio.run/##HYnBDoIwEAXv/…
Martin Ender

@MartinEnder 감사합니다! 그것은 영리한 설정이며, 둘 사이를 혼합합니다. 나는 Y아직 많이 사용하지 않았으므로 내일 샷을 줄 것입니다.
FryAmTheEggman

9

Perl 5 + -p, 24 23 바이트

y;AEIOUaeiou;EIOUAeioua

온라인으로 사용해보십시오

@DomHastings 덕분에 -1 바이트


1
-p더 이상 +1로 계산되지 않습니다. 대신이 답변이 "Perl 5 + -p" 에 있다고 생각합니다 .
Outgolfer Erik

1
이것은 또한 sed에서 작동합니다
Kritixi Lithos

1
;구분자로 사용 하면 바이트를 절약 할 수 있습니다!
Dom Hastings

업데이트, 더 이상은 @Cowsquack
나우 Fouilleul

6

파이썬 3, 62 바이트

lambda x:x.translate(str.maketrans('aeiouAEIOU','eiouaEIOUA'))

str의 정적 str.maketrans메소드를 사용하여 변환 표 (사전)를 작성하십시오 . 관련 문자를 대상 문자로 번역하십시오.


이것은 어디서 I / O를 수행합니까?
reinierpost

@reinierpost 함수입니다. 입력은 x매개 변수 를 통해 이루어 집니다. 파이썬에서 람다 함수에는 return 문이 필요하지 않습니다.
mypetlion

6

C, 85 76 67 65 64 바이트

f(char*c){for(;*c;)putchar(1[index("AEIOUAaeioua",*c++)?:c-2]);}

Kevin Cruijssen 포트의 Java 답변 . 여기에서 온라인으로 사용해보십시오 .

감사 케빈 Cruijssen 9 바이트, 골프 용 크리스토프를 11 바이트로 골프과 ceilingcat 1 바이트를위한 골프.

언 골프 버전 :

f(char* c) { // function taking a char array as parameter and implicitly returning an unused int
    for(; *c ;) // loop over the input
        putchar(1 [index("AEIOUAaeioua", * c++) ?: c-2]); // find the first pointer to the current char in the vowels string, NULL if not present; if it's not NULL, print the next vowel, otherwise just print the char
}

1
gcc의 표준 확장이 아닌 것 같습니다 . 나는 PHP에서 그것을 알고 단순히 시도했다.
Christoph

1
@Christoph 나는 당신의 재귀 사용을 좋아하지만, 우리가 후행을 출력 할 수 있는지 확실하지 않습니다 \0. 또한 clang으로 컴파일하면 작동하지 않습니다 : tio.run/##S9ZNzknMS///…
OOBalance

1
@ Christoph : 정의되지 않은 동작이 어디에 있는지 궁금해서 clang 버전을 디버깅하여 더 풀었습니다. const char *res = strchr("AEIOU...", 0)문자열 리터럴에서 종결 자에 대한 포인터를 반환합니다. putchar(res[1])문자열 리터럴의 끝을지나 읽습니다. gcc를 사용하면 분명히 다른 0 바이트를 발견하고 작동하지만 clang을 사용하면 73 'I'( main'문자열 리터럴 "It was ..."에서 얻을 수 있지만 asm은 확인하지 않았습니다). 따라서 putchar0을 반환하지 않으며 *c++매핑되지 않은 페이지를 읽을 때 결국 segfault 입니다.
피터 코데

2
@PeterCordes 네 , 의심 스러워서 여기 에서 알게되었습니다 . 어쨌든 여기에 다른 2 바이트가 저장되었습니다 f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. 그게 다야 지금 생각합니다.
Christoph

1
@Rogem 덧셈의 계산 속성 때문에 a[b]==*(a+b)==*(b+a)==b[a]. 따라서1[...]==(...)[1]
천장 고양이



5

파이썬 2 , 79 68 67 바이트

@ArnoldPalmer 덕분에 -1 바이트

V='uaeiouAEIOUA'
print''.join((V[1:]+c)[V.find(c)]for c in input())

온라인으로 사용해보십시오!


67 바이트 . 또한 알림이 넘친 경우 죄송합니다. 한동안 코멘트를 게시하지 않았으며 어떻게해야하는지 잊어 버렸습니다.
아놀드 팔머

@ArnoldPalmer 감사합니다! 괜찮아, 나는 멀리 있었고 그들은 모두 나를 그리워했다 : D
Dead Possum



4

Pyth, 17 바이트

em=.rQdrB"aeiou"1

여기 사용해보십시오

em=.rQdrB"aeiou"1
 m                  For each string...
       rB"aeiou"1   ... in ['aeiou', 'AEIOU']...
  =.rQd             ... cyclically rotate the characters in the input.
e                   Take the last.


4

자바 10, 97 87 바이트

s->{for(var c:s){var t="AEIOUAaeioua"+c+c;System.out.print(t.charAt(t.indexOf(c)+1));}}

@Arnauld 의 JavaScript 답변 (60 바이트 버전) 에서 영감을 얻은 후 -10 바이트 .

온라인으로 사용해보십시오.

설명:

s->{                         // Method with character-array parameter and no return-type
  for(var c:s){              //  Loop over the input characters
    var t="AEIOUAaeioua"     //  Temp-String containing the order of vowels 
                             //  (including additional 'A' and 'a'),
          +c+c;              //  appended with two times the current character
    System.out.print(        //  Print:
      t.charAt(              //   The character in String `t` at index:
         t.indexOf(c)+1));}} //    The (first) index of the current character in `t` + 1

4

05AB1E , 14 13 11 바이트

žMDÀ‡žMuDÀ‡

온라인으로 사용해보십시오!


1
당신은 단순히 여러 줄 문자열로 입력을 복용하여 2 바이트를 저장할 수 있으므로 필요가 없습니다 |»: 온라인으로보십시오 : 11 바이트 .
Kevin Cruijssen

@KevinCruijssen 감사합니다! 최근 05AB1E 릴리스에서 수정 된 것이 아닙니까?
Kaldo

몰라요 올해 초부터 05AB1E를 시작했습니다. 당신이 알고 싶은 경우에 기능이 추가되면 05AB1E 채팅 에서 @Adnan 에게 요청할 수 있습니다.
Kevin Cruijssen


3

APL + WIN, 55 바이트

입력 문자열에 대한 프롬프트 :

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s

3

볼거리, 38 바이트

R T W $TR(T,"AEIOUaeiou","EIOUAeioua")

유행성 이하선염은 일반적으로 캐리지 리턴을 추가하지 않습니다. 입력과 출력을 분리 해야하는 요구 사항을 보지 못했기 때문에 처음 실행하면 약간 이상하게 보입니다. 예를 들어, 마지막 테스트 사례의 출력은 다음과 같습니다.

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

캐리지 리턴을 추가하려면 다음과 같이 2 바이트를 추가하십시오.

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")

3

Vim + tpope / vim-abolish , 30 바이트

:%S/{a,e,i,o,u}/{e,i,o,u,a}/g<cr>

대체 솔루션, 30 바이트 :

Oe,i,o,u<esc>|D:%s/{a,<C-r>"}/{<C-r>",a}/g

meta 에 따르면 vim 답변은 바이트 페널티가없는 플러그인을 사용할 수 있습니다. 이것은 vim 답변이 아니라 vim + 폐지 답변입니다.


Abolish는 매우 유용한 플러그인입니다. README의이 섹션은 이 명령 ( Subvert명령)의 작동 방식을 잘 설명 합니다.


3

CJam , 29 19 바이트

q"aeioua"_eu+_1m<er

온라인으로 사용해보십시오!

@Peter Taylor 덕분에 -10 바이트

설명:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate

질문은 입력에 대해 구체적이지는 않지만 입력을하기 q보다는 사용해야한다고 생각합니다 l. 첫 번째 테스트 사례는 여러 줄로 나타납니다. 또한 당신은 줄일 수 있습니다 "eioua"_1m<. 실제로, 당신은 더 나아가 골프를 할 수 있습니다q"aeioua"_eu+_1m<er
Peter Taylor

3

오토 핫키 , 24 바이트

AuotHotkey는 대소 문자를 구분하여 자동으로 문자를 대체합니다.

a::e
e::i
i::o
o::u
u::a

2

PHP, 90 바이트

온라인으로 사용해보십시오

암호

function f($s){echo strtr($s,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));}

설명

function f($s){
 echo strtr(
       $s,                          #The string to operate
       array_combine(               #combining arrays
            str_split(UuAaEeIiOo),  #splitting this strings
            str_split(AaEeIiOoUu))
              # With array combine php creates an array like
              # ["U"=>"A", "a"=>"e"....and so on]
              # strtr can replace strings in a string, using an array with 
              # the values to replace and with what replace each value.
 );
}

php -r사용하여 실행하면 75 바이트$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));



2

PHP, 38 바이트

매우 독창적이지 않은 매우 간단한 strtr모음을 사용 하여 모음을 대체합니다.

<?=strtr($argn,aeiouAEIOU,eiouaEIOUA);

온라인으로 실행 echo '<input>' | php -nF <filename>하거나 사용해보십시오 .


입력이 사전 정의 된 변수에 할당되었다고 가정하지 argn않습니까? 그렇다면 유효하지 않습니다. 문자열을 인수로 전달하고 $argv1]대신 사용해야 합니다.
Shaggy

2
@Shaggy 아니오, -F플래그로 실행 하면 명령 행에서 입력으로 작동합니다. 로부터 옵션에 대한 PHP 워드 프로세서 : -F --process-file PHP file to execute for every input line. Added in PHP 5.어떤 사람들은 PHP가 로컬에 설치되어 있지 않은 단지 때문에 온라인 변수 정의하는 시도하고 나는 가져올 수 없습니다 -FTIO에서 작업 플래그.
Davіd

1
고마워, @David-그것은 오늘 PHP를위한 "새로운 것"입니다 :)
Shaggy

2

q / kdb +, 36 33 바이트

해결책:

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'

예 :

q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"AEIOUaeiou"
"EIOUAeioua
q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"Programming Puzzles And Code Golf"
"Prugremmong Pazzlis End Cudi Gulf"

설명:

모음 색인을 알아 내고, 다음 모음에 추가 할 모음을 추가하고 색인을 작성하십시오. 여전히이 방법이 크게 개선 될 수 있다고 생각합니다 ...

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@' / the solution
{                             }@' / apply lambda to each character of input
                            ?x    / look up x in...
          (                )      / do together
             "aeiouaAEIOUA"       / lookup list
           v:                     / save as v
        1+                        / add one
 (     )                          / do together
    2#x                           / take 2 copies of x
  v,                              / prepend v

보너스:

내 오래된 ** 36 바이트 (()) 솔루션은 꽤 멋지지만 경쟁력을 갖기 위해 목록을 내려야합니다.

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]

2

, 35 바이트

UT≔AUOIEAauoieaσF¹¹⊞υ➙§σ⊕ι§σι▷SR⟦Sυ

온라인으로 사용해보십시오!

순진한 방법.

설명:

UT                                         Set trim option to on, so output won't be a rectangle
    ≔AUOIEAauoieaσ                          Assign "AUIOEAauioea" to s
                   F¹¹                      For i (ι) from 0 to 10
                       ⊞υ                   Push to u (initially empty list)
                          ➙                 Rule of:
                            §σ⊕ι            S[i + 1]
                                 §σι         to S[i]. This is so a->A gets overwriteen by a->e
                                    ▷SR⟦Sυ  Replace input as string using u (now a list of rules)

2

PHP , 76 바이트

$s=strtr($s,array_combine(str_split("aeiouAEIOU"),str_split("eiouaEIOUA")));

확인 해봐!

이것은 PHP 에서이 작업을 수행 할 수있는 가장 짧은 시간이었습니다.

$s = //overwrite $s variable ($s should be a defined string or input)
    strtr(  //strtr replaces key => value pairs from arrays in a string
        $s, //the string we are converting
        array_combine( //create an array with key value pairs, key should be original vowel letter and value should be it's replacement
            str_split("aeiouAEIOU") //turn vowels (lower and upper) into an array
            ,str_split("eiouaEIOUA") //turn vowel replacements into an array
        )
    );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.