태그 보관물: cipher

cipher

베이비 토크 해독! W X Y Z Os의

아기가 입을 열면 횡설수설을하는 것이 아닙니다. 그들은 실제로 고도로 발전된 성인용 암호로 말하고 있습니다 …

베이비 토크 암호

아기가 말을 할 때, gogooa gagooook aagaaoooy
하나의 공백으로 구분 된 각 섹션은 문자를 나타냅니다 (위의 예는 3자를 나타냄).

섹션을 해독하려면 포함 된 As 및 Os의 수를 계산해야합니다. 그러나, 우리는 다른 모음에 인접한 것들만 계산합니다. 예를 들어, ‘gag’의 A는 계산되지 않지만 ‘gaog’의 A와 O는 모두 계산됩니다.

위의 예를 세면 다음과 같습니다.

Section    | Num Os | Num As

gogooa     | 2      | 1
gagooook   | 4      | 0
aagaaoooy  | 3      | 4

그런 다음이 값을 사용하여 입력을 Polybius 정사각형의 일반 텍스트로 변환합니다. 이것은 ‘J’를 생략하고 영어 알파벳을 5×5로 표현한 것입니다.

  0 1 2 3 4
0 A B C D E
1 F G H I K
2 L M N O P
3 Q R S T U
4 V W X Y Z

Os의 수를 열로 사용하고 As의 수를 행으로 사용하여 각 섹션이 나타내는 문자를 찾습니다.

Section    | Num Os | Num As | Character

gogooa     | 2      | 1      | (2,1) -> H
gagooook   | 4      | 0      | (4,0) -> E
aagaaoooy  | 3      | 4      | (3,4) -> Y

아기가 그냥 “HEY”라고 말한 것 같습니다.

참고 :
-문자를 나타내는 섹션에 4 개 이상의 As 또는 Os가있는 경우 4가 테이블의 최대 값이므로 엑스트라를 무시하십시오. -이 작업에서 Y는 모음이 아니며 A, E, I, O 및 U 만 있습니다.

도전

당신의 임무는 하나의 입력, 단어를 사용하여 일반 텍스트로 인쇄 하는 전체 프로그램 을 만드는 것입니다.

  • 프로그램은 대문자, 소문자 및이 둘을 혼합하여 입력 할 수 있어야합니다.
  • 입력 값에는 ASCII 알파벳 문자 (AZ 및 az) 만 포함되며, 공백은 아기 단어를 구분합니다.
  • 출력 텍스트는 언제든지 가능합니다.
  • 입력을 받아 STDIN일반 텍스트를에 인쇄 해야합니다 STDOUT. 사용하는 언어에 해당 언어가 없으면 가장 가까운 언어를 사용하십시오.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리하지만 모든 솔루션을 환영합니다.

테스트 사례

'GLOOG KAKAAOOO ARGOOO OOOOOGUGUU' -> CODE
'oaka pooopaa gaau augu' -> GOLF
'Aoao U oOOAoa oaoAoo aoAoAOa' -> NAPPY
'GUG gAGaA gOougOou' -> ALE
'OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI' -> HELLO


답변

05AB1E , 46 바이트

lð¡vyžNvyð:}ð¡D€g1›ÏJ©'a¢4‚W5*®'o¢4‚Ws\+A'j-è?

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

단계 설명

  1. 단어를 형성하기 위해 공백으로 분할
  2. 단어에서 konsonants를 공백으로 바꾸십시오
  3. 모음을 형성하기 위해 공백으로 단어를 나눕니다.
  4. 길이가 2보다 짧은 모음 그룹 제거
  5. 카운트의 최소값 (a)과 4를 얻습니다.
  6. 카운트 최소값 (o) 4
  7. 카운트 추가
  8. 알파벳 색인에서 문자를 얻습니다 ( “j”제외).

답변

펄, 82 바이트

에 +1 포함 -a

STDIN에 입력하십시오 :

perl -M5.010 baby.pl <<< "OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI"

baby.pl:

#!/usr/bin/perl -a
say map{$A=$O=$_=uc;y/AEIOU/@/c;s/(\B.|.\B)/$$1+=$$1<4/eg;(A..I,K..Z)[5*$A+$O]}@F

이것은 최근에 충분한 perl 버전을 가정 -a합니다 -n. 펄이 너무 오래된 경우 명시적인 -n옵션 을 추가해야합니다 .

또한 아기가 다음과 같은 숫자로 시작하는 일반적인 ASCII 문자열을 말할 수 없다고 가정합니다. 1 this will not work


답변

brainfuck, 656 바이트

+[[>>>,[>++++[<-------->-]]<]<<[>]<-[+[<+>>+<-]----[>>+<<----]>>+[<[-<]<[>]>>-]-<[[-]>+<]>[[-[->]<<+>]<->>>]<<<[>>>+<<<-]<<-]>>>>>[[<+>>+<-]----[>-<----]>--[----<]<[>]>[----<]<[>]>[------<]<[>]>[------<]<[>]><+>[[-]<->]>>]<<<[>->]<[<]>[>[<<<<<+>>>>>>+<-]<<<<]<[-]>>>>[<[>[>+<-]<-]>[-]->[<+>-]>>]<<<[-<----[>-<----]>[>+>+<<-]+>[<->[-]<]<[<]>[[<<<]<+>>>>[>>>]<<<-]>+>--------------[<->[-]]<[-<<<<[<<<]>+>>[>>>]>]<<<<]<[<+<+>>-]>++++[<<[->]>[<]>-]+<<[[-]++++<[-]>>]>[<]<<[>+<-]>>+>->[>+>+<<-]<++++[>>[-<]<[>]<-]>>[[-]++++>[-]]<<<[>]<->>>>[<+>-]<[<<<+>>>-]<<<<[>+++++<-]>[>+>+<<-]<++++++++[>>[-<]<[>]<-]>>[[-]>+<]----[>+<----]>++.[-]+>>>,[<++++[>--------<-]]>]

이것은 두 시간을 죽이는 아주 좋은 방법이었습니다.

8 비트 랩핑 셀을 사용하는 brainfuck 인터프리터가 필요합니다 ,. stdin이 비어있을 때 사용하면 셀 0에서 왼쪽으로 이동하여 0을 리턴합니다 . 내 경험상 가장 일반적인 설정입니다.

이 프로그램은 Y를 모음으로 간주하지 않지만 OP가 원하면 쉽게 고칠 수 있습니다.

이 글을 작성하는 것은 어려운 일처럼 보이지만 언어에 익숙하다면 코드에 놀랍거나 새로운 것이 없습니다. 표준 brainfuck 전술 : 입력을 읽으십시오. 그러나 각 바이트 사이에 빈 셀 몇 개를 남겨두고 빈 셀을 사용하여 입력에 대한 데이터를 저장하고 저장된 데이터를 사용하여 변환 방법을 결정하고 끝에 무언가를 뱉어 내십시오. . 이 경우 입력을 가져 와서 모두 대문자로 설정하고 어떤 셀이 모음인지 파악하고 , 모음 옆에 있는 셀을 결정하기 위해 사용 후 해당 정보를 버리고 모음 옆에없는 모든 것을 일부로 설정하십시오 결코 관련되지 않을 가치가 있으므로 나중에 방해가되지 않으며 기본적으로 완료됩니다. 거기에서 As와 Os 를 세고 곱하면됩니다.As를 5로 지정하고 s의 수를 추가하고 OJ와 출력을 피하기 위해 8보다 큰 임의의 경우. 한 번에 전체 입력을 취하는 것이 아니라 한 번에 한 단어 씩 처리하기로 선택했기 때문에 stdin을 읽는 코드 부분을 0 또는 32에서 중단하도록 설정해야했지만 너무 큰 문제는 아닙니다. (조건부에서 뺄셈을 32만큼 줄 바꿈하면 값이 이미 0 인 경우 발생하지 않으며 나중에 놓친 지침 <이나 >명령 을 수정하십시오 ).

나는 실제 설명이 아닌 내 생각을 똑바로 유지하기 위해 주로 썼기 때문에 그것이 얼마나 도움이 될지 모르겠지만, 여기 내 의견과 원래 들여 쓰기가있는 코드가 있습니다.

+[[>>>,[>++++[<-------->-]]<]get an entire word of input
                            each character lowered by 32
                            two empty cells between characters
                            stops when reaching a space or null byte

any lowercase letters have become uppercase; anything with a value below 65 used
to be an uppercase character; fix it

<<[>]<-[+                for each character until hitting 1:
  [<+>>+<-]              make a backup
  subtract 64 from the character but stop if it hits 0
  ----[>>+<<----]>>+     generate the number 64
  [                      64 times:
    <[                     if the character is not 0:
      -                    subtract 1
      <                    go to a guaranteed 0 cell to break the loop
    ]

    we're either on the character or to the left of it; sync up
    <[>]

  >>-]
  -<[[-]>+<]>            logical NOT of character

  [                      if logical NOT returns true:
    [-[->]<<+>]<-          add 32 to backup of character
  >>>]

  <<<[>>>+<<<-]          move copy over to make room
<<-]
  >>>>>[                 for each character:
  [<+>>+<-]              make copies
  ----[>-<----]>--       check if it's A
  [----<]<[>]>           check if it's E
  [----<]<[>]>           check if it's I
  [------<]<[>]>         check if it's O
  [------<]<[>]>         check if it's U

  IF YOU NEED TO ADD Y; THIS IS THE PLACE

  <+>[[-]<->]            logical NOT to complete vowel check
>>]

<<<[                if the last char is a vowel; prevent a side effect
  >->
]

<[<]>[                 for each character:
  >[                     if it's a vowel:
    <<<<<+>>>>>>+<-          leave a flag to the left and right to show that a
  ]                          vowel is adjacent
<<<<]

<[-]>                  clean up a side effect left behind if first char is vowel

>>>[                   for each char:
  <[                     if it's adjacent to a vowel:
    >[>+<-]<-              move it to the side
  ]
  >[-]-                otherwise; destroy it
  >[<+>-]              move backup over if it exists (subtracting 1)
>>]

all characters without a vowel beside them have been set to 255
all characters with a vowel beside them are set to itself minus 1

notable charaters are: 'A' minus 1 = 64
                       'O' minus 1 = 78

<<<[                 for each character:
  -<----[>-<----]      subtract 64
  >[>+>+<<-]           make a copy
  +>[<->[-]<]<[<]>     logical NOT

  [[<<<]<+>>>>[>>>]<<<-] if NOT returns true; record an A

  >+>--------------  subtract 14 from backup

  [<->[-]]<          logical NOT
  [-<<<<[<<<]>+>>[>>>]>] if NOT returns true; record an O
<<<<]


<[<+<+>>-]           make a backup of A count
>++++[<<[->]>[<]>-]  subtract 4 but don't go below 0
+<<[                   if the char was greater than 3:
  [-]++++<[-]>>          put 4 there
]
>[<]                  resynchronise
<<[>+<-]              if there were fewer than 4 As put the number back

same thing but for the O count

>>+>->[>+>+<<-]       make a backup of O count
<++++[>>[-<]<[>]<-]   subtract 4 but don't go below 0
>>[                     if the char was greater than 3:
  [-]++++>[-]             put 4 there
]
<<<[>]                resynchronise
<->>>>[<+>-]          if there were fewer than 4 Os put the number back

<[<<<+>>>-]<<<<[>+++++<-] A*5 plus B = index of character to output

>[>+>+<<-]            make a backup
<++++++++[>>[-<]<[>]<-] subtract 8 but don't go below 0
>>[[-]>+<]            if the result is nonzero it is late enough in the alphabet
                      that it must be increased by 1 to exclude J as a possible
                      output
----[>+<----]>++      add 65 to make it a letter
.[-]+>>>,             output and get new input
[<++++[>--------<-]]> sub 32 if not 0
]

답변

자바 스크립트 (ES6), 145 바이트

alert(prompt().replace(/\S+ ?/g,x=>(g=r=>(q=(x.match(/[aeiou]{2,}/gi)+"").split(r).length-1)>4?4:q,(g(/a/i)*5+g(/o/i)+10)*20/19|0).toString(36)))

각 단어 (및 다음 공백)를 해당 문자로 바꿉니다.

s.split` `.map().join`` 3 바이트 더 깁니다 :

alert(prompt().split` `.map(x=>(g=r=>(q=(x.match(/[aeiou]{2,}/gi)+"").split(r).length-1)>4?4:q,(g(/a/i)*5+g(/o/i)+10)*20/19|0).toString(36)).join``)

답변

Perl, 159 +1 = 160 바이트

-n 플래그의 경우 +1 바이트 공백은 코드의 일부가 아니며 읽기 쉽도록 제공됩니다.

for(split$",lc){
    $b=0;
    @a=sort/([ao](?=[aeiou])|(?<=[aeiou])[ao])/g;
    $b++until$b>$#a||$a[$b]eq o;
    $c=($d=$#a-$b+1)>4?4:$d;
    $b=$b>4?4:$b;
    print+(a..i,k..z)[5*$b+$c];
}

이 코드는 입력을 공백으로 나누고 진행하기 전에 각 단어를 소문자로 변환합니다. 정규 표현식은 다른 모음이 뒤에 오거나 모음이 앞에 오는 모든 a 또는 o 모음을 찾아서 시작 부분에 a, 끝 부분에 o를 정렬 한 다음 첫 번째 ‘o’의 색인을 찾습니다. 일치하는 나머지 수 (일명 ‘a ‘s)가 4보다 크면 약 4a를 신경 쓰고 4o를 초과하면 약 4o를 돌립니다. 그런 다음 적절한 글자를 행렬에서 꺼내서 인쇄 한 다음 다음 단어로 옮깁니다.


답변

Brainfuck, 283 바이트

,[[<[>-[>>>-<<<----[----[>+<------[>-<------[<[-]>>>>[-]->>[-]<<<<<-]]]]]>[>>>>+
<<<<-]>>+<[>[>+<-]>>[>+<-]<<<-]<,<<[>>>+<<<-]>]>+[<+>[-<<]>[[-]+++++[<++++++>-]<
+<]>>>]<]>>[-]>+>>+[[-]>[<+>-[<+>-[<+>-[<+>[-]]]]]<<<]>->[>+<-[[>+<-]>>+>]>[+>--
--[->]]]+[-<+]>>+++++++++++++[>+++++<-]>.,]

형식화 :

,
[
  [
    <
    [
      >-
      [
        not a
        >>>-<<<
        ----
        [
          not e
          ----
          [
            not i
            >+<
            ------
            [
              not o
              >-<
              ------
              [
                consonant
                <[-]>
                >>>[-]->>[-]<<<<<-
              ]
            ]
          ]
        ]
      ]
      >[>>>>+<<<<-]> >+<
      [
        prev was vowel
        >[>+<-]>>[>+<-]<<<-
      ]
      <,<<[>>>+<<<-]
      >
    ]
    >+
    [
      <+>[-<<]
      >[[-]+++++[<++++++>-]<+<]
      >>>
    ]
    <
  ]
  >>[-]>+>>+
  [
    [-]
    >[<+>-[<+>-[<+>-[<+>[-]]]]]<
    <<
  ]
  >->
  [
    >+<-
    [
      [>+<-]
      >>+>
    ]
    >
    [
      +>----[->]
    ]
  ]
  +[-<+]
  >>+++++++++++++[>+++++<-]
  >.,
]

이것은 입력에서 후행 줄 바꿈과 함께 또는없이 작동합니다.

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

각 문자는 mod 32로 처리됩니다 (mod 작업을 구현하는 코드가 프로그램에서 한 번만 발생하도록 제어 흐름으로). 이를 통해 대소 문자를 구분하지 않고 공백 문자와 EOF를 단일 케이스로 축소 할 수 있습니다. 후행 줄 바꿈은과 동일하게 취급 J되며 출력에는 영향을 미치지 않습니다.

메모리 레이아웃 스케치 :

0 x C c y a A b B

여기서 c입력 문자이고, C숯 개조 32, x그것이 모음인지하고, y이전 문자가 모음이었다 여부 AB(다음 모음에) 유효의 개수이다 ao문자는 각각와 ab각 버퍼 것을 인접한 모음이 있는지 여부에 따라 복사하거나 지 웁니다.

공백이나 EOF에 도달하면 4보다 큰 카운트를 줄이고 문자를 건너 뛰기 위해 저글링을 수행 J한 다음 디코딩 된 문자가 인쇄됩니다.


답변

PHP, 163 바이트

<?php for(;$c=preg_replace('/(?<![AEIOU]).(?![AEIOU])/','',strtoupper($argv[++$i]));$j=min($d[79],4)+5*min($d[65],4),print range(A,Z)[$j+($j>8)])$d=count_chars($c);

더 읽기 쉬운 버전 :

<?php
for (
    ;
    $c = preg_replace(
        '/(?<![AEIOU]).(?![AEIOU])/',
        '',
        strtoupper($argv[++$i])
    );
    $j = min($d[79], 4) + 5 * min($d[65], 4),
    print range(A, Z)[$j + ($j > 8)]
)
    $d = count_chars($c);

테스트 :

$ php babytalk.php GLOOG KAKAAOOO ARGOOO OOOOOGUGUU
CODE
$ php babytalk.php oaka pooopaa gaau augu
GOLF
$ php babytalk.php Aoao U oOOAoa oaoAoo aoAoAOa
NAPPY
$ php babytalk.php GUG gAGaA gOougOou
ALE
$ php babytalk.php OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI
HELLO