แปล RoboCritters เป็น Brainf ***


15

RoboCritters ( นิรุกติศาสตร์ ) เป็นภาษาการเขียนโปรแกรมลึกลับใหม่ล่าสุด(ไม่ต้องค้นหามันฉันแค่คิดค้นมัน) มันแตกต่างจากBrainfuck (BF) ซึ่งซับซ้อนกว่าแผนทดแทนผู้ดำเนินการเล็กน้อย ทุกโปรแกรมใน RoboCritters เป็นตารางข้อความที่ประกอบด้วยอักขระเจ็ดตัวเท่านั้น. []/\|รวมถึงการขึ้นบรรทัดใหม่เพื่อกำหนดตาราง

ตัวอย่างโปรแกรม RoboCritters:

|\/||./|[]||
[..][][]   |
|/\|[..][..]
[..]    \/\/

ในการแปลโปรแกรม RoboCritters เป็น BF ให้ดูที่อักขระที่ไม่ใช่บรรทัดใหม่ในตารางตามลำดับการอ่านปกติ (จากซ้ายไปขวาจากบนลงล่างจากบนลงล่าง) เช่น |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/เช่น

หากส่วน 4 × 2 ของตารางขยายไปทางขวาและลงจากอักขระปัจจุบันตรงกับหนึ่งในแปดcritters หุ่นยนต์ที่ระบุไว้ด้านล่างผนวกคำสั่ง BF ที่สอดคล้องกัน( ><+-.,[]) เพื่อโปรแกรม BF (ตอนแรกว่างเปล่า)

หากส่วนของกริด 4 × 2 ไม่ตรงกับส่วนใด ๆ ของหุ่นยนต์ critters หรือออกนอกขอบเขตจะไม่มีการเพิ่มอะไรเข้าไปในโปรแกรม BF

  1. Joybot >คำสั่ง:

    [..]
    \][/
    
  2. Calmbot <คำสั่ง:

    [..]
    /][\
    
  3. Squidbot +คำสั่ง:

    [..]
    //\\
    
  4. Spiderbot -คำสั่ง:

    [..]
    ||||
    
  5. Bunnybot .คำสั่ง:

    [][]
    [..]
    
  6. Toothbot ,คำสั่ง:

    [..]
    |/\|
    
  7. Foxbot [คำสั่ง:

    |\/|
    [..]
    
  8. Batbot ]คำสั่ง:

    [..]
    \/\/
    

ดังนั้นการอ่านโปรแกรมตัวอย่าง

|\/||./|[]||
[..][][]   |
|/\|[..][..]
[..]    \/\/

เราจะเห็นได้ว่าเราพบ Foxbot เป็นครั้งแรก (ที่คอลัมน์ 1, แถวที่ 1) จากนั้นเป็น Toothbot (c1, r2) จากนั้นเป็น Bunnybot (c5, r2) และสุดท้ายเป็น Batbot (c9, r3) สิ่งนี้สอดคล้องกับโปรแกรม BF[,.]สอดคล้องกับโปรแกรม

ขอให้สังเกตว่า Foxbot และ Toothbot ทับซ้อนกัน นี่คือเจตนา; หุ่นยนต์ critters จะไม่ตีความแตกต่างกันเมื่อทับซ้อนกันที่แตกต่างกันเมื่อพวกเขาทับซ้อน

ท้าทาย

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

รายละเอียด

  • โปรแกรมอินพุต RoboCritters ทั้งหมดจะใช้ได้นั่นคือพวกมันจะเป็นบล็อกสี่เหลี่ยมของข้อความที่มีเพียงแค่ตัวอักษรเจ็ดตัว. []/\|เท่านั้นรวมถึงการขึ้นบรรทัดใหม่เพื่อกำหนดรูปร่าง บรรทัดใหม่อาจจะอยู่ในที่สะดวกตัวแทนทั่วไป คุณอาจเลือกที่จะสมมติว่าโปรแกรมมีการขึ้นบรรทัดใหม่ต่อท้าย

  • คุณต้องสนับสนุนโปรแกรม RoboCritters ที่เล็กกว่า 4 × 2 รวมถึงโปรแกรม 0 × 0 ที่ว่างเปล่า (หรือขึ้นบรรทัดใหม่) สิ่งเหล่านี้ทั้งหมดสอดคล้องกับโปรแกรม BF เปล่า (สตริงว่าง)

  • โปรแกรม BF ><+-.,[]ส่งออกควรจะเป็นสตริงหนึ่งบรรทัดเท่านั้นที่มีตัวอักษรคำสั่งแปด อาจมีทางเลือกขึ้นบรรทัดใหม่ขึ้นบรรทัดเดียว

  • ใช้อินพุตในแบบปกติ (ไฟล์ stdin / text / บรรทัดคำสั่ง) และเอาต์พุตไปยัง stdout หรือทางเลือกอื่นที่ใกล้เคียงที่สุดในภาษาของคุณ

  • แทนที่จะเป็นโปรแกรมคุณสามารถเขียนฟังก์ชันที่ใช้โปรแกรม RoboCritters เป็นสตริงและพิมพ์หรือส่งคืนสตริงโปรแกรม BF

ตัวอย่าง

  1. อินพุต: (ตัวแปรตัวอย่างด้านบน)

    |\/|[][]
    [..][][]
    |/\|[..]
        \/\/
    

    เอาท์พุท: [,.]

  2. อินพุต: (ทดสอบ critters ของหุ่นยนต์ทั้งหมด)

    [..][[[[[..]]. ]|\/|
    \][/[..]//\\[..][..]
    [..]/][\[][]|/\|[..]
    ||||/\| [..]|  |\/\/
    

    เอาท์พุท: >+[<,-.]

  3. การป้อนข้อมูล:

    [..] [..] [..] [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [..] [][] [][] [..] [..] [..] [][] [..] [..] [][] [..] [..] [][] [..] [][] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [][] [..] [..] [..] [][]
    //\\ //\\ //\\ //\\ //\\ //\\ //\\ //\\ [..] \][/ //\\ //\\ //\\ //\\ [..] \][/ //\\ //\\ \][/ //\\ //\\ //\\ \][/ //\\ //\\ //\\ \][/ //\\ /][\ /][\ /][\ /][\ |||| \/\/ \][/ //\\ \][/ //\\ \][/ |||| \][/ \][/ //\\ [..] /][\ \/\/ /][\ |||| \/\/ \][/ \][/ [..] \][/ |||| |||| |||| [..] //\\ //\\ //\\ //\\ //\\ //\\ //\\ [..] [..] //\\ //\\ //\\ [..] \][/ \][/ [..] /][\ |||| [..] /][\ [..] //\\ //\\ //\\ [..] |||| |||| |||| |||| |||| |||| [..] |||| |||| |||| |||| |||| |||| |||| |||| [..] \][/ \][/ //\\ [..] \][/ //\\ //\\ [..]
    

    ผลลัพธ์: ( โปรแกรม BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. อินพุต: (ไม่มี critters ของหุ่นยนต์อยู่)

    /\\\[].
    ]..[..]
    \\//||\
    

    เอาต์พุต: (สตริงว่าง)

เกณฑ์การให้คะแนน

การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ ( ตัวนับไบต์ที่มีประโยชน์ ) Tiebreaker เป็นโพสต์ที่โหวตมากที่สุด

คำตอบ:


9

CJam, 86 85 ไบต์

qN/S4*f+_W<\1>]z:z4few:~"¨Ý³5&ágûò{wÉ](Ý"296b6b"|[\.]/"f=2/4/"><+-.,[]":Ler{L&},

ทดสอบที่นี่

คำอธิบาย

qN/    e# Read input and split into lines.
S4*f+  e# Append four spaces to each line. This has two purposes. a) We can later join all
       e# the lines together without worrying about critters appearing across the line
       e# edges because no critter contains spaces. b) It works around a bug in CJam where
       e# the command `ew` crashes when the substring length is longer than the string.
_W<    e# Copy the lines and discard the last one.
\1>    e# Swap with the other copy and discard the first one.
]z     e# Wrap both in an array and zip them up. Now we've got an array which contains
       e# all consecutive pairs of lines.
:z     e# Zip up each of those pairs, such it becomes an array of two-character strings.
       e# We can now find the critters as 4-element subarrays in each of those arrays.
4few   e# Turn each of those arrays into a list of its (overlapping) 4-element subarrays.
:~     e# Flatten those lists, such that we get one huge array of all 4x2 blocks, in order.
"gibberish"296b6b
       e# This is an encoded form of the critters. The above produces a string of the
       e# critters in column-major order, all joined together, where the characters are
       e# represented by numbers 0 to 5.
"|[\.]/"f=
       e# Turn each number into the correct character.
2/4/   e# Split first into columns, then into critters. Now all we need to do is find these
       e# the elements of this array in the processed input.
"><+-.,[]":L
       e# A string of all BF characters in the same order as the critters. Store this in L.
er     e# Do an element-wise replacement. This will leave non-critter blocks untouched.
{L&},  e# Filter the result. The elements are now either characters, or still full 4x2
       e# blocks. We take the set intersection with the array (string) of BF characters.
       e# If the current element is itself a character, it will be coerced into an array
       e# containing that character, such that we get a non-empty intersection. If the
       e# current element is a block instead, if contains arrays itself, so the set
       e# intersection will always be empty.

       e# The resulting array of characters is the desired BF program and will be printed
       e# automatically at the end of the program.

critters ถูกเข้ารหัสด้วยสคริปต์นี้ ฉันพบฐาน 296 สำหรับการเข้ารหัสด้วยสคริปต์ Mathematica ที่ไร้เดียงสาต่อไปนี้ (ซึ่งยังคงทำงานเพื่อค้นหาฐานที่ดีกว่า):

b = 256;
While[True,
  If[
    FreeQ[
      d = IntegerDigits[15177740418102340299431215985689972594497307279709, b], 
      x_ /; x > 255
    ], 
    Print@{b, Length@d}
  ];
  b += 1;
]

3

JavaScript ES6, 209 198 192 ไบต์

f=c=>{s=''
b=o=>c.substr(o,4)||1
for(i in c)s+=!~(d='1\\][/1/][\\1//\\\\1||||[][]11|/\\||\\/|11\\/\\/'.replace(/1/g,'[..]').indexOf(b(i)+b(++i+c.search(`
`))))|d%8?'':'><+-.,[]'[d/8]
return s}

ตัวอย่างสแต็กด้านล่างมีโค้ดที่ไม่ได้รับการแก้ไขซึ่งคุณสามารถเรียกใช้ในเบราว์เซอร์ใดก็ได้

var f = function(c) {
  var s = '';
  var b = function(o) {
    // If it is looking on the last line, this will return an empty string
    // the second time, which could cause an inaccurate match.
    // `||1` makes it return 1 instead of '', which won't match.
    return c.substr(o, 4) || 1;
  }
  for (var i in c) {
    r = b(i) + b(++i + c.search('\n'));
    d = '1\\][/1/][\\1//\\\\1||||[][]11|/\\||\\/|11\\/\\/'.replace(/1/g, '[..]').indexOf(r);
    s += !~d || d % 8 ? '' : '><+-.,[]' [d / 8];
  }
  return s;
}

// GUI code below
function run(){document.getElementById('s').innerHTML=f(document.getElementById('t').value);};document.getElementById('run').onclick=run;run()
<textarea id="t" cols="30" rows="10">
[..][[[[[..]]. ]|\/|
\][/[..]//\\[..][..]
[..]/][\[][]|/\|[..]
||||/\| [..]|  |\/\/</textarea><br /><button id="run">Run</button><br /><code id="s"></code>

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