Dịch RoboCritters sang Brainf ***


15

RoboCritters ( từ nguyên ) là một ngôn ngữ lập trình bí truyền hoàn toàn mới (đừng bận tâm tìm kiếm nó, tôi chỉ phát minh ra nó). Đây là một biến thể của Brainfuck (BF), phức tạp hơn một chút so với các sơ đồ thay thế toán tử thông thường. Mỗi chương trình trong RoboCritters là một lưới văn bản hình chữ nhật chỉ chứa bảy ký tự . []/\|, cộng với các dòng mới để định hình lưới.

Ví dụ chương trình RoboCritters:

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

Để dịch chương trình RoboCritters sang BF, hãy xem từng ký tự không phải dòng mới trong lưới theo thứ tự đọc bình thường (từ trái sang phải rồi từ trên xuống dưới), vd |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Nếu phần 4 × 2 của lưới kéo dài sang phải từ nhân vật hiện tại khớp chính xác với một trong tám sinh vật robot được liệt kê bên dưới, hãy nối lệnh BF tương ứng ( ><+-.,[]) vào chương trình BF (ban đầu trống).

Nếu phần lưới 4 × 2 không khớp với bất kỳ sinh vật robot nào hoặc vượt ra ngoài giới hạn , không có gì được thêm vào chương trình BF.

  1. Joybot, >chỉ huy:

    [..]
    \][/
    
  2. Calmbot, <lệnh:

    [..]
    /][\
    
  3. Squidbot, +chỉ huy:

    [..]
    //\\
    
  4. Spiderbot, -chỉ huy:

    [..]
    ||||
    
  5. Bunnybot, .chỉ huy:

    [][]
    [..]
    
  6. Răng, ,lệnh:

    [..]
    |/\|
    
  7. Foxbot, [chỉ huy:

    |\/|
    [..]
    
  8. Batbot, ]chỉ huy:

    [..]
    \/\/
    

Vì vậy, đọc chương trình ví dụ

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

chúng ta có thể thấy rằng lần đầu tiên chúng ta bắt gặp một Foxbot (ở cột 1, hàng 1), sau đó là một Răng hàm (c1, r2), sau đó là Bunnybot (c5, r2) và cuối cùng là Batbot (c9, r3). Điều này tương ứng với chương trình BF [,.].

Lưu ý rằng Foxbot và Toothbot trùng nhau. Đây là cố ý; sinh vật robot không được giải thích khác nhau khi chúng chồng lên nhau .

Thử thách

Viết chương trình ngắn nhất có thể có trong chương trình RoboCritters và xuất ra tương đương BF của nó. Bạn không cần chạy BF hoặc kiểm tra xem nó có hợp lệ không, chỉ dịch mã RoboCritters sang mã BF.

Chi tiết

  • Tất cả các chương trình RoboCritters đầu vào sẽ hợp lệ, nghĩa là chúng sẽ là một khối văn bản chính xác hình chữ nhật chỉ chứa bảy ký tự . []/\|, cộng với các dòng mới để định hình nó. Các dòng mới có thể trong bất kỳ đại diện chung thuận tiện . Bạn có thể tùy ý giả sử các chương trình có một dòng mới duy nhất.

  • Bạn phải hỗ trợ các chương trình RoboCritters nhỏ hơn 4 × 2, bao gồm chương trình trống 0 × 0 (hoặc dòng mới). Tất cả đều tương ứng với chương trình BF trống (chuỗi trống).

  • Chương trình BF đầu ra phải là một chuỗi một dòng chỉ chứa tám ký tự lệnh BF ><+-.,[]. Có thể tùy chọn có một dòng mới duy nhất.

  • Lấy đầu vào theo bất kỳ cách thông thường nào (stdin / tệp văn bản / dòng lệnh) và xuất ra thiết bị xuất chuẩn hoặc ngôn ngữ thay thế gần nhất của ngôn ngữ của bạn.

  • Thay vì một chương trình, bạn có thể viết một hàm lấy chương trình RoboCritters làm chuỗi và in hoặc trả về chuỗi chương trình BF.

Ví dụ

  1. Đầu vào: (biến thể của ví dụ trên)

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

    Đầu ra: [,.]

  2. Đầu vào: (kiểm tra tất cả các sinh vật robot)

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

    Đầu ra: >+[<,-.]

  3. Đầu vào:

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

    Đầu ra: ( Chương trình BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Đầu vào: (không có sinh vật robot hiện diện)

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

    Đầu ra: (chuỗi trống)

Chấm điểm

Đệ trình ngắn nhất tính bằng byte thắng. ( Bộ đếm byte tiện dụng. ) Tiebreaker là bài được bình chọn cao nhất.

Câu trả lời:


9

CJam, 86 85 byte

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

Kiểm tra nó ở đây.

Giải trình

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.

Các sinh vật được mã hóa với kịch bản này . Tôi đã tìm thấy cơ sở 296 cho mã hóa với tập lệnh Mathicala khá ngây thơ (vẫn đang chạy để tìm kiếm một cơ sở tốt hơn):

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 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}

Đoạn trích dưới đây chứa mã không được mã hóa mà bạn có thể dễ dàng chạy trong bất kỳ trình duyệt nào.

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.