Перекладіть RoboCritters у Brainf ***


15

RoboCritters ( етимологія ) - це абсолютно нова езотерична мова програмування (не переймайтесь пошуком її, я її просто винайшов). Це варіант з Brainfuck (BF), кілька більш складним , ніж звичайні схеми заміщення оператора. Кожна програма в RoboCritters - це прямокутна сітка тексту, яка містить лише сім символів . []/\|, а також нові рядки для формування сітки.

Приклад програми RoboCritters:

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

Щоб перевести програму RoboCritters в BF, подивіться на кожен не новий рядок символів у сітці у звичайному порядку читання (зліва направо, потім зверху вниз), наприклад |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Якщо розділ 4 × 2 сітки розширення вправо і вниз від поточного символу точно збігається з одним з восьми роботів тварюк , перерахованих нижче, додайте відповідну команду BF ( ><+-.,[]) до (спочатку порожній) програмі BF.

Якщо секція сітки 4 × 2 не відповідає жодному з робочих факторів або не виходить за межі , до програми BF нічого не додається.

  1. Joybot, командуйте >:

    [..]
    \][/
    
  2. Спокій, <командування:

    [..]
    /][\
    
  3. Squidbot, +команда:

    [..]
    //\\
    
  4. Spiderbot, -команда:

    [..]
    ||||
    
  5. Bunnybot, .команда:

    [][]
    [..]
    
  6. Зубний робот, ,команда:

    [..]
    |/\|
    
  7. Foxbot, [команда:

    |\/|
    [..]
    
  8. Batbot, ]команда:

    [..]
    \/\/
    

Отже, читаючи приклад програми

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

ми можемо побачити, що ми спочатку стикаємося з Foxbot (у колонці 1, рядок 1), потім зубним роботом (c1, r2), потім Bunnybot (c5, r2) і нарешті Batbot (c9, r3). Це відповідає програмі BF [,.].

Зауважте, що Foxbot і Toothbot перекриваються. Це навмисно;Робочі створення не інтерпретуються інакше, коли вони перетинаються .

Виклик

Напишіть найкоротшу можливу програму, яка бере програму RoboCritters і виводить її еквівалент BF. Вам не потрібно запускати BF або перевіряти, чи він дійсний, лише перекладіть код RoboCritters у BF-код.

Деталі

  • Усі вхідні програми RoboCritters будуть дійсними, тобто вони будуть точно прямокутним блоком тексту, що містить лише сім символів . []/\|, а також нові рядки для його формування. Нові рядки можуть бути в будь-якому зручному загальному поданні . Можливо, ви можете припустити, що програми мають один нижній рядок.

  • Ви повинні підтримувати програми RoboCritters розміром менше 4 × 2, включаючи порожню (або одну нову лінію) 0 × 0. Всі вони відповідають порожній програмі BF (порожній рядок).

  • Вихідна програма BF повинна бути однорядковою рядком, що містить лише вісім командних символів BF ><+-.,[]. За бажанням може бути один зворотний новий рядок.

  • Візьміть введення будь-яким звичним способом (stdin / текстовий файл / командний рядок) та виведіть у stdout або найближчу альтернативу вашій мові.

  • Замість програми ви можете написати функцію, яка сприймає програму RoboCritters як рядок і друкує або повертає рядок програми BF.

Приклади

  1. Введення: (варіант прикладу вище)

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

    Вихід: [,.]

  2. Вхід: (тестує всі роботодавці)

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

    Вихід: >+[<,-.]

  3. Вхід:

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

    Вихід: (програма BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Вхід: (немає роботодавців)

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

    Вихід: (порожній рядок)

Оцінка балів

Виграє найкоротше подання в байтах. ( Зручний байтовий лічильник. ) 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.

Ці фактори були закодовані цим сценарієм . Я знайшов базу 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.