bfcat-파일을 brainf *** 프로그램으로 인코딩


18

도전

문자열을 제공하는 프로그램이나 함수를 작성하고, Brainfuck로 컴파일되고 실행될 때 해당 문자열을 반환하는 유효한 Brainfuck 프로그램을 반환합니다.

  1. 모든 입력이 ASCII로 인코딩되었다고 가정하십시오.

  2. 출력 된 BF 프로그램이 무한 테이프가있는 환경에서 실행된다고 가정하십시오.

  3. 포인터가 셀 0에서 시작하여 모든 셀이 0으로 초기화되었다고 가정하십시오.

  4. 아래의 각 예는 주어진 입력에 대해 가능한 올바른 출력을 나타냅니다. 특히, 예에는 사람의 가독성을 돕기 위해 추가 줄 바꿈 및 공백이 포함됩니다. 솔루션은 어떤 방식 으로든 출력 된 BF 코드를 자유롭게 포맷 할 수 있습니다.

  5. 테이프는 이중 무한대입니다.

  6. 인터프리터가 제공하는 모든 셀은 정확히 8 비트 셀입니다. 오버플로 및 언더 플로는 예측 가능하고 제정신의 문제로 둘러 쌓입니다.

공백 문자열

입력이 주어지면 프로그램 / 함수는 다음을 반환 할 수 있습니다.

+++++ +++++
+++++ +++++
+++++ +++++
++ .

느낌표

입력이 주어지면 !프로그램 / 함수는 다음을 반환 할 수 있습니다.

+++++ +++++
+++++ +++++
+++++ +++++
+++
.

두 글자

입력이 주어지면 hi프로그램 / 함수는 다음을 반환 할 수 있습니다.

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

++++
.
+
.

이것은 이므로 바이트 수가 가장 적은 코드가 우선합니다. 행운을 빕니다.


10
더 많은 테스트 사례를 참조하십시오.
Leaky Nun

1
개정 9에 언급 된 지침은 정확히 무엇입니까 ?
user8397947

4
이것을 다시 열었습니다. Peter의 우려가 해결 된 것으로 생각되며, 중복으로 간주되는 항목에 대해 상당히 명확한 합의가 이루어졌으며이 과제는 이러한 기준을 충족하지 못합니다.
Martin Ender 2016 년

"오버 플로우 및 언더 플로우는 예측 가능하고 제정신 방식으로 랩핑"-127 + 1은 0으로 랩핑되고 -128-1은 0으로 랩핑됩니다. 맞습니까? 그것은 예측 가능하고 건전한 방법 중 하나입니다.
user253751 2016 년

1
@immibis 정확합니다.
user8397947

답변:


18

젤리 , 8 바이트

O”+ẋp“.>

온라인으로 사용해보십시오!

샘플 런

입력 hi을 위해이 프로그램은

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++>

(라인 피드없이) 차례로 인쇄합니다hi .

작동 원리

O”+ẋp“.>  Main link. Argument: s (string)

O         Ordinal; convert each character in s into its code point.
 ”+       Yield the character '+'.
   ẋ      Repeat '+' k times, for each k in the code points.
     “.>  Yield the string ".>".
    p     Take the Cartesian product of both results.

당신은 제한된 메모리에서 작동하지 않습니다.
Leaky Nun

5
실제로는 아닙니다. 인쇄하기 전에 전체 출력을 메모리에 저장합니다. 테이프가 충분히 큰 BF 인터프리터의 경우 테이프보다 오래 전에 문제가됩니다.
Dennis

.>출력에 왜 나타나지 않습니까?
고양이

2
@cat 직교 곱 ( p)이 ( ;€)에 추가하는 것보다 짧기 때문 입니다. 이 출력 프로그램은 인쇄 후 및 전환 전에 셀을 두 배로 늘립니다. 셀을 다시 방문하지 않기 때문에 출력에 영향을 미치지 않습니다.
Dennis

@Dennis ahh, 흥미 롭습니다.
고양이

55

Brainfuck, 55 51 바이트

,[>+++[>+++++++<-]>[<++>>+++<-]<+<[>.<-]>+++.>>-.,]

온라인으로 사용해보십시오!

hi라인 피드없이 출력 예 :

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

설명

이것은 프로그램을 작성하는 동안 테이프를 가로 질러 움직입니다. 주변 ,[...,]은 표준 입력 루프입니다. 각 문자마다 4 개의 셀을 사용합니다.

[... x a b c ...]

x입력을 쓰는 셀은 어디에 있습니까 ?

>+++[>+++++++<-]

이 부분은 셀을 사용 a쓰기 21세포로 b표준의 승산을 통해 3그리고 7.

>[<++>>+++<-]

이제 우리는 그것을 사용 21쓰기에 42a63c곱하여 23각각. 그런 <+<다음를 (코드 포인트 ) 로 x바꾸면서 셀로 돌아갑니다 . 요약 :4243+

[... x 43 21 63 ...]

이제 메인 출력 루프 :

[>.<-]

즉, 줄이면서 매번 x인쇄 +합니다.

>+++.

우리가 완료 후에 우리는 다시 +추가하여, 셀을 3주고 ..

>>-.

마지막으로으로 이동하여 ( )로 63줄이고 출력합니다. 다음 반복에서는이 셀을로 사용합니다 .62>x


5
더 많은 담당자가 있다면 나는 이것에 현상금을 줄 것입니다.
user8397947

34

Brainfuck, 39 33 32 31 바이트

-[-[>]<--<--],[[>.<+]>+.--.+<,]

테이프에 45 를 배치하는 알고리즘 은 Esolang의 Brainfuck 상수 에서 가져옵니다 .

이 대답은 출력 프로그램의 인터프리터가 랩핑 된 경계 셀을 가지고 있다고 가정합니다. 그리고 ,현재 셀 을 0으로 만듭니다 (출력 프로그램이 입력없이 실행 됨). 온라인으로 사용해보십시오!

무조건 작동하는 (더 긴) 솔루션에 대해서는 내 다른 대답을 참조하십시오 .

시운전

input Code Golf의 경우 다음 출력이 생성됩니다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,

온라인으로 사용해보십시오!

작동 원리

정수 45 (문자 코드 -)를 테이프의 셀 에 넣는 것으로 시작합니다 . 다음 코드는 이것을 달성합니다.

-      Decrement cell 0, setting it to 255.
[      While the cell under the head in non-zero:
  [>]    Advance to the next zero cell.
  <--    Decrement the cell to its left.
  <--    Decrement the next cell to the left.
]

루프에 들어가기 전에 테이프는 다음과 같습니다.

         v
000 000 255

이 두 셀 ( -2 , -10) 은이 프로그램에서 사용할 유일한 셀 입니다.

루프의 첫 번째 반복에서 가장 오른쪽 셀은 셀과 중간 셀이 두 번 감소하여 다음 상태를 유지합니다.

     v
000 254 252

다음 126 번의 반복에서, 초기 -는 중간 셀을 감소시키고 [>]<, 가장 오른쪽 셀로 점프하며 --<--, 중간 및 오른쪽 셀을 감소시킵니다. 그 결과, 3 중간 셀로부터 감산된다 (모듈 256 ) 및 (2) 가장 오른쪽 셀로부터 감산된다.

이후 254 ÷ 3 (MOD 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170÷ 3 = 84 (252)는 , 최 우측 셀의 다음 상태를두고 중간 전에 하나 제로 아웃된다.

     v
000 132 000

루프의 첫 번째 반복과 유사하게 다음 반복은 이제 가운데 셀에서 3 을 빼고 가장 왼쪽 셀에서 2 를 빼고 가장 왼쪽 셀에 머리를 놓습니다.

 v
254 129 000

그 이전의 126 반복에서와 같이 후속 반복 은 가장 왼쪽 셀에서 3 을 빼고 가장 오른쪽 셀에서 2 를 뺍니다 .

254 ÷ 3 (mod 256) = 170129 ÷ 2 (mod 256) 는 정의되지 않았 으므로 170 번 수행되며 다음 상태를 유지합니다.

 v
000 045 000

머리 아래의 셀은 0입니다. 루프가 끝납니다.

이제 출력을 생성 할 준비가되었습니다.

,      Read a character from STDIN and put it the leftmost cell.
[        While the leftmost cell is non-zero:
  [        While the leftmost cell is non-zero:
    >.     Print the content of the middle cell ('-').
    <-     Increment the leftmost cell.
  ]      If the leftmost cell held n, the above will print 256 - n minus signs
         which, when executed, will put n in cell 0 of the output program.
  >      Increment the middle cell, setting it to 46 ('.').
  .      Print its content ('.').
  --     Decrement the middle cell twice, setting it to 44 (',').
  .      Print its content (',').
         When executed, since the output program receives no input, the above
         will zero cell 0 of the output program.
  +      Increment the second cell, setting it back to 45 ('-').
  <,     Go back to the leftmost cell and read another character from STDIN.
]      Once EOF is reached, this will put 0 in the leftmost cell, ending the loop.

결과 BF가 왜 입력 문자열로 다시 변환되지 않습니까? 이것은 내가 사용 하는 통역사 이며 다른 답변에 도움이되었습니다.
Insane

2
그 통역사에는 많은 설정이 있습니다. 32 바이트 버전의 경우 동적 메모리입력 끝이\0 필요합니다 .
Dennis

10

Brainfuck, 35 13 43 바이트

++[>+<------],[[>.>+<<-]>+++.->[<.>-]<--<,]

이 답변은 출력 프로그램의 인터프리터에 대한 가정하지 않습니다 . 온라인으로 사용해보십시오!

더 짧은 해결책 (일부 통역사에서만 작동)은 다른 대답을 참조하십시오 .

시운전

input Code Golf의 경우 다음 출력이 생성됩니다.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.----------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++.--------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++.---------------------------------

온라인으로 사용해보십시오!

작동 원리

테이프의 두 번째 셀에 정수 43 (문자 코드 +) 을 넣는 것으로 시작합니다 . 다음 코드는 이것을 달성합니다.

++         Increment the first cell twice, setting it to 2.
[          While the first cell in non-zero:
  >+         Increment the second cell.
  <------    Decrement the first cell six times.
]

이것은 본질적으로 모듈 식 분할 2 ÷ 6 (mod 256)을 수행 합니다. 이후 (2 + 256) = 267 ÷ 6 ÷ 6 = 43 의 결과는 43 의도.

이제 출력을 생성 할 준비가되었습니다.

,      Read a character from STDIN and put it the first cell.
[        While the first cell is non-zero:
  [        While the first cell is non-zero:
    >.     Print the content of the second cell ('+').
    >+     Increment the third cell.
    <<-    Decrement the first cell.
  ]      If the first cell held n, the above prints n plus signs
         and puts n in the third cell.
  >+++   Add three to the second cell, setting it to 46 ('.').
  .      Print its content ('.').
  -      Decrement, setting it to 45 ('-').
  >      Advance to the third cell.
  [      While the third cell is non-zero:
    <.     Print the content of the second cell ('-').
    >-     Decrement the third cell.
  ]      If the first cell held n, the above prints n minus signs,
         thus negating the plus signs and zeroing the cell of the output program.
  <--    Subtract 2 from the second cell, setting it back to 43.
  <,     Go back to the first cell and read another character from STDIN.
]      Once EOF is reached, ',' will put 0 in the first cell, ending the loop.

아아! 당신은 44-is-44로 넘어간 밈을 깰 수 없습니다. 어쨌든 당신의 패배 시도는 실패로 보이지 않아 비참하게 실패했습니다. 내 화면에 약간의 먼지가있는 것 같습니다 (PHP, 아마도?) : P
cat

2
그 의견을 피하기 위해 아무것도 ...
데니스


4

05AB1E, 12 11 바이트

vyÇ`'+ׄ.>J

설명

v             # for each char in input string
 yÇ`          # convert to its ascii value
    '+×       # push the char '+' that many times
       „.>J   # push string ".>" and join with the plus signs
              # implicitly print combined string

온라인으로 사용해보십시오

@Adnan 덕분에 1 바이트 절약


'+×대신 F'+}바이트 를 저장합니다.
Adnan

1
@Adnan : 감사합니다! "반복"명령을 찾고있었습니다.
Emigna 2016 년

4

자바, 98 바이트

class a{String A(char[]b){String z="";for(char B:b){for(int c=B;c-->0;)z+="+";z+=".>";}return z;}}

Stringchar[]는 유틸리티 메소드가 많은 불변 의 것이므로 배열을 사용합시다!

언 골프 드 :

class a {
    void A(char[] b) {
        for (char B : b) {
            for (int c = B; c-- > 0;)
                 System.out.print('+');
            System.out.print(".>");
        }
    }
}

138 바이트 길이의 동등한 독립형 프로그램 :

interface a{static void main(String[]A){for(char b:A[0].toCharArray()){for(int B=b;B-->0;)System.out.print('+');System.out.print(".>");}}}

보너스:

interface a{static void main(String[]A){for(char b:new java.util.Scanner(new java.io.File(A[0])).useDelimiter("\\Z").next().toCharArray()){for(int B=b;B>0;B--)System.out.print('+');System.out.print(".>");}}}

이 207 바이트 앱은 제목에서 언급 한 것처럼 실제로 파일을 BF 프로그램으로 인코딩합니다.


2
그것은 단지 나입니까, ungolfed 프로그램이 들여 쓰기되는 방식은 멋지게 보입니까?
user8397947

내 답변이 기본적으로 귀하의 골프 다운 버전임을 게시하기 직전에 깨달았습니다.
Insane

2

Vitsy, 19 17 바이트

I\[&'>.+'i1-\Du]Z

I                     Get the length of the input stack.
 \[            ]      Pop n, repeat this block of code n times.
   &                  Push a new stack and move to it.
    '>.+'             Push the string '+.>' to the stack.
         i            Pop an item from the input stack and push it to the current
                      program stack.
          1-          Subtract one from the top program stack item.
            \D        Duplicate the '+' in the stack that many times.
              u       Merge the current program stack with the previous.
                Z     Output the entire current stack as a string.

참고이 대답은 내가 사용했던 것을 몇 번 중 하나라고 I하고 u. :디

온라인으로 사용해보십시오!


2

O , 13 바이트

i{'+n#*".>"}d

설명:

i              Read standard input into a string and push it onto the stack.
 {         }d  For each character in the string...
  '+           Push "+".
    n#         Convert the character (n) to its ASCII code.
      *        Multiply the "+" by the character code to get the number of +'s needed.
       ".>"    Push the string ".>".
               In O, the stack is printed after execution, so this prints out the result.

2

K6, 16 바이트

,/{|">.",x#"+"}'

용법

,/{|">.",x#"+"}'"some string"

설명

  {           }'  For each character in the string...
         x#"+"    Repeat "+" as many times as the character's ASCII code.
        ,         Combine that with...
    ">."          The code to print it and move on.
   |              But we put the string together backwards...so now it gets reversed.
,/                Combine all the substrings into one BIG string.

설명 plz : D
Addison Crump

트윗 담아 가기 :)
kirbyfan64sos 2016 년

2

파이썬 3, 43 바이트

lambda s:''.join('+'*ord(c)+'.>'for c in s)

파이썬은 각 문자의 ASCII 코드와 동등한 수의 더하기를 넣은 다음 .>인쇄하고 다음 셀로 이동합니다. brainfuck은 올바른 값까지 증가하고 인쇄 한 후 다음 셀로 이동합니다.

에 대한 출력 hi(명확성을 위해 줄 바꿈 포함) :

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

그 프로그램의 출력 :

hi

2

펄, 25 바이트

s/./"+"x ord($&).".>"/eg

용법

echo -n hi | perl -pe 's/./"+"x ord($&).".>"/eg'

설명

정규식 바꾸기 작업을 사용하여 표준 입력에 지정된 모든 줄의 모든 문자를 + 를 해당 문자의 서수 값에서 계산 된 바꾼 다음 출력 .>하여 다음 문자로 진행합니다.

perl -p플래그를 사용하여 입력을 자동으로 읽고 결과를 인쇄하여 바이트 수에 1을 더 추가합니다.


2

자바, 91 바이트

String b(char[] f){String k="";for(char b:f){for(int u=b;u>0;u--)k+="+";k+=".>";}return k;}

나를 때리기 위해 dorukayhan 에 소품 :)


상용구를 제거하고 변수의 모든 이름을 변경 한 다음 새로운 답변으로 주장 할 수는 없습니다.
Leaky Nun

@LeakyNun 나는하지 않았지만 원한다면 할 수있었습니다.
Insane

이 답변과 연결된 답변이 어떻게 다릅니 까?
Leaky Nun

@LeakyNun Downvote 및 이동
Insane

2

C, 72 64 60 바이트

main(c){for(;c=~getchar();)for(;printf(~c++?"+":".>")^2;);}

언 골프 버전 :

main( c )
{
    for ( ; c = ~getchar( ); )
        for ( ; printf( ~c++ ? "+" : ".>" ) ^ 2; );
}

다음을 사용하여 컴파일 및 테스트하십시오.
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt

결과


c비트 반전의 이유는 무엇 getchar입니까? 특히 반전을 다시 반전시키는 경우 특히 그렇습니다.
고양이

@cat c = ~getchar( )은 0으로 평가됩니다 EOF. c = ~getchar( )그리고 ~c++단순히보다 짧은 ~( c = getchar( ) )c--
Jacajack

2

CJam, 12 바이트

각 문자를 ASCII 값으로 변환하고 인쇄하기 전에 현재 셀을 해당 횟수만큼 증가시킵니다. 우리는 무한 테이프를 가지고 있기 때문에 각 문자를 처리 한 후 오른쪽으로 이동할 수 있습니다.

q{i'+*'.'>}%

온라인으로 사용해보십시오!


2

루아, 67 66 61 바이트

간단히으로 반복 인수의 각 문자를 통해, 그리고 각 하나에 대한 라인 인쇄 n +다음의 .>경우 n는 ASCII 표에서이 문자의 값입니다.

gsub 솔루션에 1 바이트를 절약하기 위해 주석에서 조언 한대로 @LeakyNun과 같이 gmatch를 사용합니다.

for c in(...):gmatch"."do print(("+"):rep(c:byte())..".>")end

gsub를 사용하는 오래된 솔루션

(...):gsub(".",function(c)print(c.rep("+",c:byte())..".>")end)

올드 67

(...):gsub(".",function(c)print(string.rep("+",c:byte())..".>")end)

그것을 실행하려면 파일로 저장하고 (예 golf.lua를 들어)로 실행하십시오 lua golf.lua "hi". 의 경우 hi출력해야합니다.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

이것을 어떻게 사용합니까? REPL에 붙여 넣기 만하면 attempt to index a nil value되며 f = ..., 똑같이 function f ... end제공합니다unexpected symbol near ':'
cat

@cat 그냥 파일에 저장하고로 실행 lua file.lua "argument"하면 게시물을 업데이트하여 지침을 제공 할 것입니다.
Katenkyo

어떻게 작동합니까? 인 ...argv를 가진 식별자?
고양이

1
@cat ...arg압축을 푼 테이블의 값을 포함합니다 . 즉 arg[1], 함수 호출에서 마지막 매개 변수로 사용하지 않으면 항상 일치합니다 .
Katenkyo

n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end48 바이트 동안
Leaky Nun

1

J, 28 바이트

[:;[:('.>',~'+'#~])"0[:]3&u:

충분히 간단합니다. 3&u:문자를 문자 코드로 변환합니다. 나머지는 '+'그 횟수만큼 반복 한 다음 .>각 줄의 끝에서 연결됩니다 .; 하여 결과를 평평하게 만듭니다.

일부 결과

   bf =: [:;[:('>.',~'+'#~])"0[:]3&u:
   bf 'hi'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.
   bf ' !'
++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++>.
   bf ' ~'
++++++++++++++++++++++++++++++++>.
                 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.


1

실제로 13 바이트

O`'+*".>"@`MΣ

온라인으로 사용해보십시오!

여기에 사용 된 전략은 다른 많은 솔루션에서와 동일합니다. 각 문자에 대해 +0으로 초기화 된 셀을 적절한 ASCII 서수로 증가시키고로 출력하고로 .다음 셀로 이동하기에 충분한 s를 출력합니다 >.

설명:

O`'+*".>"@`MΣ
O              list of ordinals (technically this is Unicode code points, but code points 0-127 are the same for Unicode and ASCII)
 `'+*".>"@`M   for each ordinal:
  '+*            push a string containing that many +s
     ".>"@       push ".>" and swap (putting it before the +s)
            Σ  concatenate all the strings (if "[", "]", and "," weren't meaningful characters in BF, this technically wouldn't be necessary)

1

Mouse-2002, 27 바이트

(?'l:l.^(l.^"+"l.1-l:)".>")

이것은 이론적으로 작동하고 언어의 설명서에 따라,하지만 마우스의 인터프리터의 레퍼런스 구현은 문자열 입력이를 추가 버그를 갖고있는 것 같아요 '위해 이렇게, a이 출력

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++.>

결과적으로 출력 a'됩니다. 그것은 괜찮을 수도 있고 아닐 수도 있으므로 여기에는 39 바이트 길이의 것이 출력되지 않으며 더 이상 유효하지 '않을 수 있습니다 .

(?'l:l.39=l.0=+0=^(l.0>^"+"l.1-l:)".>")

참조 impl에서 올바른 출력을 제공합니다. 없는 한's :)

설명 :

(              ~ while (true) {
  ?' l:        ~   l = getchar() 
  l. ^         ~   if (! (l) ) { break }
  (            ~   while (true) {
    l. ^       ~     if (! (l) ) { break }
    "+"        ~     puts("+")
    l. 1 - l:  ~     l-- // l = l - 1
  )            ~   }
  ".>"         ~   puts(".>")
)              ~ }

1

요소, 58 바이트

[ [ [ 43 ] ""replicate-as ".>"append ] { } map-as ""join ]

다음과 같이 작동합니다.

[ 
  [ 
    [ 43 ] "" replicate-as  ! ``+'' * code point, clone-like a string ""
    ".>" append             ! append ".>"
  ] 
  { } map-as                ! for each char in string and clone-like an array { }
  "" join                   ! join array of str into str by ""
]

Factor는 Brainfuck 인터프리터와 함께 제공되므로 테스트하기가 간단합니다.

bfcat.factor

USING: sequences ;
IN: bfcat

: string>brainfuck ( s -- bf )
  [ [ 43 ] "" replicate-as ".>" append ]
  { } map-as "" join ;

bfcat-tests.factor

USING: tools.test bfcat brainfuck ;
IN: bfcat.tests

{ "a"  } [ "a"  string>brainfuck get-brainfuck ] unit-test
{ "ab" } [ "ab" string>brainfuck get-brainfuck ] unit-test
{ "+++++++++++++" } [ "+++++++++++++" string>brainfuck get-brainfuck ] unit-test
{ "Code Golf" } [ "Code Golf" string>brainfuck get-brainfuck ] unit-test

산출

Unit Test: { { "a" } [ "a" string>brainfuck get-brainfuck ] }
Unit Test: { { "ab" } [ "ab" string>brainfuck get-brainfuck ] }
Unit Test: {
    { "+++++++++++++" }
    [ "+++++++++++++" string>brainfuck get-brainfuck ]
}
Unit Test: {
    { "Code Golf" }
    [ "Code Golf" string>brainfuck get-brainfuck ]
}

예이! 그들은 모두 통과합니다.


1

루비, 40 38 바이트

gets.chop.each_byte{|o|puts"+"*o+".>"}

루비는 모르지만 출력 형식이 유효한 brainfuck이고 brainfuck이 다른 문자를 신경 쓰지 않는 한 출력 형식이 중요하지 않기 때문에 puts대신 사용할 수 있다는 것을 알고 있습니다.print
cat

@ cat 아, 나는 BF가 다른 문자를 무시한다는 것을 몰랐습니다. 감사합니다!
CocoaBean

1

Sidef , 38 바이트

루비와 같은 길이야! 그 Sidef는 루비가 아닙니다 : D

read().bytes.each{|c|say"+"*c;say".>"}

몇 가지 문자를 읽은 다음 각 바이트마다 해당 작업을 수행하십시오.


1

GNU Bash, 100 85 바이트

while IFS= read -rn1 c;do printf '+%.0s' $(seq 1 $(printf %d \'$c));echo '.>';done<$1

저에게 15 바이트를 절약 해 주신 @cat 에게 감사드립니다 !

Postramble

  1. 입력 문자열이 첫 번째 인수로 전달 된 파일에있는 그대로 있다고 가정합니다.
  2. 용법: bash bfcat.sh <path to file containing string>
  3. 사용법 (명명 된 파이프 포함) : bash bfcat.sh <(echo -n '<string>')

언 골프

while IFS= read -r -n1 c # Read file byte by byte [1]
do
    n=$(printf "%d" \'"$c") # `ord` of a char in bash [2]
    printf '+%.0s' $(seq 1 $n) # emit character $n times [3]
    echo '.>' # Emit output and shift command for bf. I love infinite memory.
done <"$1"

Ungolfed 버전의 참조

  1. 바이트 단위로 파일 읽기

  2. ord bash의 문자

  3. 문자 $ n 번 방출


1
답변의 서식과 내용 중 일부를 개선했으며 링크에서 중복 정보를 제거했습니다. 마음에 들지 않으면 언제든지 취소하십시오. 또한 GNU / Linux와 같은 GNU / Bash가 아닌 GNU Bash입니다. :)
cat

1
골프 팁 (나는 bash 골퍼가 아닙니다) : read -rn1, 후 ;공간 제거 done <"$1", 총 9 바이트를 절약하기 위해 공간 제거
cat

1
@cat 굉장해 보인다! 난 정말 편집-> 미리보기-> 편집->의 습관을 얻을 필요가 ...
Yeow_Meng

1

ES6, 119 115 바이트

f=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}

@Leibrug 덕분에 4 바이트 절약


1
charCodeAt일부 var (말하자 c)에 할당 하고 다음 과 같이 사용할 수 있습니다 : s[c](i)1 바이트 단축하고 일부 문자를 제거합니다 (i는 3 : 공백 앞에 [...s], 논리 OR을 비트 단위로 바꾸고 세미콜론을 앞에 둡니다 return).
Leibrug


0

루비, 26 바이트

gsub(/./){?+*$&.ord+'.>'}

p명령 행 옵션의 경우 + 1 바이트 대한 예로하면 브레인 퍽 코드를 얻을 ABC xyz실행할 수

$ ruby -p -e 'gsub(/./){?+*$&.ord+".>"}' <<< "ABC xyz"

그리고 얻다

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

0

하스켈 50 바이트

f[]=[]
f(x:y)=replicate(fromEnum x)'+'++".>"++f y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.