Thông dịch viên nói chuyện


10

"Talk" là ngôn ngữ dựa trên bộ tích lũy baroquified được tạo ra để đáp lại trích dẫn của Dennis trên talk.tryitonline.net.

Waiting for someone to create an esolang called talk. 

. Ngôn ngữ "Talk" có 4 lệnh:

  • 00 Nếu bộ tích là 0, đặt bộ tích thành 0.
  • 01 Nếu bộ tích là 0, đặt bộ tích thành 1.
  • 10 Nếu bộ tích lũy là 1, đặt bộ tích thành 0.
  • 11 Nếu bộ tích lũy là 1, đặt bộ tích lũy thành 1.

Đầu vào:

  • Đầu vào có thể được thực hiện thông qua bất kỳ phương thức nhập có thể chấp nhận nào theo quy tắc I / O tiêu chuẩn của chúng tôi.

  • Có hai đầu vào, giá trị tích lũy ban đầu và chương trình. Bạn có thể hợp nhất hai đầu vào này thành một đầu vào hoặc chia đầu vào của bạn thành các lệnh hợp lệ (ví dụ: lấy chúng làm danh sách; ví dụ [00, 01, 00]) nếu bạn muốn.

Đầu ra:

  • Khi kết thúc thực thi lệnh, bộ tích lũy được xuất ra hoàn toàn.

Quy tắc:

  • Đầu vào có thể là một chuỗi đơn hoặc danh sách ký tự.
  • Vì đây là , câu trả lời ngắn nhất, tính bằng byte, thắng.
  • Chúng tôi lấy chữ số hoặc chuỗi / ký tự.

    Các trường hợp thử nghiệm:

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

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


3
Vì vậy, có hai đầu vào, chuỗi lệnh và giá trị tích lũy ban đầu?
xnor

4
Một số trường hợp thử nghiệm không thay đổi bộ tích lũy, bắt đầu bằng 1 trong bộ tích lũy hoặc không có hướng dẫn nào sẽ tốt
Jo King

8
Có thể Talk thực sự được coi là một ngôn ngữ lập trình ?
Luis Mendo

8
@A_ Nhận xét đó có lẽ là một trò đùa. Trước đây, một ngôn ngữ có tên Lang sẽ có một URL lang.tryitonline.net(bây giờ là ngôn ngữ tio.run/#lang). Vì vậy, một ngôn ngữ có tên Talk sẽ gây nhầm lẫn với URL cho phòng chat được tạo gần đây, đó làtalk.tryitonline.net
Luis Mendo

7
Trong tương lai, vui lòng không thay đổi I / O sau khi một số câu trả lời đã được đăng. Tôi đã trở lại hôm nay và có các đầu vào được ánh xạ cho phép làm cho điều này trở thành một thách thức hoàn toàn khác với những gì tôi đã trả lời .
GammaFactor

Câu trả lời:


21

Thạch , 3 byte

y@/

Đầu vào là một danh sách duy nhất: bộ tích lũy, theo sau là các cặp.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nguyên ytử thực hiện chuyển ngữ; [a, b] yc thay thế a bằng b , vì vậy nó trả về b nếu a = cc nếu a ≠ c .

y@/gấp / giảm đầu vào bằng ycác đối số hoán đổi, thực hiện một lần chuyển ngữ cho mỗi cặp.


13
Đây là câu trả lời Jelly duy nhất mà tôi đã thấy cho đến nay chỉ sử dụng các ký tự ASCII.


21

Python 3 , 43 byte

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

Hãy thử trực tuyến!

Hàm lấy một chuỗi làm đầu vào, trong đó ký tự đầu tiên là trạng thái ban đầu và phần còn lại của chuỗi đại diện cho các lệnh. Giải pháp này có thể dễ dàng được chuyển sang các ngôn ngữ khác có hỗ trợ tốt hơn cho các biểu thức thông thường.

Phần khó là để chứng minh giải pháp mang lại kết quả chính xác. Để thấy điều này, chúng ta cần phân tích sâu về các lệnh. Đầu tiên, chúng ta có thể thấy các lệnh có các thuộc tính sau:

  • Thuộc tính (1) : các lệnh 0011giữ lại trạng thái tích lũy.
  • Thuộc tính (2) : ra lệnh 0110làm cho trạng thái tích lũy giống như bit thứ hai bất kể trạng thái ban đầu của nó.

Do đó, trạng thái tích lũy cuối cùng là:

  • Trường hợp 1 : Nếu không có 01hoặc 10lệnh tồn tại, trạng thái cuối cùng giống như trạng thái ban đầu.
  • Trường hợp 2 : Mặt khác, bit cuối cùng của lệnh cuối cùng 10hoặc 01lệnh.

Tiếp theo chúng tôi sẽ chỉ ra giải pháp mang lại kết quả chính xác trong cả hai trường hợp. Chúng tôi sẽ chứng minh tuyên bố cho trạng thái cuối cùng 0và trạng thái cuối cùng 1có thể được chứng minh tương tự. Nếu trạng thái cuối cùng là 0đầu vào ở một trong các dạng sau:

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

    Đối với trường hợp 1 , chuỗi đầu vào sphải bắt đầu bằng 2k+10, theo sau 1100các lệnh. Loại bỏ 00s và 11s mang lại một 0trạng thái duy nhất , đó là trạng thái cuối cùng.

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

    Đối với trường hợp 2 , chuỗi đầu vào kết thúc bằng một 10lệnh, theo sau là 0 hoặc nhiều hơn 0011s. Mẫu này tương đương với số 0 1theo sau 2k+1, sau đó bằng 0 hoặc nhiều 11s và 00s. Loại bỏ 00s và 11s phía sau 2k+1số 0 cuối cùng ở cuối chuỗi, đại diện cho trạng thái cuối cùng.

Dựa trên tất cả những điều trên, sau khi loại bỏ 00s và 11s đồng thời trong một lần chạy ( 01001là một ví dụ ngược lại nếu 00bị loại bỏ trong một lần và sau đó 11trong một lần khác) từ đầu vào s, ký tự cuối cùng là trạng thái cuối cùng. Do đó tính đúng đắn của giải pháp được chứng minh.


Chào mừng đến với PPCG! Câu trả lời tuyệt vời, và một bằng chứng chính thức tốt đẹp để đi với nó!
GammaFactor

3
Cảm ơn. Tôi cảm thấy rằng mọi người có thể nghi ngờ một giải pháp đơn giản như vậy mang lại kết quả chính xác ngay từ cái nhìn đầu tiên. Vì vậy, cần phải cung cấp một bằng chứng cho điều đó.
Joel

9

Perl 6 , 17 byte

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

Hãy thử trực tuyến!

Đưa lợi thế của "Bạn có thể kết hợp hai đầu vào những thành một đầu vào nếu bạn thích" bằng cách lấy đầu vào như giá trị ắc nối với các lệnh như 1,[00,11]10011. Nếu điều này không ổn, thì chỉ cần thêm 5 byte f(accumulator, commands). Trả về một đối tượng khớp có thể được ép buộc thành một chuỗi.

Giải trình:

{                }  # 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

Về cơ bản, điều này hoạt động vì các lệnh 0011không làm gì theo nghĩa đen, trong khi các lệnh 0110chỉ đặt bộ tích lũy thành chữ số thứ hai của lệnh. Nếu không có lệnh, thì nó sẽ lấy giá trị ban đầu của bộ tích lũy.


6

Zsh , 33 byte

Danh sách ký tự được truyền dưới dạng đối số, giá trị ban đầu của bộ tích lũy được truyền dưới dạng stdin.

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

Hãy thử trực tuyến!


39 byte : Nếu các lệnh phải là một chuỗi đơn

Đầu vào là accumulator commandsđối số.

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

Hãy thử trực tuyến!


Để giải trí, đây là một lớp đệ quy 50 byte ( TIO ):

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

6

Python 3 , 52 byte

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

Hãy thử trực tuyến!

Đã sửa lỗi loại trả lại không nhất quán nhờ Chas Brown

Lấy đầu vào là hai chuỗi; bộ tích lũy và mã.


Ồ không, đó là nhanh chóng.
Đánh giá cao hoạt động

1
Đẹp nhưng nó có vấn đề tiềm năng này - f(1,'11')==f(1,'01')False; đôi khi nó trả về một intvà đôi khi a str. Vì vậy, có thể chỉ định nó mất đầu vào acc như một chuỗi?
Chas Brown

@ChasBrown Cuộc gọi tốt, đơn giản hơn nhiều so với những gì tôi nghĩ.
âm bảy

Đẹp, nhưng vì chức năng của bạn là đệ quy, nó không thể ẩn danh. Nó phải là 52 byte .
Jitse

5

Brachylog , 11 9 byte

tġ₂≠ˢtt|h

Hãy thử trực tuyến!

Vì đã đủ lâu để tôi có thể quên đi khái niệm in bộ tích lũy sau mỗi lệnh , tôi đã tạo ra một giải pháp ngây thơ hơn đáng kể với một số cảm hứng từ câu trả lời của Jo King 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.

Giải pháp cũ:

Brachylog , 18 16 byte

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

Hãy thử trực tuyến!

-2 byte từ việc thay đổi định dạng đầu vào.


5

JavaScript (ES6), 27 byte

Lấy đầu vào là (a)(code), trong đó là một danh sách các số nguyên 2 bit.

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

Hãy thử trực tuyến!


JavaScript (ES6),  47  40 byte

Lấy đầu vào là (a)(code), trong đó là một chuỗi.

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

Hãy thử trực tuyến!

Làm sao?

(một= =0,x= =012)(một= =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 byte

Một -7 byte khổng lồ từ @Cowsquack bằng cách nhận ra việc loại bỏ tất cả các cặp cũng hoạt động.

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

Đưa đầu vào nối với nhau trên stdin. Lấy cảm hứng từ câu trả lời của Jo King Perl . Các cặp theo dõi dải Xóa tất cả các cặp, sau đó lấy chữ số cuối cùng.

Hãy thử trực tuyến! Hãy thử trực tuyến!


1
Dòng cuối cùng có thể chỉ đơn giản s/.*\B//, nhưng dù sao thay đổi cách tiếp cận hơi cho 19 byte thậm chí ngắn hơn Hãy thử trực tuyến!
dùng41805

1
Huh, tôi đã không nghĩ rằng nó s/(.)\1//gsẽ hoạt động, vì nó có thể loại bỏ sự kết thúc của một cặp và bắt đầu của cặp tiếp theo, nhưng nó vẫn hoạt động. Thông minh!
GammaFactor

@GammaFunction s/(.)\1//gtương đương s/00|11//gnhư trong giải pháp của tôi.
Joel

4

Võng mạc 0.8.2 , 18 11 byte

(.)\1

!`.$

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đưa đầu vào nối. Đã lưu 6 byte nhờ @CowsQuack vì đã chỉ ra rằng việc xóa tất cả các ký tự được nhân đôi và sau đó lấy ký tự cuối cùng còn lại hoạt động, mặc dù trên thực tế, câu trả lời ban đầu của @ JoKing có thể đã bị đánh 3 byte ngay cả khi không có mẹo đó.



@Cowsquack D'oh, một khi bạn nghĩ về việc tách các giai đoạn, đó là đã lưu 2 byte, sau đó một byte khác được lưu vì bạn có thể sử dụng !`.$và sau đó là 4 byte khác vì bạn không phải giới hạn ở các cặp theo dõi ...
Neil

4

Python 3 , 38 byte

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

Hãy thử trực tuyến!

Dựa trên giải pháp của Joel . Lấy đầu vào là một danh sách các giá trị tích lũy ban đầu (chuỗi dài một chuỗi) theo sau là các lệnh (chuỗi dài hai chuỗi). Tìm lệnh cuối cùng với hai giá trị không bằng nhau và xuất ký tự thứ hai của nó.

Để thực hiện điều này rơi vào giá trị bộ tích lũy ban đầu khi không có các lệnh như vậy, chúng tôi thực hiện nó để chuỗi giá trị ban đầu char đơn vượt qua kiểm tra. Chúng tôi làm như vậy bằng cách kiểm tra xem một danh sách đơn có ký tự cuối cùng có bằng với danh sách tất cả các ký tự trước hay không, được truyền bởi bất kỳ độ dài nào - một chuỗi hoặc hai chuỗi có hai ký tự khác nhau.




3

Thạch , 8 6 byte

EÐḟṪṪo

Hãy thử trực tuyến!

-2 byte nhờ Nick Kennedy thông báo cho tôi về việc thay đổi quy tắc. (Đề xuất golf của anh ấy,EÐḟFȯṪ , có vẻ thông minh hơn một chút nhưng có cùng độ dài với trừ giải pháp trước đây của tôi s2.) Định dạng đầu vào bây giờ lấy các lệnh dưới dạng danh sách các chuỗi hai ký tự, nhưng chân trang thử nghiệm dịch từ định dạng cũ để thuận tiện.

Dịch từ giải pháp Brachylog mới hơn của tôi.

Phiên bản cũ:

Thạch , 13 byte

ḢẎ⁼⁹a⁸o
s2ç@ƒ

Hãy thử trực tuyến!

Tôi không chắc chắn 100% điều này là đúng, nhưng nó thành công trên cả ba trường hợp thử nghiệm. Lấy các lệnh làm đối số bên trái và bộ tích lũy ban đầu làm đối số bên phải.


1
Đầu vào được phép chia thành một danh sách, vì vậy bạn có thể có EÐḟFȯṪđầu vào như ví dụ [[0,0],[0,1],[1,1],[1,1],[0,1]].
Nick Kennedy

Ồ, những thay đổi về thông số kỹ thuật thực sự khá lớn ...
Chuỗi không liên quan

3

Haskell , 29 byte

Xác định một hàm không tên trên dòng đầu tiên với loại (Foldable t, Eq b) => b -> t [b] -> b. Đối với mục đích của mã golf này, chúng ta có thể khởi tạo nó như là Char -> [String] -> Charđối số đầu tiên là bộ tích lũy và thứ hai là danh sách các chuỗi với mỗi chuỗi là một lệnh.

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

Hãy thử trực tuyến!


1
Tương tự bytecount nếu bạn xác định nó bằng cách sử dụng ký hiệu tiền tố . Tôi không thể tin rằng tôi đã viết gần như cùng một câu trả lời cùng một lúc, thậm chí bao gồm cả lời giải thích chữ ký loại
cole

2

Python, 111 byte

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

Ung dung. EDIT: AHHH Ai đó đã đánh bại tôi!





1

Bash , 58 40 byte

Thêm một byte cho một chương trình đầy đủ: thay đổi fthành $0.

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

58 byte Hãy thử trực tuyến!

Ternary sẽ trả về false khi $1được đặt thành 0, nhưng ,1ở cuối đảm bảo toàn bộ ((expression))sẽ trả về true, ngoại trừ một lỗi cú pháp.

Khi tất cả các đối số được tiêu thụ, một lỗi cú pháp xảy ra và đệ quy kết thúc.



1

Than , 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đưa ra những lý lẽ riêng biệt. Giải trình:

F⪪η²

Chia các hướng dẫn thành các cặp chữ số và lặp qua chúng.

F⁼θ§ι⁰

Nếu bộ tích lũy bằng chữ số đầu tiên ...

≔§ι¹θ

... sau đó gán chữ số thứ hai cho nó.

θ

In bộ tích lũy ở cuối vòng lặp.



1

Thạch , 7 byte

fؽḂ⁹;Ṫ

Một liên kết dyadic chấp nhận chương trình như một danh sách các số nguyên ở bên trái và bộ tích lũy ban đầu ở bên phải mang lại một số nguyên.

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm


Tôi đang xóa ánh xạ đầu vào vì @GammaFunction khuyên tôi nên làm điều này.

@A_ ah OK không thể xóa trên điện thoại di động nên sẽ phải giải quyết vấn đề này sau
Jonathan Allan

@A_ đã sửa để hoạt động với 0,1,2,3 phiên bản chưa được ánh xạ của các hướng dẫn dưới dạng chữ số có ổn không?
Jonathan Allan

1
Vâng điều đó ổn.


1

Bùa mê , 28 byte

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi các byte được phân tách bằng dấu cách (Runic không hiểu danh sách). Byte đầu tiên là trạng thái ban đầu và mọi byte khác là chương trình. Không có xác nhận được thực hiện (nghĩa là nó chỉ giả sử các chương trình hợp lệ được đưa ra làm đầu vào và nó không quan tâm giá trị nào được sử dụng để đại diện 01).


1

hội x86, 33 byte

Đưa trạng thái tích lũy ban đầu bằng CL(số nguyên 0hoặc 1) và địa chỉ của các lệnh dưới dạng Chuỗi ASCII không kết thúc trong ESI. Lá trạng thái tích lũy cuối cùng trong CL.

Trỏ hướng dẫn cuộc gọi ở phần bù 0x1B(nhãn interprettrong phần Giải thích).

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

Giải thích (Sử dụng Cú pháp 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



1

Keg , -ir, 16 byte

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

Hãy thử trực tuyến!

Giải thích:

  1. Đưa đầu vào ngầm định và chuyển giá trị tích lũy xuống dưới cùng

  2. Lặp lại các bước sau (chiều dài của ngăn xếp - 1 chia cho 2) lần

2.1. Chuyển bộ tích lũy trở lại đầu trang

2.2. So sánh sự bình đẳng với phần đầu tiên của lệnh

2.2.1. Nếu đúng, thay thế ắc quy, nếu không thì bật thay thế

Đầu vào được lấy làm giá trị acc ban đầu được nối với nguồn. Ví dụ

010011000
  • Char đầu tiên là giá trị acc
  • Nghỉ ngơi là chương trình

0

Pha lê , 46 byte

Với các lệnh trong một Array(Tuple(Int32,Int32)), chẳng hạn như [{0,0}, {0,1}, {0,0}].

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

Hãy thử trực tuyến!

Nó khá đơn giản để hiểu ở dạng dễ đọc hơn:

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

Hàm lặp qua từng lệnh, tự động giải nén các giá trị tuple vào cv. Sau đó, nó đặt statecông thức

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

mà tôi đã đến hầu hết bằng thử nghiệm và lỗi. Khi tất cả các lệnh đã được xử lý, nó sẽ trả về giá trị trạng thái.


0

C (tiếng kêu) , 68 62 byte

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

Hãy thử trực tuyến!

Đưa con trỏ đến đầu chuỗi nguồn, con trỏ đến cuối chuỗi nguồn (start + strlen (start)) và giá trị bộ tích lũy ban đầu.

Phiên bản cũ (in ASCII 48/49 cho 0/1):

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.