아기가 입을 열면 횡설수설을하는 것이 아닙니다. 그들은 실제로 고도로 발전된 성인용 암호로 말하고 있습니다 …
베이비 토크 암호
아기가 말을 할 때, 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
. 사용하는 언어에 해당 언어가 없으면 가장 가까운 언어를 사용하십시오. - 이것은 code-golf 이므로 바이트 단위의 가장 짧은 코드가 승리하지만 모든 솔루션을 환영합니다.
테스트 사례
'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-è?
단계 설명
- 단어를 형성하기 위해 공백으로 분할
- 단어에서 konsonants를 공백으로 바꾸십시오
- 모음을 형성하기 위해 공백으로 단어를 나눕니다.
- 길이가 2보다 짧은 모음 그룹 제거
- 카운트의 최소값 (a)과 4를 얻습니다.
- 카운트 최소값 (o) 4
- 카운트 추가
- 알파벳 색인에서 문자를 얻습니다 ( “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 전술 : 입력을 읽으십시오. 그러나 각 바이트 사이에 빈 셀 몇 개를 남겨두고 빈 셀을 사용하여 입력에 대한 데이터를 저장하고 저장된 데이터를 사용하여 변환 방법을 결정하고 끝에 무언가를 뱉어 내십시오. . 이 경우 입력을 가져 와서 모두 대문자로 설정하고 어떤 셀이 모음인지 파악하고 , 모음 옆에 있는 셀을 결정하기 위해 사용 후 해당 정보를 버리고 모음 옆에없는 모든 것을 일부로 설정하십시오 결코 관련되지 않을 가치가 있으므로 나중에 방해가되지 않으며 기본적으로 완료됩니다. 거기에서 A
s와 O
s 를 세고 곱하면됩니다.A
s를 5로 지정하고 s의 수를 추가하고 O
J와 출력을 피하기 위해 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
이전 문자가 모음이었다 여부 A
및 B
(다음 모음에) 유효의 개수이다 a
및 o
문자는 각각와 a
와 b
각 버퍼 것을 인접한 모음이 있는지 여부에 따라 복사하거나 지 웁니다.
공백이나 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