พูดคุยล่าม


10

"Talk" เป็นภาษาที่สะสมจากภาษา Baroquified ซึ่งสร้างขึ้นเพื่อตอบสนองต่อคำพูดของ Dennis ที่ talk.tryitonline.net

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

ลีดเดอร์

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# 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แทนที่กับเพื่อให้มันกลับถ้าA = CและCถ้า≠ค

y@/พับ / ลดอินพุตyด้วยอาร์กิวเมนต์ที่สลับกันทำหนึ่งการทับศัพท์หนึ่งคู่


14
นี่เป็นคำตอบเดียวของ Jelly ที่ฉันได้เห็นจนถึงตอนนี้ที่ใช้อักขระ ASCII เท่านั้น

2
มีไม่กี่คน ดูสิไม่มี Unicode!
เดนนิส

21

Python 3 , 43 ไบต์

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

ลองออนไลน์!

ฟังก์ชั่นใช้สตริงเดียวเป็นอินพุตโดยที่อักขระตัวแรกคือสถานะเริ่มต้นและส่วนที่เหลือของสตริงแสดงคำสั่ง โซลูชันนี้สามารถย้ายไปยังภาษาอื่นที่มีการสนับสนุนการแสดงออกปกติได้ดียิ่งขึ้น

ส่วนที่ยากคือการพิสูจน์ว่าโซลูชันให้ผลลัพธ์ที่ถูกต้อง หากต้องการดูสิ่งนี้เราต้องวิเคราะห์คำสั่งอย่างละเอียด ประการแรกเราสามารถเห็นคำสั่งมีคุณสมบัติดังต่อไปนี้:

  • คุณสมบัติ (1) : คำสั่ง00และ11เก็บสถานะการสะสม
  • คุณสมบัติ (2) : คำสั่ง01และ10ทำให้สถานะตัวสะสมเหมือนกับบิตที่สองโดยไม่คำนึงถึงสถานะดั้งเดิม

ดังนั้นสถานะการสะสมสุดท้ายคือ:

  • กรณีที่ 1 : ถ้าไม่มี01หรือ10คำสั่งมีอยู่สถานะสุดท้ายจะเหมือนกับสถานะเริ่มต้น
  • กรณีที่ 2 : มิฉะนั้นบิตสุดท้ายของสุดท้าย10หรือ01คำสั่ง

ต่อไปเราจะแสดงวิธีการแก้ปัญหาผลผลิตผลลัพธ์ที่ถูกต้องในทั้งสองกรณี เราจะพิสูจน์คำแถลงสำหรับสถานะสุดท้าย0และสถานะสุดท้ายของ1สามารถพิสูจน์ได้แบบอะนาล็อก หากสถานะสุดท้ายคือ0อินพุตอยู่ในรูปแบบใดรูปแบบหนึ่งต่อไปนี้:

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

    สำหรับกรณีที่ 1สตริงอินพุตsต้องเริ่มต้นด้วย2k+10 ตามด้วย11และ00คำสั่ง การกำจัด00s และ11s ให้ผลเดี่ยว0ซึ่งเป็นสถานะสุดท้าย

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

    สำหรับกรณีที่ 2สตริงอินพุตลงท้ายด้วย10คำสั่งตามด้วยศูนย์หรือมากกว่า00และ11s รูปแบบนี้เทียบเท่ากับ0 แล้ว1ตามด้วย2k+1ศูนย์หรือมากกว่านั้น11และ00s การกำจัด00s และ11s ทิ้งไว้หลังหนึ่งใน2k+10s สุดท้ายที่ท้ายของสตริงซึ่งแสดงถึงสถานะสุดท้าย

ขึ้นอยู่กับทั้งหมดข้างต้นหลังจากกำจัด00s และ11s พร้อมกันในรอบเดียว ( 01001เป็นตัวอย่างเคาน์เตอร์ถ้า00ถูกกำจัดในรอบเดียวและจากนั้น11ในอีกรอบ) จากการป้อนsอักขระสุดท้ายคือสถานะสุดท้าย ดังนั้นความถูกต้องของการแก้ปัญหาได้รับการพิสูจน์


ยินดีต้อนรับสู่ PPCG! คำตอบที่ยอดเยี่ยมและหลักฐานที่เป็นทางการที่ดีที่จะไปกับมัน!
GammaFunction

3
ขอบคุณ ฉันรู้สึกว่าผู้คนอาจสงสัยว่าวิธีแก้ปัญหาอย่างง่ายนั้นให้ผลลัพธ์ที่ถูกต้องตั้งแต่แรกเห็น ดังนั้นจึงมีความจำเป็นที่จะต้องแสดงหลักฐานว่า
โจเอล

9

Perl 6 , 17 ไบต์

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

ลองออนไลน์!

ใช้ประโยชน์จาก "คุณสามารถผสานทั้งสองปัจจัยการผลิตเป็นหนึ่งในการป้อนข้อมูลหากคุณต้องการ" โดยการป้อนข้อมูลเป็นค่าสะสม concatenated ด้วยคำสั่งเช่นเป็น1,[00,11] 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ไม่ทำอะไรเลยอย่างแท้จริงในขณะที่คำสั่ง01และ10เพียงตั้งค่าแอคคูเลเตอร์เป็นเลขสองหลักของคำสั่ง หากไม่มีคำสั่งก็จะใช้ค่าเริ่มต้นของตัวสะสมแทน


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ซับแบบวนซ้ำ ( TIO ):

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

6

Python 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 strดังนั้นอาจระบุว่าใช้การป้อนข้อมูลตามมาตรฐานเป็นสตริงหรือไม่?
Chas Brown

@ChasBrown โทรดีมากง่ายกว่าที่ฉันคิด
ลบเจ็ด

ดี แต่เนื่องจากฟังก์ชั่นของคุณซ้ำแล้วซ้ำอีกจึงไม่สามารถระบุตัวตนได้ มันควรจะเป็น52 ไบต์
Jitse

5

Brachylog , 11 9 ไบต์

tġ₂≠ˢtt|h

ลองออนไลน์!

เนื่องจากนานพอที่ฉันจะสามารถลืมความคิดในการพิมพ์สะสมหลังจากแต่ละคำสั่งฉันได้กำหนดวิธีการแก้ปัญหาไร้เดียงสาอย่างมีนัยสำคัญน้อยกว่าด้วยแรงบันดาลใจจากคำตอบ Perl ของ Jo King

       |     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

JavaScript (ES6), 27 ไบต์

รับอินพุตเป็น(a)(code)โดยที่codeคือรายการของจำนวนเต็ม 2 บิต

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

ลองออนไลน์!


JavaScript (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 ไบต์

พื้นที่เก็บข้อมูลขนาดใหญ่-7 ไบต์จาก @Cowsquack โดยตระหนักว่าการลบทุกคู่ทำงานได้ดีเช่นกัน

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

นำข้อมูลที่ต่อกันเข้าด้วยกันบน stdin แรงบันดาลใจจากคำตอบ Perl โจของพระบาทสมเด็จพระเจ้าอยู่หัว Strip trailing pairsลบคู่ทั้งหมดจากนั้นรับตัวเลขสุดท้าย

ลองออนไลน์! ลองออนไลน์!


1
บรรทัดสุดท้ายนั้นเรียบง่ายs/.*\B//แต่อย่างไรก็ตามการเปลี่ยนวิธีการนั้นให้ 19 ไบต์ที่สั้นกว่าลองออนไลน์!
user41805

1
อืมฉันไม่คิดว่าs/(.)\1//gมันจะใช้ได้เพราะมันสามารถกำจัดจุดจบของคู่หนึ่งและจุดเริ่มต้นของคู่ถัดไป แต่ก็ยังใช้ได้ ยอดเยี่ยม
GammaFunction

@GammaFunction s/(.)\1//gเทียบเท่ากับs/00|11//gที่แสดงในโซลูชันของฉัน
โจเอล

4

เรติน่า 0.8.2 , 18 11 ไบต์

(.)\1

!`.$

ลองออนไลน์! ลิงก์มีกรณีทดสอบ ใช้การตัดแบ่งข้อมูล บันทึก 6 ไบต์ด้วย @CowsQuack ที่ชี้ให้เห็นว่าการลบตัวอักษรสองเท่าทั้งหมดออกจากนั้นจึงนำตัวอักษรสุดท้ายที่เหลือไปทำงานแม้ว่าในความเป็นจริงแล้วพอร์ตของคำตอบดั้งเดิมของ @ JoKing สามารถเล่นได้ 3 ไบต์แม้ไม่มีเคล็ดลับนั้น



@Cowsquack D'oh เมื่อคุณนึกถึงการแยกขั้นตอนนั่นคือการบันทึกแบบ 2 ไบต์แล้วบันทึกอีกหนึ่งไบต์เพราะคุณสามารถใช้!`.$แล้วอีก 4 ไบต์เพราะคุณไม่จำเป็นต้อง จำกัด การจับคู่ ...
Neil

4

Python 3 , 38 ไบต์

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

ลองออนไลน์!

ขึ้นอยู่กับวิธีการแก้ปัญหาของโจเอล รับอินพุตเป็นรายการของค่าตัวสะสมเริ่มต้น (สตริงความยาวหนึ่ง) ตามด้วยคำสั่ง (สตริงความยาวสอง) ค้นหาคำสั่งสุดท้ายที่มีค่าไม่เท่ากันสองค่าและแสดงผลอักขระที่สอง

ในการทำให้สิ่งนี้ตกไปถึงค่าตัวสะสมเริ่มต้นเมื่อไม่มีคำสั่งดังกล่าวเราจึงสร้างมันขึ้นมาเพื่อให้สตริงค่าเริ่มต้นเดี่ยวถ่านผ่านการทดสอบ เราทำเช่นนั้นโดยตรวจสอบว่ารายการซิงเกิลตันที่มีอักขระตัวสุดท้ายนั้นไม่เท่ากันกับรายการของอักขระก่อนหน้าทั้งหมดซึ่งจะถูกส่งผ่านโดยสายยาวหนึ่งหรือยาวสองสตริงที่มีอักขระที่แตกต่างกันสองตัว




3

เยลลี่ , 8 6 ไบต์

EÐḟṪṪo

ลองออนไลน์!

-2 ไบต์ต้องขอขอบคุณ Nick Kennedy ที่แจ้งให้ฉันทราบถึงการเปลี่ยนแปลงกฎ (สนามกอล์ฟที่เสนอของเขา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

Haskell , 29 ไบต์

(Foldable t, Eq b) => b -> t [b] -> bกำหนดฟังก์ชั่นที่ไม่มีชื่อในบรรทัดแรกที่มีประเภท สำหรับจุดประสงค์ของการเล่นกอล์ฟรหัสนี้เราสามารถสร้างอินสแตนซ์ได้โดยChar -> [String] -> Charที่อาร์กิวเมนต์แรกคือตัวสะสมและตัวที่สองคือรายการของสตริงโดยแต่ละสตริงจะเป็นคำสั่งเดียว

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

ลองออนไลน์!


1
bytecount เดียวกันถ้าคุณกำหนดได้โดยใช้สัญกรณ์คำนำหน้า ฉันไม่อยากจะเชื่อเลยว่าฉันเขียนคำตอบที่เหมือนกันเกือบทั้งหมดในเวลาเดียวกันรวมถึงคำอธิบายที่เป็นลายเซ็นประเภท ...
cole

2

Python ขนาด 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

Ungolfed แก้ไข: AHHH มีคนชนะฉันมัน!





2

ถัง , -ir16 ไบต์

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

ลองออนไลน์!

อธิบาย:

  1. รับอินพุตโดยนัยและทางขวาเลื่อนค่าตัวสะสมไปด้านล่าง

  2. ทำซ้ำ (ความยาวของสแต็ค - 1 หารด้วย 2) ต่อไปนี้

2.1 เลื่อนตัวสะสมกลับไปด้านบน

2.2 เปรียบเทียบเพื่อความเท่าเทียมกับส่วนแรกของคำสั่ง

2.2.1 หากเป็นจริงให้แทนที่ตัวสะสม

อินพุตถูกใช้เป็นค่า acc เริ่มต้นต่อกับแหล่งที่มา เช่น

010011000
  • ถ่านตัวแรกคือค่ามาตรฐาน
  • ส่วนที่เหลือเป็นโปรแกรม

1

Bash , 58 40 ไบต์

เพิ่มหนึ่งไบต์สำหรับโปรแกรมเต็มรูปแบบ: การเปลี่ยนแปลงไปf$0

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

58 ไบต์ ลองออนไลน์!

Ternary จะคืนค่า false เมื่อ$1ตั้งค่าเป็น0, แต่,1เมื่อสิ้นสุดทำให้มั่นใจได้ว่าทั้งหมด((expression))จะกลับเป็นจริง, ยกเว้นข้อผิดพลาดทางไวยากรณ์

เมื่ออาร์กิวเมนต์ทั้งหมดถูกใช้ข้อผิดพลาดทางไวยากรณ์จะเกิดขึ้นและการเรียกซ้ำจะสิ้นสุดลง



1

ถ่าน 16 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้อาร์กิวเมนต์แยกกัน คำอธิบาย:

F⪪η²

แบ่งคำแนะนำเป็นคู่ของตัวเลขและวนรอบพวกเขา

F⁼θ§ι⁰

ถ้าแอคคคูเลเตอร์เท่ากับดิจิตแรก ...

≔§ι¹θ

... จากนั้นกำหนดตัวเลขที่สองให้กับมัน

θ

พิมพ์ตัวสะสมที่ส่วนท้ายของลูป



1

เยลลี่ขนาด 7 ไบต์

fؽḂ⁹;Ṫ

ลิงก์ dyadic ยอมรับโปรแกรมเป็นรายการจำนวนเต็มทางด้านซ้ายและตัวสะสมเริ่มต้นทางด้านขวาซึ่งให้ผลเป็นจำนวนเต็ม

ลองออนไลน์! หรือดูชุดทดสอบ


ฉันกำลังลบการแมปอินพุทเนื่องจาก @GammaFunction แนะนำให้ฉันทำสิ่งนี้

@A_ ah ตกลงไม่สามารถลบบนมือถือได้ดังนั้นจะต้องจัดการเรื่องนี้ในภายหลัง
Jonathan Allan

@A_ แก้ไขให้ทำงานได้กับ 0,1,2,3 คำแนะนำเวอร์ชันที่ไม่ได้แมปเนื่องจากตัวเลขเป็น OK
Jonathan Allan

1
ใช่ไม่เป็นไร


1

Runic Enchantmentsขนาด 28 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นชุดของพื้นที่คั่นด้วยไบต์ (Runic ไม่เข้าใจรายการ) ไบต์แรกคือสถานะเริ่มต้นและทุก ๆ ไบต์คือโปรแกรม ไม่มีการตรวจสอบความถูกต้อง (เช่นถือว่าโปรแกรมที่ถูกต้องเท่านั้นที่ได้รับเป็นอินพุตและไม่สนใจว่าจะใช้ค่าใดเพื่อแสดง0และ1)


1

สมัชชา x86, 33 ไบต์

ใช้เวลาสถานะตัวสะสมเริ่มต้นในCL(จำนวนเต็ม0หรือ1) และที่อยู่ของคำสั่งเป็นสตริง 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

ฟังก์ชั่นวนซ้ำผ่านแต่ละคำสั่งโดยคลายค่า tuple ลงในcและ 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)) และค่าสะสมเริ่มต้น

รุ่นเก่า (พิมพ์ ASCII 48/49 สำหรับ 0/1):

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.