ทำโปรแกรม lenguage อีกต่อไป


16

Lenguageเป็นภาษาซีกสมองที่มีชื่อเสียงในการทำลายความท้าทายที่ จำกัด แหล่งที่มา นั่นเป็นเพราะ Lenguage ใส่ใจแค่ความยาวของแหล่งที่มาและไม่ใช่เนื้อหา

ขั้นแรกให้คำนวณความยาวของโปรแกรม จากนั้นความยาวดังกล่าวจะถูกแปลงเป็นเลขฐานสองและเลขศูนย์ด้านซ้ายเป็นศูนย์เป็นผลคูณของ 3 สตริงเลขฐานสองที่ได้จะถูกแบ่งออกเป็นชิ้น ๆ ละ 3 บิตซึ่งแต่ละอันถูกแปลเป็นคำสั่ง brainfuck เช่น:

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

ในที่สุดก็มีการรันโปรแกรมเป็น brainfuck 1

จากที่นี่ความท้าทายนั้นง่ายมากเขียนโปรแกรม lenguage ที่ไม่มีอินพุตและสร้างเอาต์พุตที่ประกอบด้วยจำนวนเต็มซ้ำหนึ่งไบต์nคูณโดยที่nนั้นมากกว่าความยาวของโปรแกรมอย่างเคร่งครัด

คำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยลง

นี่คือโปรแกรมแฮ็คในการคำนวณ lenguage จาก brainfuck


1: สำหรับความท้าทายนี้เราจะใช้เซลล์ห่อและเทปห่อไม่ใช่


3
+[.]ฉันจะชนะหรือไม่ : P
Quintec

3
บางทีมันอาจจะน่าสนใจมากขึ้นที่จะให้คะแนนกับความยาวของผลลัพธ์?
Jo King เมื่อ

@ โจ้กนั่นเป็นความคิดที่ดี น่าเสียดายที่ดูเหมือนว่าจะสายไปสักพัก
โพสต์ Rock Garf Hunter

2
นอกจากนี้ทำไมแท็ก quine นี้
ศูนย์รวมแห่งความไม่รู้

1
+]23n

คำตอบ:


15

8437495638205698686671 ไบต์

นี่แปลเป็นโปรแกรม brainfuck:

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

231584178474632390847141970017375815706539969331281128078915168015826259279614

ฟังก์ชั่นนี้คำนวณโดย

f(n)=2*f(n-1)+n
f(0)=0

ด้วยอินพุต 255

คำอธิบาย:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823ไบต์

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

ซึ่งพิมพ์ออกมาอย่างแน่นอน

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

เครดิตไปที่@hvdในคำตอบของ Brainfuckดังนั้นอย่าลืมอัปเกรดเขา!

คำอธิบาย:

ฉันกำลังจะเขียนคำอธิบายของตัวเอง แต่การรับรู้ของ@hvdอยู่ในจุดแล้วดังนั้นฉันจะพูดที่นี่แทน

>>>>>> จำเป็นต้องออกจากพื้นที่ทำงานเล็กน้อย

-สร้าง 255 ( ตั้งแต่ 0 - 1 = 255 เมื่อเรามีเซลล์ห่อ )

[[->>>+<<<]------>>>-] เปลี่ยนเป็น 255 สำเนาของค่า 250 โดยให้เทปที่มีลักษณะดังนี้:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ ย้ายตัวชี้ข้อมูลไปด้านหลังและจบข้อมูลแรก:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

จากนั้นลูป: [+...-]เริ่มแรกตั้งค่า 1 เป็น 2 ซึ่งได้รับการตั้งค่ากลับเป็น 1 ในตอนท้ายของลูป ลูปสิ้นสุดลงเมื่อร่างกายลูปตั้งค่า 2 เป็น 1 แล้ว

ทีนี้ตัวเลข 2 250 250 250 ... 250 แทนเคาน์เตอร์ในฐาน 250 โดยแต่ละหมายเลขหนึ่งมากกว่าตัวเลข

  • [>>>]<<<เลื่อนไปจนสุดทาง เนื่องจากตัวเลขแต่ละหลักแสดงด้วยตัวเลขที่ไม่เป็นศูนย์นี่เป็นเรื่องเล็กน้อย

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-ลดจำนวนตัวนับ 1 เริ่มต้นด้วยหลักสุดท้าย: ตัวเลขจะลดลง ถ้ามันยังคงเป็นบวกเราจะทำ หากเปลี่ยนเป็นศูนย์ให้ตั้งเป็น 250 และดำเนินการต่อด้วยตัวเลขก่อน

  • [<<<].>>>เลื่อนตัวชี้กลับมาก่อนตัวเลขหลักซ้ายสุดและนี่เป็นช่วงเวลาที่ดีในการพิมพ์ NUL ไบต์ จากนั้นปรับตำแหน่งให้เป็นจำนวนหลักซ้ายสุดทุกประการเพื่อดูว่าเราทำเสร็จแล้วหรือไม่

เพื่อตรวจสอบความถูกต้องเปลี่ยนเริ่มต้น-เพื่อ+การพิมพ์ 250 1 NUL ไบต์++สำหรับ250 2ฯลฯ


4

19326644346528796447 ไบต์

รหัส Brainfuck:

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

พิมพ์

57896044618658097711785492504343953926634992332820282019728792003956564819967

ไบต์ว่าง

มันทำงานได้เช่นนี้:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

การเรียกซ้ำค่อนข้างง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.