RoboCritter를 Brainf로 번역 ***


15

RoboCritters ( etymology )는 완전히 새로운 난해한 프로그래밍 언어 입니다. 일반적인 연산자 대체 체계보다 약간 더 복잡한 Brainfuck (BF) 의 변형 입니다 . RoboCritters의 모든 프로그램은 7 자만 포함하는 사각형의 텍스트 격자와 격자 모양을위한 개행입니다.. []/\|

RoboCritters 프로그램 예 :

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

RoboCritters 프로그램을 BF로 번역하려면 그리드에서 줄 바꿈이 아닌 각 문자를 일반적인 읽기 순서 (왼쪽에서 오른쪽으로, 위에서 아래로)로보십시오 (예 :) |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

현재 캐릭터에서 오른쪽 아래로 확장되는 그리드의 4x2 섹션이 아래에 나열된 8 개의 로봇 크 리터 중 하나와 정확히 일치 하면 해당 BF 명령 ( ><+-.,[])을 (초기 비어 있음) BF 프로그램에 추가하십시오.

4 × 2 그리드 섹션 로봇 크 리터 와 일치하지 않거나 범위를 벗어나 면 BF 프로그램에 아무것도 추가되지 않습니다.

  1. 조이 봇, >명령 :

    [..]
    \][/
    
  2. Calmbot, <명령 :

    [..]
    /][\
    
  3. 오징어, +명령 :

    [..]
    //\\
    
  4. 스파이더 봇, -명령 :

    [..]
    ||||
    
  5. 버니 봇, .명령 :

    [][]
    [..]
    
  6. 치약, ,명령 :

    [..]
    |/\|
    
  7. 폭스 봇, [명령 :

    |\/|
    [..]
    
  8. 배트 봇, ]명령 :

    [..]
    \/\/
    

예제 프로그램을 읽으면

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

먼저 Foxbot (열 1, 행 1), Toothbot (c1, r2), Bunnybot (c5, r2) 및 Batbot (c9, r3)이 발생 함을 알 수 있습니다. 이것은 BF 프로그램에 해당합니다 [,.].

Foxbot과 Toothbot이 겹칩니다. 이것은 의도적입니다. 로봇 크리 터는 겹칠 때 다르게 해석되지 않습니다 .

도전

RoboCritters 프로그램에서 가능한 가장 짧은 프로그램을 작성하고 BF에 해당하는 프로그램을 출력하십시오. BF를 실행할 필요가 없거나 유효한지 확인하고 RoboCritters 코드를 BF 코드로만 변환하십시오.

세부

  • 모든 입력 RoboCritters 프로그램은 유효합니다. 즉, 7 개의 문자 만 포함하는 정확히 직사각형의 텍스트 블록이 될 . []/\|것입니다. 줄 바꿈은 편리한 공통 표현으로 표시 될 수 있습니다 . 선택적으로 프로그램에 단일 후행 줄 바꿈이 있다고 가정 할 수 있습니다.

  • 0 × 0 비어 있거나 단일 개행 프로그램을 포함하여 4 × 2보다 작은 RoboCritters 프로그램을 지원해야합니다. 이들은 모두 빈 BF 프로그램 (빈 문자열)에 해당합니다.

  • 출력 BF 프로그램은 8 개의 BF 명령 문자 만 포함하는 1 행 문자열이어야합니다 ><+-.,[]. 선택적으로 단일 후행 줄 바꿈이있을 수 있습니다.

  • 일반적인 방법으로 입력하고 (stdin / text 파일 / 명령 줄) stdout 또는 가장 가까운 언어로 출력하십시오.

  • 프로그램 대신 RoboCritters 프로그램을 문자열로 사용하여 BF 프로그램 문자열을 인쇄하거나 반환하는 함수를 작성할 수 있습니다.

  1. 입력 : (위 예제의 변형)

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

    산출: [,.]

  2. 입력 : (모든 로봇 동물 테스트)

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

    산출: >+[<,-.]

  3. 입력:

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

    출력 : ( BF Hello World program )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  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.

동물들은 이 스크립트 로 인코딩 되었습니다 . 나는 다음과 같은 다소 순수한 Mathematica 스크립트 (아직 더 나은베이스를 찾기 위해 여전히 실행 중임)를 사용하여 인코딩의 기본 296을 찾았습니다.

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

3

자바 스크립트 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.