더블 토크인가요?


45

에서 이전 문제 나 문자열의 각 문자를 복사 할 문자열을 생성하는 코드 골퍼를 물었다. 예를 들면 다음과 같습니다.

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

이 과제는 일부 텍스트가 이중 말하기 문자열의 정의를 충족하는지 여부를 감지하는 것입니다.

  • 짝수의 문자가 있습니다.
  • 쌍으로 나눌 때 모든 쌍은 동일한 문자 중 두 개로 구성됩니다.

도전

  • 코드 골프입니다. 몇 바이트 만하면됩니다.
  • 선택한 언어를 사용하십시오.
  • 온라인 통역사 링크를 포함하십시오.
  • 코드는 일부 텍스트를 허용합니다.
    • 편의상 입력은 인쇄 가능한 ASCII 문자 로만 구성됩니다.
  • 입력이 더블 스피크인지 여부에 대한 표시를 반환합니다. 그것은 수:
    • 참이나 거짓
    • 문자열 ( 'true', 'false', 'yes', 'no'등)
    • 정수 0 또는 1

테스트 사례 :

  • 아바-거짓
  • 아바-거짓
  • aabb-사실
  • aaabb-거짓
  • tthhiiss-사실
  • ttthhhiiisss-거짓

6
길이가 2보다 작은 입력에서 오류가 발생할 수 있습니까?

3
제안 된 테스트 사례 : abba거짓이어야 함
Giuseppe

2
제안 된 테스트 사례 : aabbbb진실해야 함
Khuldraeseth na'Barya

2
@val 글쎄, 나는 표준 I / O와 논쟁하지 않을 것이다
AJFaraday

2
제안 된 테스트 사례 : 0거짓이어야합니다.
640KB

답변:



23

brainfuck , 20 바이트

Jo King 덕분에 1 바이트를 절약했습니다.

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

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

읽을 수있는 출력!

한 번에 두 문자를 입력하고 일치하는 쌍이 없으면 테이프의 1에서 멀어집니다. EOF는 0으로 취급되므로 자동으로 처리됩니다.

문자열이 더블 토크가 아닌 경우 출력은 null 바이트이고 0이면 01입니다. 읽을 수있는 버전은 14 바이트의 비용으로 문자로 출력합니다.


언어 이름으로 인해 완전히 투표되었습니다. HAHA 훌륭한 솔루션!
PerpetualJ

의견을 내리면 위의 의견을 내리십시오.
A _

16

MATL , 4 바이트

Heda

입력은 단일 qoutes로 묶인 문자열입니다. 그렇지 않으면 출력은 0이중 말하기 1입니다.

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

설명

'TThhiiss iiss ddoouubbllee ssppeeaakk!!'예를 들어 입력 을 고려하십시오 .

H    % Push 2
     % STACK: 2
     % Implicit input (triggered because the next function requires two inputs): string 
     % STACK: 'TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!', 2
e    % Reshape as a 2-column matrix of chars, in column-major order. Pads with char(0)
     % if needed. Note that char(0) cannot be present in the input
     % STACK: ['This is double speak!';
               'This is double speak!']
d    % Difference of each column
     % STACK: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a    % Any: gives 0 if and only if all elements are 0
     % STACK: 0
     % Implicit display

12
음 ... "헤다"는 누구입니까? : D
Outgolfer Erik

7
"Heda"는 "Hey! You!"의 독일어입니다.
QBrute

14

05AB1E , 6 5 2 바이트

ιË

문자 목록으로 입력하십시오.

@ Shaggy 's Japt answer 를 포팅하여 -3 바이트 이므로 그를 찬성 해야합니다!

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오 .

설명:

ι   # Uninterleave the (implicit) input-list of characters
    #  i.e. ["t","t","t","t","e","e","s","s","t","t","!","!","!"]
    #   → [["t","t","e","s","t","!","!"],["t","t","e","s","t","!"]]
 Ë  # Check if both inner lists are equal
    #  → 0 (falsey)
    # (after which the result is output implicitly)


9

레티 나 , 9 바이트

(.)\1

^$

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

설명:

동일한 문자를 모두 제거하십시오.

(.)\1

남은 문자가 없는지 확인하십시오.

^$

1
^$최종 단계로 사용하여보다 전통적인 출력을 제공 할 수 있습니다 .

@Neil Ah 물론입니다. 감사합니다! 실제로 더 좋아 보인다. 나는 항상 그것이 false진실하고 거짓으로 이상한 출력이라고 생각합니다 true(그러나 바이트를 절약하고 허용되면 여전히 사용합니다). ;) 그러나 이것은 예상 결과를 출력하는 동일한 바이트 솔루션이므로 더 좋습니다.
케빈 크루이 센

8

1
이봐, 난 이걸 좋아해! 같은 롤을하는 데 8 천만 명이 걸 렸어요. "이봐 젤리를 배워 보자"고 배웠어요. 나는이 게시물에 대한했지만 젤리 답변이 이미이 있다면 보았다 ... 그리고 ^^ 이것을보고 내 단계 : ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ...하지만 난 내가 원하는, 그리고 내가 본 것을 얻을 관리 할 수있는 Œœ
V. Courtois


6

PHP ,58 56 바이트

function f($s){return!$s?:$s[0]==$s[1]&f(substr($s,2));}

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

재귀 함수로.

PHP ,61 56 52 바이트

while(''<$l=$argn[$i++])$r|=$l!=$argn[$i++];echo!$r;

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

또는 독립형 프로그램. 입력 문자열을 통해 STDIN, 출력은 truthy( 1는 이중 말하는, 그리고 경우) falsey( 0)는 두 말할 경우.

@ Night2에 -4 바이트 !


1
이것은 이중 말하기 문자열뿐만 아니라 이중 말하기 문자열에 대해 1을 출력하는 것으로 보입니다.
AJFaraday


6

x86 기계 코드, 9 7 바이트

D1 E9       SHR  CX, 1          ; divide length in half 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE -5            ; if equal, continue loop

에서 입력 문자열 SI에서 입력 문자열 길이 CX. ZF더블 토크 인 경우 출력 .

또는 완전한 PC DOS 실행 파일로 14 바이트 :

B4 01       MOV  AH, 01H        ; DOS read char from STDIN (with echo) 
CD 21       INT  21H            ; read first char into AL
92          XCHG DX, AX         ; put first char into DL
B4 08       MOV  AH, 08H        ; DOS read char from STDIN (no echo) 
CD 21       INT  21H            ; read second char into AL
3A C2       CMP  AL, DL         ; compare first and second char 
74 F3       JE   -13            ; if the same, continue loop 
C3          RET                 ; otherwise exit to DOS 

입력은 STDIN파이프 또는 대화식을 통해 이루어 집니다. 2 배가 아닌 문자가 감지 될 때까지 "2 배"입력을 반향합니다.이 시점에서 I / O 규칙이 약간 구부러 질 수 있지만 보너스 답변 일뿐입니다.

여기에 이미지 설명을 입력하십시오

다음을 사용하여 ISDBL2.COM을 빌드하고 테스트하십시오 xxd -r.

00000000: b401 cd21 92b4 08cd 213a c274 f3c3       ...!....!:.t..

원본 24 바이트 는 PC DOS 실행 파일을 완성합니다.

D1 EE       SHR  SI, 1          ; SI to DOS PSP (080H) 
AD          LODSW               ; load string length into AL 
D0 E8       SHR  AL, 1          ; divide length in half 
8A C8       MOV  CL, AL         ; put string length into BL 
        CLOOP: 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE CLOOP         ; if equal, continue loop
        DONE: 
B8 0E59     MOV  AX, 0E59H      ; BIOS tty function in AH, 'Y' in AL 
74 02       JZ   DISP           ; if ZF, result was valid double 
B0 4E       MOV  AL, 'N'        ; if not, change output char to N 
        DISP: 
B4 0E       MOV  AH, 0EH 
CD 10       INT  10H 
C3          RET                 ; return to DOS

명령 줄에서 입력하고, 'Y'두 배인 'N'경우 화면에 출력합니다 ( 그렇지 않은 경우).

여기에 이미지 설명을 입력하십시오

다음을 사용하여 ISDBL.COM을 빌드하고 테스트하십시오 xxd -r.

00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74  ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3                      ..N.....

크레딧 :

  • @ErikF에 -2 바이트 !

2
2 바이트를 절약하기 위해 / LOOPE대신 사용 을 제안하십시오 . JNZLOOP
ErikF

@ErikF, 훌륭합니다! 완전히 잊어 버렸습니다!
640KB

6

루아 , 67 66 63 59 33 32 바이트

Giuseppe 덕분에 -25 바이트
val 덕분에 -1 바이트

print(#(...):gsub("(.)%1","")<1)

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

모든 이중 문자를 제거한 다음 결과가 비어 있는지 확인합니다.


1
단지 왜 i:gsub("(.)%1","")하고 있는지 확인 i==""?
주세페

1
이것은 34 바이트이며, 이전에 Lua를 작성한 적이 없으므로 유효하지는 않지만 작동하는 것으로 보입니다.
주세페

Code Golf Stack Exchange에 오신 것을 환영합니다!
주세페

나는 "(.)%1"그 자체로 충돌이 포함되어 있다고 가정 했지만 모든 캡처에 대해 한 번 교체하면 충분하다고 생각하지 않았습니다. 솔루션을 구현해야합니까, 아니면 직접 답을 작성해야합니까? 그리고 감사합니다!
HugoBDesigner

1
좋은 생각! 1 바이트를 절약하기 위해 arg[1]대체 될 수 있습니다 (...).




5

하스켈 , 28 23 바이트

f(x:y:z)|x==y=f z
f[]=1

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

매우 간단합니다. 이중 말하기는 비어 있거나 이중 말하기 앞에 반복되는 문자 만 있습니다.

덜 간단합니다. 메타 합의 에 따라 오류의 유무를 통한 출력 ; 오류 없음은 이중 말하기를 의미합니다. 처음 두 문자가 다르거 나 문자 수가 홀수이면 패턴 일치가 실패합니다. 이 절약에 대한 Laikoni 에게 감사합니다 !




4

PowerShell , 39 38 바이트

!$($args|?{+$p*($p="$_"[$p-eq$_])};$p)

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

여기서 $p이전 문자 가 들어 있습니다.

재귀 없음 , 정규 표현식 없음 :). 튄 문자열을 통해 입력을 문자 배열로 가져옵니다 (TIO 링크 참조).


PowerShell , 48 바이트

for(;$b-eq$a-and$args){$a,$b,$args=$args}$b-eq$a

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

아니 재귀없는 , 아니 정규식 없이 파이프 : D. 또한 튄 문자열을 통해 입력을 문자 배열로 가져옵니다. 마지막 문자에 # 0 코드가있는 경우 $b-eq$a대신 사용 $a-eq$b합니다.


4

PowerShell , 64 59 바이트

filter f($n){$a,$b,$r=$n;$a-eq$b-and$(if($r){f $r}else{1})}

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

재귀 함수, 정규 표현식 없음. 입력을 char-array 로 취합니다 (TIO 링크 참조). 처음 두 요소로 박리 $a하고 $b저장이로 남아 $r. 여전히 요소가 남아 있으면와 함께 반복하십시오 $a -eq $b. 그렇지 않으면 그냥 확인하십시오 $a -eq $b. 출력은 암시 적입니다.

mazzy 덕분에 -5 바이트



1
@mazzy 감사합니다! $명령문 블록 앞에 누락 되어 왜 작동하지 않는지 알 수 없었습니다.
AdmBorkBork




4

, 19 17 자

?{!1<|=[|0.(_)]}1

설명:

?             # read input

{             # while
    !1<       # stack length greater than 1?
|             # end of while condition and beginning of while block
    =         # compare the 2 top values in the stack
    [         # if (the condition is the top of stack)
    |         # end of then block and beginning of else block
        0.    # output 0
        (_)   # clear stack (discard top of stack in for loop stack length times)
    ]         # end if
}             # end while

1             # stack is already empty, push a truthy value

              # implicitly output the stack content if there was no explicit output

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


3

R , 53 34 바이트

주세페 덕분에 -19 바이트

function(a)gsub("(.)\\1","",a)==""

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


1
나는 gsub("(.)\\1","",a)==""트릭도 할 것이라고 생각 한다. 다른 많은 사람들이 같은 정규식을 사용합니다.
주세페

@Giuseppe이 정규식은 제게 새로운 것입니다. 감사.
Robert S.

R + pryr는 이 답변에서 32 비트를 사소하게 수정합니다.
Khuldraeseth na'Barya

2
입력을 벡터로 취할 수 있다면, function(a)!sum(rle(a)$l%%2)28
MickyT

3

Brain-Flak , 26 , 22 바이트

({<({}[{}])>{()<>}{}})

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

false는 1, true는 0을 출력합니다.

읽을 수있는 버전 :

({
    <({}[{}])>
    {
        ()
        <>
    }
    {}
})

나는 원래 이것을 가지고 있었다 :

{
    ({}[{}])

    {
        <>([()])<>{{}}
    }{}
}
<>({}())

10 바이트가 더 깁니다.


0 / non0은 부울로 계산됩니까? 그렇다면, 할 수 있습니다({({}[{}]){{}}{}})
라일리

3
"읽을 수있는 버전"
Quinn

@riley 아니요 유효하지 않습니다. 그러나 더 나은 트릭을 발견했습니다.
DJMcMayhem

@quinn 나에게 읽을 수있는 것처럼 보인다 : P
DJMcMayhem


3

자바 스크립트, 26 23 바이트

s=>/^((.)\2)+$/.test(s)

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

재귀 솔루션, 30 바이트

Arnauld에게 0 바이트의 비용으로 수정 해 주셔서 감사합니다.

f=([x,y,...s])=>x?x==y&f(s):!y

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



감사합니다, @Arnauld :)
Shaggy

@ 올리버, 쓰레기; 내 게시물을 게시하기 전에 원래 솔루션 만 보았습니다. 당신이 저보다 먼저 23에 도달하면 26으로 돌아가서 기쁩니다.
얽히고 설킨


3

Zsh , 36 바이트

이전 도전에 대한 나의 Zsh 답변은 여기에서 찾을 수 있습니다.

이중 말을 하지 않으면 진실 (0)을 종료 하고 이중 말을하면 거짓 (1)을 종료합니다. (댓글에 허용 된대로)

for a b (${(s::)1})r+=${a#$b}
[ $r ]

for a b (${(s::)1})r+=${a#$b}
         ${(s::)1}             # split $1 characterwise
for a b (         )            # take pairs of characters from ${(s::)1}, assign to $a and $b
                      ${a   }  # first character
                      ${ #$b}  # remove second character as prefix
                   r+=         # append to $r as string
[ $r ]                         # exit truthy if $r is non-empty

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


3

프롤로그 (SWI) , 60 45 바이트

관련없는 문자열 덕분에

+[].
+[A,A|T]:- +T.
-X:-string_chars(X,Y),+Y.

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

그것을 문자열에서 원자 목록으로 바꾸면 점수가 망가졌지만 ..



1
... 원자가 아닌 문자열을 입력으로 사용 하더라도. atom_chars대신 사용할 수도 있습니다 string_chars. 그러나 백틱으로 구분 된 문자열, 즉 문자 코드 목록을 사용할 수 있으면 관련이 없을 수 있습니다.
관련없는 문자열
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.