Bicara juru bahasa

10

"Talk" adalah bahasa berbasis akumulator yang dibajak yang dibuat sebagai tanggapan terhadap kutipan Dennis di talk.tryitonline.net.

Waiting for someone to create an esolang called talk. 

. Bahasa "Talk" memiliki 4 perintah:

  • 00 Jika akumulator adalah 0, atur akumulator ke 0.
  • 01 Jika akumulator adalah 0, atur akumulator ke 1.
  • 10 Jika akumulator adalah 1, atur akumulator ke 0.
  • 11 Jika akumulator adalah 1, atur akumulator ke 1.

Memasukkan:

  • Input dapat diambil melalui metode input apa pun yang dapat diterima oleh aturan I / O standar kami.

  • Ada dua input, nilai akumulator awal dan program. Anda dapat menggabungkan kedua input ini menjadi satu input atau membagi input Anda menjadi perintah yang valid (mis. Mengambilnya sebagai daftar; misalnya [00, 01, 00]) jika Anda mau.

Keluaran:

  • Di akhir eksekusi perintah, akumulator dikeluarkan secara implisit.

Aturan:

  • Input dapat berupa string tunggal atau daftar karakter.
  • Karena ini adalah , jawaban tersingkat, dalam byte, menang.
  • Kami mengambil digit atau string / karakter.

    Kasus uji:

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

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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


sumber
3
Jadi ada dua input, urutan perintah dan nilai akumulator awal?
xnor
4
Beberapa test case yang tidak mengubah akumulator, mulailah dengan 1 pada akumulator atau tidak memiliki instruksi yang baik
Jo King
8
Bisakah Talk benar-benar dianggap sebagai bahasa pemrograman ?
Luis Mendo
8
@ A_ Komentar itu mungkin dimaksudkan sebagai lelucon. Kembali pada hari itu, bahasa yang disebut Lang akan memiliki URL lang.tryitonline.net(sekarang ini tio.run/#lang). Jadi bahasa yang disebut Talk akan menyebabkan kebingungan dengan URL untuk chatroom yang baru saja dibuat, yaitutalk.tryitonline.net
Luis Mendo
7
Di masa mendatang, harap jangan mengubah I / O setelah sejumlah jawaban diposting. Saya kembali hari ini dan memetakan input memungkinkan membuat ini tantangan yang sama sekali berbeda dari apa yang saya jawab .
GammaFunction

Jawaban:

21

Jelly , 3 byte

y@/

Input adalah daftar tunggal: akumulator, diikuti oleh pasangan.

Cobalah online!

Bagaimana itu bekerja

The yMelakukan atom transliterasi; [a, b] yc menggantikan a dengan b , sehingga mengembalikan b jika a = c dan c jika a ≠ c .

y@/melipat / mengurangi input ydengan argumen bertukar, melakukan satu transliterasi per pasangan.

Dennis
sumber
14
Ini adalah satu-satunya jawaban Jelly yang telah saya lihat sejauh ini yang hanya menggunakan karakter ASCII.
2
Ada beberapa. Lihat bu, tidak ada Unicode!
Dennis
21

Python 3 , 43 byte

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

Cobalah online!

Fungsi mengambil string tunggal sebagai input, di mana karakter pertama adalah keadaan awal dan sisa string mewakili perintah. Solusi ini dapat dengan mudah dipindahkan ke bahasa lain yang memiliki dukungan lebih baik untuk ekspresi reguler.

Bagian yang sulit adalah membuktikan solusi menghasilkan hasil yang benar. Untuk melihat ini, kita perlu analisis mendalam dari perintah. Pertama, kita dapat melihat perintah memiliki properti berikut:

  • Properti (1) : memerintahkan 00dan 11mempertahankan status akumulator.
  • Properti (2) : memerintahkan 01dan 10membuat status akumulator sama dengan bit kedua terlepas dari keadaan aslinya.

Oleh karena itu, negara akumulator terakhir adalah:

  • Kasus 1 : Jika tidak ada 01atau 10perintah ada, keadaan akhir sama dengan keadaan awal.
  • Kasus 2 : Jika tidak, bit terakhir yang terakhir 10atau 01perintah.

Selanjutnya kita akan menunjukkan solusi menghasilkan hasil yang benar dalam kedua kasus. Kami akan membuktikan pernyataan untuk kondisi akhir 0dan kondisi akhir 1dapat dibuktikan secara analog. Jika keadaan akhir adalah 0input ada dalam salah satu dari bentuk berikut:

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

    Untuk Kasus 1 , string input sharus dimulai dengan 2k+10s, diikuti oleh 11dan 00perintah. Menghilangkan 00dan 11menghasilkan satu 0, yang merupakan keadaan akhir.

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

    Untuk Kasus 2 , string input diakhiri dengan 10perintah, diikuti oleh nol atau lebih 00dan 11s. Pola ini setara dengan 1diikuti oleh 2k+10s, dan kemudian nol atau lebih 11s dan 00s. Menghilangkan 00s dan 11s meninggalkan yang terakhir dari 2k+10s di akhir string, yang mewakili keadaan akhir.

Berdasarkan semua hal di atas, setelah menghilangkan 00s dan 11s secara bersamaan dalam satu pass tunggal ( 01001adalah contoh tandingan jika 00dihilangkan dalam satu pass dan kemudian 11di pass lain) dari input s, karakter terakhir adalah keadaan akhir. Oleh karena itu kebenaran solusi terbukti.

Joel
sumber
Selamat datang di PPCG! Jawaban yang sangat bagus, dan bukti formal yang bagus untuk digunakan!
GammaFunction
3
Terima kasih. Saya merasa bahwa orang mungkin meragukan solusi sederhana seperti itu menghasilkan hasil yang benar pada pandangan pertama. Jadi ada kebutuhan untuk memberikan bukti untuk itu.
Joel
9

Perl 6 , 17 byte

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

Cobalah online!

Mengambil keuntungan dari "Anda dapat menggabungkan dua input ini menjadi satu masukan jika Anda suka" dengan mengambil masukan sebagai nilai akumulator digabungkan dengan perintah misalnya 1,[00,11]adalah 10011. Jika ini tidak apa-apa, maka hanya perlu 5 byte tambahan f(accumulator, commands). Mengembalikan objek kecocokan yang dapat dipaksa ke string.

Penjelasan:

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

Pada dasarnya ini bekerja karena perintah 00dan 11tidak melakukan apa-apa, sedangkan perintah 01dan 10hanya mengatur akumulator ke digit kedua dari perintah. Jika tidak ada perintah, maka dibutuhkan nilai awal akumulator sebagai gantinya.

Jo King
sumber
6

Zsh , 33 byte

Daftar karakter dilewatkan sebagai argumen, nilai awal akumulator dilewatkan sebagai stdin.

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

Cobalah online!


39 byte : Jika perintah harus berupa string tunggal

Masukan adalah accumulator commandssebagai argumen.

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

Cobalah online!


Untuk bersenang-senang, inilah 50 byte rekursif satu-liner ( TIO ):

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}
Fungsi Gamma
sumber
6

Python 3 , 52 byte

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

Cobalah online!

Memperbaiki tipe pengembalian yang tidak konsisten berkat Chas Brown

Mengambil input sebagai dua string; akumulator dan kode.

negatif tujuh
sumber
Oh tidak, itu cepat.
HighlyRadioactive
1
Bagus tetapi memiliki masalah potensial ini - f(1,'11')==f(1,'01')adalah False; terkadang mengembalikan intdan terkadang a str. Jadi mungkin tentukan dibutuhkan input input sebagai string?
Chas Brown
@ ChasBrown Panggilan bagus, itu jauh lebih sederhana dari apa yang saya pikirkan.
Negatif tujuh
Bagus, tetapi karena fungsi Anda bersifat rekursif, tidak mungkin anonim. Seharusnya 52 byte .
Jitse
5

Brachylog , 11 9 byte

tġ₂≠ˢtt|h

Cobalah online!

Karena sudah cukup lama sehingga saya bisa melupakan gagasan mencetak akumulator setelah setiap perintah , saya telah merumuskan solusi yang jauh lebih naif dengan beberapa inspirasi dari jawaban 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.

Solusi lama:

Brachylog , 18 16 byte

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

Cobalah online!

-2 byte dari mengubah format input.

String yang tidak terkait
sumber
5

JavaScript (ES6), 27 byte

Mengambil input sebagai (a)(code), di mana kode adalah daftar bilangan bulat 2-bit.

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

Cobalah online!


JavaScript (ES6),  47  40 byte

Mengambil input sebagai (a)(code), di mana kode adalah string.

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

Cobalah online!

Bagaimana?

(Sebuah=0,x=012)(Sebuah=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
Arnauld
sumber
4

sed -E, 26 19 byte

Sebuah kekalahan -7 byte dari @Cowsquack dengan menyadari menghapus semua pasangan bekerja dengan baik.

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

Mengambil input yang digabungkan bersama pada stdin. Terinspirasi oleh jawaban Jo King's Perl . Strip trailing pair Hapus semua pasangan, lalu dapatkan digit terakhir.

Cobalah online! Cobalah online!

Fungsi Gamma
sumber
1
Baris terakhir bisa sederhana s/.*\B// , tetapi cara mengubah pendekatan sedikit memberikan 19 byte lebih pendek. Coba online!
user41805
1
Huh, saya tidak berpikir itu s/(.)\1//gakan berhasil, karena itu bisa menghilangkan akhir dari satu pasang dan awal dari yang berikutnya, tetapi masih berhasil. Luar biasa!
GammaFunction
@GammaFunction s/(.)\1//g sama dengan s/00|11//gseperti yang ditunjukkan dalam solusi saya.
Joel
4

Retina 0.8.2 , 18 11 byte

(.)\1

!`.$

Cobalah online! Tautan termasuk kasus uji. Input dimasukkan. Disimpan 6 byte berkat @CowsQuack karena menunjukkan bahwa menghapus semua karakter yang digandakan dan kemudian mengambil karya karakter terakhir yang tersisa, meskipun sebenarnya port jawaban asli @ JoKing bisa saja dipagari oleh 3 byte bahkan tanpa trik itu.

Neil
sumber
12 byte Cobalah online!
user41805
@ Cowsquack D'oh, setelah Anda berpikir tentang memisahkan tahapan, itu sudah menghemat 2-byte, lalu satu byte lagi disimpan karena Anda dapat menggunakan !`.$, dan kemudian 4 byte karena Anda tidak perlu membatasi pasangan tambahan ...
Neil
4

Python 3 , 38 byte

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

Cobalah online!

Berdasarkan solusi Joel . Mengambil input sebagai daftar nilai akumulator awal (panjang-satu string) diikuti oleh perintah (panjang-dua string). Menemukan perintah terakhir dengan dua nilai yang tidak sama, dan menampilkan karakter keduanya.

Untuk membuat ini jatuh ke nilai akumulator awal ketika tidak ada perintah seperti itu, kami membuatnya sehingga string nilai awal single-char melewati tes. Kami melakukannya dengan memeriksa apakah daftar tunggal dengan karakter terakhir tidak sama dengan daftar semua karakter sebelumnya, yang diteruskan oleh string panjang-satu atau panjang-dua dengan dua karakter yang berbeda.

Tidak
sumber
3

Perl 5 -p , 37 33 byte

$\=<>;s/(.)(.)/$\=$2if$\==$1/ge}{

Cobalah online!

Input adalah dua baris: baris pertama adalah urutan perintah, kedua adalah akumulator.

Xcali
sumber
3

Python 2 , 56 byte

f=lambda a,c:f([a,1,0,a][int(c[:2],2)],c[2:])if c else a

Cobalah online!

Chas Brown
sumber
3

Jelly , 8 6 byte

EÐḟṪṪo

Cobalah online!

-2 byte terima kasih kepada Nick Kennedy yang memberi tahu saya tentang perubahan peraturan. (Golf yang diusulkannya,EÐḟFȯṪ ,, tampaknya agak lebih pintar tetapi memiliki panjang yang sama dengan minus solusi saya sebelumnyas2 .) Format input sekarang mengambil perintah sebagai daftar string dua karakter, tetapi footer pengujian diterjemahkan dari format lama untuk kenyamanan.

Diterjemahkan dari solusi Brachylog saya yang lebih baru.

Versi lama:

Jelly , 13 byte

ḢẎ⁼⁹a⁸o
s2ç@ƒ

Cobalah online!

Saya tidak 100% yakin ini benar, tetapi berhasil pada ketiga kasus uji. Mengambil perintah sebagai argumen kiri dan akumulator awal sebagai argumen kanan.

String yang tidak terkait
sumber
1
Input diizinkan untuk dipecah menjadi daftar, sehingga Anda bisa memiliki EÐḟFȯṪinput seperti misalnya [[0,0],[0,1],[1,1],[1,1],[0,1]].
Nick Kennedy
Wow, perubahan pada spec benar-benar sangat besar ...
String yang tidak terkait
3

Haskell , 29 byte

Menentukan fungsi tanpa nama pada baris pertama dengan tipe (Foldable t, Eq b) => b -> t [b] -> b. Untuk keperluan golf kode ini, kita dapat instantiate sebagai Char -> [String] -> Chartempat argumen pertama adalah akumulator dan yang kedua adalah daftar string dengan setiap string menjadi perintah tunggal.

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

Cobalah online!

ankh-morpork
sumber
1
Bytecount sama jika Anda mendefinisikannya menggunakan notasi awalan . Saya tidak percaya saya menulis jawaban yang hampir persis sama pada saat yang sama, bahkan termasuk jenis penjelasan tanda tangan ...
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

Tidak disatukan. EDIT: AHHH Seseorang mengalahkan saya untuk itu!

Sangat Radioaktif
sumber
2

Haskell , 36 byte

f(x:y:s)=f s.last.(:[y|x/=y])
f _=id

Cobalah online!

Mengambil input di f(string)(char)mana karakter adalah akumulator dan string adalah daftar perintah.

Jo King
sumber
2

Stax , 3 byte

F|t

Jalankan dan debug itu

Untuk setiap instruksi, lakukan terjemahan karakter.

rekursif
sumber
2

Tong , -ir, 16 bytes

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

Cobalah online!

Dijelaskan:

  1. Mengambil input implisit dan menggeser nilai akumulator ke bawah

  2. Ulangi langkah berikut (panjang tumpukan - 1 dibagi 2)

2.1. Geser akumulator kembali ke atas

2.2. Bandingkan untuk kesetaraan dengan bagian pertama dari perintah

2.2.1. Jika benar, ganti akumulator, jika tidak pop pengganti

Input diambil sebagai nilai acc awal yang disatukan dengan sumber. Misalnya

010011000
  • Karakter pertama adalah nilai acc
  • Istirahat adalah program
Laksal
sumber
1

Bash , 58 40 byte

Tambahkan satu byte untuk program lengkap: ubah fke $0.

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

58 byte Cobalah online!

Terner akan mengembalikan false ketika $1diatur ke 0, tetapi,1 pada akhirnya memastikan keseluruhan ((expression))akan kembali benar, kecuali kesalahan sintaksis.

Ketika semua argumen dikonsumsi, kesalahan sintaksis terjadi dan rekursi berakhir.


Fungsi Gamma
sumber
1

Arang , 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Membawa argumen terpisah. Penjelasan:

F⪪η²

Bagi instruksi menjadi pasangan angka dan lilitkan.

F⁼θ§ι⁰

Jika akumulator sama dengan digit pertama ...

≔§ι¹θ

... lalu tetapkan digit kedua untuk itu.

θ

Cetak akumulator di akhir lingkaran.

Neil
sumber
1

Jelly , 7 byte

fؽḂ⁹;Ṫ

Link diad yang menerima program sebagai daftar bilangan bulat di sebelah kiri dan akumulator awal di sebelah kanan yang menghasilkan bilangan bulat.

Cobalah online! Atau lihat test-suite

Jonathan Allan
sumber
Saya menghapus pemetaan input karena @GammaFunction merekomendasikan saya untuk melakukan ini.
@ A_ ah OK tidak bisa menghapus di ponsel sehingga harus mengatasi ini nanti
Jonathan Allan
@ A_ tetap berfungsi dengan 0,1,2,3 versi instruksi yang belum dipetakan sebagai digit tidak apa-apa?
Jonathan Allan
1
Ya itu tidak masalah.
1

Pesona Rise , 28 byte

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

Cobalah online!

Mengambil input sebagai serangkaian ruang yang dipisahkan byte (Runic tidak mengerti daftar). Byte pertama adalah keadaan awal dan setiap byte lainnya adalah program. Tidak ada validasi yang dilakukan (yaitu mengasumsikan hanya program yang valid yang diberikan sebagai input dan tidak peduli nilai apa yang digunakan untuk mewakili 0dan1 ).

Draco tidak lagi percaya pada SE
sumber
1

x86 Assembly, 33 Bytes

Mengambil status akumulator awal dalam CL(integer 0atau 1) dan alamat perintah sebagai ASCII String yang diakhiri nol ESI. Meninggalkan status akumulator terakhir diCL .

Arahkan instruksi panggilan pada offset 0x1B(label interpretpada Penjelasan).

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

Penjelasan (Menggunakan Sintaks 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

Fayti1703
sumber
1

C (gcc) , 45 41 byte

f(a,i)char*i;{a=*i?f(a^*i?a:i[1],i+2):a;}

Cobalah online!

4 byte dicukur berkat @ErikF!

G. Sliepen
sumber
1
Anda dapat menyimpan 4 byte dengan menggunakan trik biasa untuk menyimpan nilai kembali di parameter pertama: Coba online!
ErikF
0

Kristal , 46 byte

Dengan perintah dalam Array(Tuple(Int32,Int32)), seperti [{0,0}, {0,1}, {0,0}].

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

Cobalah online!

Cukup mudah untuk dipahami dalam bentuk yang lebih mudah dibaca:

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

Fungsi loop melalui setiap perintah, secara otomatis membongkar nilai tuple ke cdan v. Kemudian mengatur statedengan rumus

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

yang saya tiba di sebagian besar oleh coba-coba. Setelah semua perintah diproses, ia mengembalikan nilai status.

Kinxer
sumber
0

C (dentang) , 68 62 byte

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

Cobalah online!

Membawa pointer ke awal string sumber, pointer ke ujung string sumber (start + strlen (start)), dan nilai akumulator awal.

Versi lama (mencetak ASCII 48/49 untuk 0/1):

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

Java (JDK) , 38 byte

a->p->p.reduce(a,(s,c)->c<1|c>2?s:c%2)

Cobalah online!

Input adalah intdan IntStreamdari 0, 1, 2atau 3, yang sesuai dengan 00, 01, 10, 11dari biner.

Olivier Grégoire
sumber