통역사


10

"Talk"는 talk.tryitonline.net에 대한 Dennis의 인용문 에 대한 응답으로 작성된 축 압형 어큐뮬레이터 기반 언어입니다 .

Waiting for someone to create an esolang called talk. 

. "Talk"언어에는 4 가지 명령이 있습니다.

  • 00 누산기가 0이면 누산기를 0으로 설정하십시오.
  • 01 누산기가 0이면 누산기를 1로 설정하십시오.
  • 10 누산기가 1이면 누산기를 0으로 설정하십시오.
  • 11 누산기가 1 인 경우 누산기를 1로 설정하십시오.

입력:

  • 입력은 표준 I / O 규칙에 따라 허용되는 입력 방법을 통해 취할 수 있습니다.

  • 초기 누산기 값과 프로그램의 두 가지 입력이 있습니다. 원하는 [00, 01, 00]경우이 두 입력을 하나의 입력으로 병합하거나 입력을 유효한 명령으로 분할 할 수 있습니다 (예 : 목록으로 사용) (예 :) .

산출:

  • 명령 실행이 끝나면 누적 기가 내재적으로 출력됩니다.

규칙 :

  • 입력 단일 문자열 또는 문자 목록 일 있습니다.
  • 이대로 바이트 단위의 최단 답변이 이깁니다.
  • 우리는 숫자 또는 문자열 / 문자를 취합니다.

    테스트 사례 :

0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
따라서 명령 시퀀스와 초기 누산기 값의 두 가지 입력이 있습니까?
xnor

4
어큐뮬레이터를 변경하지 않거나 어큐뮬레이터에서 1로 시작하거나 지시가없는 일부 테스트 사례
Jo King

8
Talk는 정말 프로그래밍 언어 로 간주 될 수 있습니까 ?
Luis Mendo

8
@A_ 그 말은 아마도 농담 일 것입니다. 당시에 는 Lang 이라는 언어 에 URL이 있습니다 lang.tryitonline.net(현재는 tio.run/#lang). 따라서 Talk 라는 언어는 최근에 만들어진 대화방의 URL과 혼동 될 수 있습니다.talk.tryitonline.net
Luis Mendo

7
앞으로는 많은 답변이 게시 된 후 I / O를 변경하지 마십시오. 나는 오늘 돌아 왔고 입력 된 입력을 허용함으로써 이것이 내가 대답 한 것과는 완전히 다른 도전이되었다 .
GammaFunction

답변:


21

젤리 , 3 바이트

y@/

입력은 단일 목록입니다. 누산기와 그 뒤에 쌍이옵니다.

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

작동 원리

y원자 수행 음역; [A, B] y(C) 을 대체 와 B , 그것을 반환 이렇게 B를 경우 A = CC 의 경우 ≠ C .

y@/y켤레 당 하나의 음역을 수행하면서 교체 된 인수 를 사용 하여 입력을 접거나 줄 입니다.


14
이것은 지금까지 본 ASCII 문자 만 사용하는 유일한 Jelly 답변입니다.

2
몇 개가있었습니다. 유니 코드가없는 엄마!
Dennis

21

파이썬 3 , 43 바이트

lambda s:re.sub("00|11","",s)[-1]
import re

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

이 함수는 단일 문자열을 입력으로 사용합니다. 여기서 첫 번째 문자는 초기 상태이고 나머지 문자열은 명령을 나타냅니다. 이 솔루션은 정규식을 더 잘 지원하는 다른 언어로 쉽게 이식 될 수 있습니다.

어려운 부분은 솔루션이 올바른 결과를 산출한다는 것을 증명하는 것입니다. 이를 확인하려면 명령에 대한 심층 분석이 필요합니다. 먼저 명령에 다음과 같은 속성이 있습니다.

  • 속성 (1) : 명령 0011누산기 상태를 유지합니다.
  • 속성 (2) : 명령 01과는 10무관하게 원래 상태의 제 2 비트와 축적 상태가 동일하게.

따라서 최종 누산기 상태는 다음과 같습니다.

  • 사례 1 : 01또는 10명령이 없으면 최종 상태는 초기 상태와 동일합니다.
  • 사례 2 : 그렇지 않으면 마지막 10또는 01명령 의 마지막 비트 .

다음으로 두 경우 모두 솔루션이 올바른 결과를 제공함을 보여줍니다. 우리는 최종 상태에 대한 진술을 증명할 것이며 0최종 상태 1는 유사하게 증명 될 수 있습니다. 최종 상태가 0입력 인 경우 다음 형식 중 하나입니다.

  • ^0{2k+1}11(11|00)*

    위해 사례 1 , 입력 문자열 s로 시작해야 2k+1다음에 0, 1100명령. 00s 및 11s를 제거 하면 단일 0상태가되며 이것이 최종 상태입니다.

  • .+10{2k+1}11(11|00)*

    들면 케이스 (2) , A의 입력 문자열 종료 10명령은, 0 또는 그 이상의 다음 0011S. 이 패턴은 동일하다 1다음에 2k+1, 제로 또는 그 이상의 0, 및 11S와 00S. 00s와 11s를 제거 2k+1하면 문자열 끝에서 마지막 0을 남기고 마지막 상태를 나타냅니다.

위의 모든 것을 기반으로 입력 에서 하나의 단일 패스에서00 s와 11s를 동시에 제거한 후 ( 한 패스에서 제거되고 다른 패스에서 제거되는 01001경우의 반대 예 00입니다 11) s마지막 문자는 최종 상태입니다. 따라서 솔루션의 정확성이 입증되었습니다.


PPCG에 오신 것을 환영합니다! 훌륭한 답변과 함께 좋은 공식 증거!
GammaFunction

3
감사. 나는 사람들이 그러한 간단한 해결책을 의심하여 ​​언뜻보기에 올바른 결과를 산출한다고 생각합니다. 따라서이를 증명할 필요가 있습니다.
Joel

9

펄 6 , 17 바이트

{m/.)>[(.)$0]*$/}

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

예를 들어 1,[00,11]is 와 같은 어큐뮬레이터 값으로 입력을 취함으로써 "원하는 경우이 두 입력을 하나의 입력으로 병합 할 수 있습니다"를 이용합니다 10011. 이것이 좋지 않으면으로 5 바이트 만 추가하십시오 f(accumulator, commands). 문자열로 강제 변환 할 수있는 일치 오브젝트를 리턴합니다.

설명:

{                }  # Anonymous code block
 m/             /   # Find the first match from the input
   .)>              # Capture a number
      [     ]*      # Followed by any number of
       (.)$0        # Pairs of identical characters
              $     # Ending the string

기본적으로이 작동하기 때문에 00그리고 11그동안 명령은, 말 그대로 아무것도하지 않는 0110명령 그냥 명령의 두 번째 자리에 누적를 설정합니다. 명령이 없으면 누적 기의 초기 값을 대신 사용합니다.


6

Zsh , 33 바이트

문자 목록은 인수로 전달되고 누산기의 초기 값은 stdin으로 전달됩니다.

read a
for x y;a=$[x^a?a:y]
<<<$a

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


39 바이트 : 명령이 단일 문자열이어야하는 경우

입력은 accumulator commands인수입니다.

for x y (${(s::)2})1=$[x^$1?$1:y]
<<<$1

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


재미를 위해 다음은 50 바이트 재귀 1 라이너 ( TIO )입니다.

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}

6

파이썬 3 , 52 바이트

f=lambda a,s:s and f([s[1],a][s[0]==s[1]],s[2:])or a

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

Chas Brown 덕분에 일관되지 않은 반환 유형이 수정되었습니다.

입력을 두 개의 문자열로 취합니다. 누산기와 코드.


아뇨, 빠릅니다.
HighlyRadioactive

1
좋지만이 잠재적 인 문제 f(1,'11')==f(1,'01')가 있습니다 False. int때로는 a 및 때로는 a를 반환합니다 str. 어쨌든 acc 입력을 문자열로 지정하도록 지정 하시겠습니까?
Chas Brown

@ChasBrown 좋은 전화, 그것은 내가 생각했던 것보다 훨씬 간단합니다.
부정 7 7

좋지만 함수는 재귀 적이므로 익명 일 수 없습니다. 52 바이트 여야합니다 .
Jitse

5

Brachylog , 11 9 바이트

tġ₂≠ˢtt|h

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

각 명령 후에 어큐뮬레이터인쇄 한다는 개념을 잊어 버릴 수있을 정도로 오래 되었기 때문에 Jo King 's Perl 답변에서 영감을 얻은 훨씬 덜 순진한 솔루션을 공식화했습니다.

       |     The output is
     tt      the last element of the last element of
t            the last element of the input
 ġ₂          split into length-2 slices
   ≠ˢ        with equal pairs removed.
       |     If there is no such element, the input
        h    's first element is the output.

오래된 해결책 :

Brachylog , 18 16 바이트

ġ₂ᵗc{th~h?tt|h}ˡ

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

입력 형식 변경에서 -2 바이트


5

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

입력을로 사용합니다 (a)(code). 여기서 코드 는 2 비트 정수 목록입니다.

a=>c=>c.map(x=>a^=x==a+1)|a

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


자바 스크립트 (ES6),  47  40 바이트

입력을로 사용 합니다. (a)(code)여기서 코드 는 문자열입니다.

a=>c=>c.replace(/../g,x=>a^=x%4==a+1)&&a

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

어떻게?

가능한 모든 사례가 아래에 요약되어 있습니다. 누산기를 토글해야하는 두 가지 경우는(a=0,x=012)(a=1,x=102).

  a | x (bin) | int(x) % 4 | a + 1 | equal?
----+---------+------------+-------+--------
  0 |   "00"  |  0 % 4 = 0 |   1   |   N
  1 |   "00"  |  0 % 4 = 0 |   2   |   N
  0 |   "01"  |  1 % 4 = 1 |   1   |   Y
  1 |   "01"  |  1 % 4 = 1 |   2   |   N
  0 |   "10"  | 10 % 4 = 2 |   1   |   N
  1 |   "10"  | 10 % 4 = 2 |   2   |   Y
  0 |   "11"  | 11 % 4 = 3 |   1   |   N
  1 |   "11"  | 11 % 4 = 3 |   2   |   N

4

sed -E, 26 19 바이트

모든 쌍을 제거함으로써 @Cowsquack에서 무려 -7 바이트 가 작동합니다.

s/(.)\1//g
s/.*\B//

stdin에서 함께 연결된 입력을받습니다. Jo King의 Perl answer에서 영감을 얻었습니다 . 후행 쌍 제거 모든 쌍을 제거한 다음 마지막 숫자를 얻습니다.

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


1
마지막 줄은 간단 할 수 s/.*\B//있지만 어쨌든 접근 방식을 약간 변경하면 19 바이트가 더 짧아집니다 . 온라인으로 사용해보십시오!
user41805

1
허, 나는 s/(.)\1//g그것이 한 쌍의 끝과 다음 쌍의 시작을 제거 할 수 있기 때문에 그것이 효과가 있다고 생각하지 않았지만 여전히 효과가 있습니다. 우수한!
GammaFunction

@GammaFunction s/(.)\1//gs/00|11//g내 솔루션에 표시된 것과 같습니다 .
Joel

4

레티 나 0.8.2 , 18 11 바이트

(.)\1

!`.$

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 연결된 입력을받습니다. 실제로 @JoKing의 원래 답변 포트는 그 트릭없이 3 바이트로 골프를 칠 수 있었지만 @CowsQuack 덕분에 6 바이트를 절약했습니다.



@Cowsquack D' oh, 일단 스테이지 분리에 대해 생각하면 이미 2 바이트 절약이며, 다른 바이트는 사용할 수 있기 때문에 저장 !`.$되고 다른 바이트는 후행 쌍으로 제한 할 필요가 없으므로 4 바이트가 절약 됩니다 ...
Neil

4

파이썬 3 , 38 바이트

lambda l:[y for*x,y in l if[y]!=x][-1]

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

Joel의 솔루션을 기반으로 합니다 . 입력을 초기 누산기 값 (길이 1 문자열)과 명령 (길이 2 문자열)의 목록으로 가져옵니다. 두 개의 같지 않은 값을 가진 마지막 명령을 찾아 두 번째 문자를 출력합니다.

이러한 명령이 없을 때 이것이 초기 누산기 값으로 떨어지도록 단일 문자 초기 값 문자열이 테스트를 통과하도록합니다. 마지막 문자가있는 싱글 톤 목록이 모든 선행 문자 목록과 다른지 확인하여 두 개의 다른 문자가있는 길이 1 문자열 또는 길이 2 문자열이 전달합니다.




3

젤리 , 8 6 바이트

EÐḟṪṪo

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

규칙 변경을 알려주는 Nick Kennedy 덕분에 -2 바이트. (그의 골프 제안 EÐḟFȯṪ은 다소 영리 해 보이지만 이전 솔루션에서 빼기의 길이와 같습니다 s2.) 입력 형식은 이제 명령을 두 문자 문자열 목록으로 사용하지만 테스트 바닥 글은 편의를 위해 이전 형식에서 변환됩니다.

최신 Brachylog 솔루션에서 번역되었습니다.

구 버전:

젤리 , 13 바이트

ḢẎ⁼⁹a⁸o
s2ç@ƒ

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

이것이 100 % 확실하지는 않지만 세 가지 테스트 사례 모두에서 성공합니다. 명령을 왼쪽 인수로 사용하고 초기 누산기를 오른쪽 인수로 사용합니다.


1
입력을 목록으로 나눌 수 있으므로 EÐḟFȯṪ예를 들어 입력을 가질 수 있습니다 [[0,0],[0,1],[1,1],[1,1],[0,1]].
Nick Kennedy

와우, 사양에 대한 변경 사항은 정말 ... 상당히 크다고
관련없는 문자열

3

하스켈 , 29 바이트

유형이 첫 번째 줄에 명명되지 않은 함수를 정의합니다 (Foldable t, Eq b) => b -> t [b] -> b. 이 코드 골프의 목적을 위해 Char -> [String] -> Char첫 번째 인수가 누산기이고 두 번째 인수가 각 명령을 단일 문자열로하는 문자열 목록으로 인스턴스화 할 수 있습니다 .

foldl(#)
a#[x,y]|a==x=y|1>0=a

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


1
접두사 표기법을 사용하여 정의하면 동일한 바이트 수 입니다. 형식 서명 설명을 포함하여 거의 동일한 답변을 거의 동시에 썼다는 것을 믿을 수 없습니다…
cole

2

파이썬, 111 바이트

def f(a,b):
    c=a
    for i in range(0,len(b)-1,2):
        c=(not b[i])*(c or b[i] or b[i+1]) or c*b[i]*b[i+1]
    return c

언 골프. 편집 : 아아 누군가가 나를 이길!





2

Keg , -ir16 바이트

"(!;½|':"=['_"|_

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

설명 :

  1. 암시 적 입력을 취하고 누산기 값을 맨 아래로 오른쪽으로 이동

  2. 다음 (스택 길이-1을 2로 나눈 값)을 반복하십시오.

2.1. 어큐뮬레이터를 맨 위로 이동

2.2. 명령의 첫 번째 부분과 동일한 지 비교

2.2.1. 참이면 어큐뮬레이터를 교체하고 그렇지 않으면 교체품을 팝하십시오.

입력은 소스와 연결된 초기 acc 값으로 간주됩니다. 예 :

010011000
  • 첫 번째 문자는 acc 가치입니다
  • 휴식은 프로그램

1

배쉬 , 58 40 바이트

전체 프로그램에 1 바이트를 추가하십시오 :로 변경 f하십시오 $0.

(($1=$2-a?a:$3,1))&&f $1 ${@:4}||echo $1

58 바이트 온라인으로 사용해보십시오!

$1로 설정 하면 삼항은 false를 반환 0하지만 ,1끝에는 구문 오류를 제외하고 전체 ((expression))가 true를 반환 하도록합니다.

모든 인수가 사용되면 구문 오류가 발생하고 재귀가 종료됩니다.



1

, 16 바이트

F⪪η²F⁼θ§ι⁰≔§ι¹θθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 별도의 인수를 취합니다. 설명:

F⪪η²

명령을 숫자 쌍으로 나누고 반복하십시오.

F⁼θ§ι⁰

누산기가 첫 번째 숫자와 같으면 ...

≔§ι¹θ

... 그런 다음 두 번째 숫자를 지정하십시오.

θ

루프 끝에서 어큐뮬레이터를 인쇄하십시오.



1

젤리 , 7 바이트

fؽḂ⁹;Ṫ

프로그램을 왼쪽의 정수 목록으로, 오른쪽의 초기 누산기를 수용하여 정수를 생성하는 2 진 링크.

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오


@GammaFunction 이이 작업을 권장했기 때문에 입력 매핑을 제거하고 있습니다.

@A_ ah OK 모바일에서 삭제할 수 없으므로 나중에 해결해야합니다.
Jonathan Allan

@A_는 0,1,2,3으로 매핑되지 않은 버전의 명령어를 숫자로 사용할 수 있도록 수정 되었습니까?
Jonathan Allan

1
예, 괜찮습니다.


1

룬 마법 , 28 바이트

/~@/i~/i<
/=?/~iR:l}i{l1-=?!

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

입력을 일련의 공백으로 구분 된 바이트로 취합니다 (Runic은 목록을 이해하지 못합니다). 첫 번째 바이트는 초기 상태이고 다른 모든 바이트는 프로그램입니다. 유효성 검사는 수행되지 않습니다 (즉, 유효한 프로그램 만 입력으로 제공되며 어떤 값이 0및 을 나타내는 데 사용되는지는 상관하지 않습니다 1).


1

x86 어셈블리, 33 바이트

초기 누산기 상태 CL(정수 0또는 1)와 명령의 주소를에서 0으로 끝나는 ASCII 문자열로 사용 ESI합니다. 최종 누산기 상태를에 둡니다 CL.

호출 명령을 오프셋 0x1B( interpret설명의 레이블) 에 지정하십시오.

3C 30 74 03 B0 01 C3 30 C0 C3 E8 F1 FF FF FF 38
C8 AC 75 07 E8 E7 FF FF FF 88 C1 AC 84 C0 75 EA
C3

설명 (Intel 구문 사용) :

; function to convert ASCII '1'/'0' into 0 or 1 int values (from AL to AL)
ctob:
        CMP AL, 0x30 ; '0'
        JE .zero
        MOV AL, 1
        RET
        .zero:
        XOR AL, AL
        RET

; interpreting function
        interp_lp:
                CALL ctob     ; convert to number
                CMP AL, CL    ; compare to current accumulator
                LODSB         ; read the next character of the string
                              ; this doesn't affect any flags and we need to do
                              ; it in both cases anyway
                JNE interpret ; if AL != CL (from above, not the new value of AL), skip forward
                CALL ctob     ; convert AL to number
                MOV CL, AL    ; store AL in CL
interpret:      LODSB         ; read the next character of the string
                TEST AL, AL   ; check if it is a zero byte
                JNZ interp_lp ; if not, jump back into the loop
        RET



0

결정 , 46 바이트

Array(Tuple(Int32,Int32))같은 명령을 사용합니다 [{0,0}, {0,1}, {0,0}].

def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end

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

더 읽기 쉬운 형태로 이해하는 것은 매우 간단합니다.

def f(state, instructions)
  instructions.map do |check, value|
    state += ~(state ^ check) & (state ^ value) % 2
  end
  state
end

이 함수는 각 명령을 반복하여 튜플 값을 cand에 자동으로 압축 해제합니다 v. 그런 다음 state수식으로 설정합니다

state = state + NOT(state XOR check) AND (state XOR value) mod 2

나는 주로 시행 착오로 도착했습니다. 모든 명령이 처리되면 상태 값을 반환합니다.


0

C (클랑) , 68 62 바이트

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;puts(&a);}

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

소스 문자열의 시작에 대한 포인터, 소스 문자열의 끝에 대한 포인터 (start + strlen (start)) 및 초기 누산기 값을 가져옵니다.

이전 버전 (0/1에 ASCII 48/49를 인쇄) :

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;putchar(a+48);}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.