Terjemahkan RoboCritters ke Brainf ***

15

RoboCritters ( etimologi ) adalah bahasa pemrograman esoterik baru (jangan repot-repot mencarinya, saya hanya menciptakannya). Ini adalah varian dari Brainfuck (BF), sedikit lebih kompleks daripada skema substitusi operator yang biasa. Setiap program di RoboCritters adalah kotak teks persegi panjang yang hanya berisi tujuh karakter . []/\|, ditambah baris baru untuk membentuk kotak.

Contoh program RoboCritters:

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

Untuk menerjemahkan program RoboCritters ke dalam BF, lihat setiap karakter non-baris baru dalam kisi dalam urutan pembacaan normal (kiri-ke-kanan lalu atas-ke-bawah), misalnya |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Jika bagian 4 × 2 dari kisi memanjang ke kanan dan ke bawah dari karakter saat ini persis sama dengan salah satu dari delapan robot robot yang tercantum di bawah ini, tambahkan perintah BF yang sesuai ( ><+-.,[]) ke program BF (awalnya kosong).

Jika bagian kotak 4 × 2 tidak cocok dengan makhluk robot atau keluar dari batas , tidak ada yang ditambahkan ke program BF.

  1. Joybot, >perintah:

    [..]
    \][/
    
  2. Calmbot, <perintah:

    [..]
    /][\
    
  3. Squidbot, +perintah:

    [..]
    //\\
    
  4. Spiderbot, -perintah:

    [..]
    ||||
    
  5. Bunnybot, .perintah:

    [][]
    [..]
    
  6. Toothbot, ,perintah:

    [..]
    |/\|
    
  7. Foxbot, [perintah:

    |\/|
    [..]
    
  8. Batbot, ]perintah:

    [..]
    \/\/
    

Jadi, bacalah contoh programnya

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

kita dapat melihat bahwa pertama-tama kita bertemu dengan Foxbot (pada kolom 1, baris 1), kemudian Toothbot (c1, r2), kemudian Bunnybot (c5, r2), dan akhirnya sebuah Batbot (c9, r3). Ini sesuai dengan program BF [,.].

Perhatikan bahwa Foxbot dan Toothbot tumpang tindih. Ini disengaja; robot makhluk tidak ditafsirkan berbeda ketika mereka tumpang tindih .

Tantangan

Tulis program sesingkat mungkin yang menggunakan program RoboCritters dan hasilkan BF-nya yang setara. Anda tidak perlu menjalankan BF atau memeriksa apakah valid, hanya menerjemahkan kode RoboCritters ke kode BF.

Detail

  • Semua program input RoboCritters akan valid, yaitu mereka akan menjadi blok teks yang persis persegi panjang hanya berisi tujuh karakter . []/\|, ditambah baris baru untuk membentuknya. Baris baru mungkin dalam representasi umum yang nyaman . Anda dapat secara opsional menganggap program memiliki satu baris baru.

  • Anda harus mendukung program RoboCritters yang lebih kecil dari 4 × 2, termasuk program 0 × 0 kosong (atau baris baru). Ini semua sesuai dengan program BF kosong (string kosong).

  • Program BF output harus berupa string satu baris yang hanya berisi delapan karakter perintah BF ><+-.,[]. Secara opsional mungkin ada satu baris tambahan.

  • Ambil input dengan cara biasa (stdin / file teks / baris perintah) dan output ke stdout atau alternatif terdekat bahasa Anda.

  • Alih-alih suatu program Anda dapat menulis fungsi yang mengambil program RoboCritters sebagai string dan mencetak atau mengembalikan string program BF.

Contohnya

  1. Input: (varian contoh di atas)

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

    Keluaran: [,.]

  2. Input: (menguji semua makhluk robot)

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

    Keluaran: >+[<,-.]

  3. Memasukkan:

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

    Output: ( Program BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Input: (tidak ada robot makhluk)

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

    Output: (string kosong)

Mencetak gol

Pengajuan terpendek dalam byte menang. ( Penghitung byte berguna. ) Tiebreaker adalah pos dengan suara tertinggi.

Hobi Calvin
sumber

Jawaban:

9

CJam, 86 85 byte

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

Uji di sini.

Penjelasan

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.

Makhluk itu disandikan dengan skrip ini . Saya menemukan base 296 untuk encoding dengan skrip Mathematica berikut yang agak naif (yang masih berjalan untuk mencari basis yang lebih baik):

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

JavaScript ES6, 209 198 192 byte

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}

Cuplikan Stack di bawah ini berisi kode ungolfed yang dapat Anda jalankan dengan mudah di browser apa pun.

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>

NinjaBearMonkey
sumber