bfcat - เข้ารหัสไฟล์เป็นโปรแกรม *** brainf


18

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ให้สตริงส่งคืนโปรแกรม Brainfuck ที่ถูกต้องซึ่งเมื่อรวบรวมและดำเนินการเป็น Brainfuck ส่งคืนสตริงนั้น

  1. สมมติว่าอินพุตทั้งหมดถูกเข้ารหัสเป็น ASCII

  2. สมมติว่าโปรแกรมเอาท์พุท BF จะดำเนินการในสภาพแวดล้อมด้วยเทปที่ไม่มีที่สิ้นสุด

  3. สมมติว่าตัวชี้เริ่มต้นที่เซลล์ 0 โดยที่ทุกเซลล์เริ่มต้นเป็นค่าศูนย์

  4. ตัวอย่างแต่ละตัวอย่างด้านล่างแสดงถึงเอาต์พุตที่ถูกต้องที่เป็นไปได้สำหรับอินพุตที่กำหนด โดยเฉพาะอย่างยิ่งตัวอย่างรวมถึงการขึ้นบรรทัดใหม่และช่องว่างเพื่อช่วยให้มนุษย์สามารถอ่านได้ โซลูชั่นมีอิสระที่จะฟอร์แมตโค้ด BF เอาท์พุทในทางใดทางหนึ่ง

  5. เทปไม่มีที่สิ้นสุดเป็นทวีคูณ

  6. เซลล์ทั้งหมดที่ล่ามแปลเป็นเซลล์ขนาด 8 บิต ล้นและอันเดอร์โฟลว์ล้อมรอบในเรื่องที่คาดเดาได้และมีสติ

ตัวอย่าง

สตริงช่องว่าง

เมื่อรับอินพุตโปรแกรม / ฟังก์ชันของคุณอาจกลับมา:

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

เครื่องหมายอัศเจรีย์

เมื่อรับอินพุต!โปรแกรม / ฟังก์ชันของคุณอาจกลับมา:

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

ตัวอักษรสองตัว

เมื่อรับอินพุตhiโปรแกรม / ฟังก์ชันของคุณอาจกลับมา:

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

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

++++
.
+
.

นี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ โชคดี.


10
กรุณาทดสอบเพิ่มเติม
Leun Nun

1
สิ่งที่ว่าเป็นแนวทางที่กล่าวถึงในการทบทวน 9 ?
user8397947

4
ฉันเปิดใหม่นี้ ฉันคิดว่าความกังวลของปีเตอร์ได้รับการแก้ไขแล้วและเรามีความเห็นพ้องที่ค่อนข้างชัดเจนว่าสิ่งใดที่นับว่าซ้ำซ้อนและความท้าทายนี้ไม่เป็นไปตามเกณฑ์เหล่านั้น
Martin Ender

"การโอเวอร์โฟลว์และอันเดอร์โฟล์ถูกห่อในลักษณะที่คาดเดาได้และมีสติ" - ดังนั้น 127 + 1 wraps ที่ 0 และ -128-1 ก็ wraps เป็น 0 ด้วยใช่ไหม? นั่นเป็นวิธีหนึ่งที่คาดเดาได้และมีสติ
253751

1
@immibis แน่นอน
user8397947

คำตอบ:


18

เยลลี่ขนาด 8 ไบต์

O”+ẋp“.>

ลองออนไลน์!

วิ่งตัวอย่าง

สำหรับอินพุตhiโปรแกรมนี้จะพิมพ์

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

(โดยไม่ต้อง linefeeds) ที่ซึ่งในทางกลับกันการพิมพ์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.

คุณไม่ทำงานในหน่วยความจำที่ จำกัด ของฉัน
Leun Nun

5
ไม่ได้จริงๆ เราทั้งสองเก็บผลลัพธ์ทั้งหมดในหน่วยความจำก่อนที่จะพิมพ์ สำหรับล่าม BF ที่มีเทปขนาดใหญ่พอที่จะกลายเป็นปัญหานานก่อนที่เทปจะทำ
Dennis

เหตุใดจึงไม่.>ปรากฏในผลลัพธ์
แมว

2
@cat เนื่องจากผลิตภัณฑ์ Cartesian ( p) สั้นกว่าผนวกเข้ากับแต่ละรายการ ( ;€) โปรแกรม ouput เหล่านี้จะเพิ่มเซลล์เป็นสองเท่าหลังจากพิมพ์และก่อนเปลี่ยน เนื่องจากเราไม่เคยกลับไปที่เซลล์จึงไม่ส่งผลกระทบต่อเอาต์พุต
Dennis

@Dennis ahh น่าสนใจ
แมว

55

Brainfuck, 55 51 ไบต์

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

ลองออนไลน์!

ตัวอย่างเอาต์พุตสำหรับhi(โดยไม่มี linefeeds):

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

คำอธิบาย

สิ่งนี้จะเคลื่อนที่ข้ามเทปขณะที่เขียนโปรแกรม สภาพแวดล้อม,[...,]คือลูปอินพุตมาตรฐาน สำหรับแต่ละตัวละครเราใช้สี่เซลล์:

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

ที่xเป็นมือถือที่เราเขียนการป้อนข้อมูลเพื่อ

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

ส่วนนี้จะใช้มือถือaที่จะเขียน21ลงในเซลล์bผ่านคูณมาตรฐานและ37

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

ตอนนี้เราใช้ที่21จะเขียน42ลงไปaและ63เข้าไปcโดยคูณด้วย2และ3ตามลำดับ จากนั้น<+<ย้ายกลับไปที่เซลล์xในขณะที่เปลี่ยน42เป็น43(จุดรหัสของ+) สรุป:

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

ตอนนี้ห่วงเอาท์พุทหลัก:

[>.<-]

นั่นคือในขณะที่ลดจำนวนxเราพิมพ์หนึ่ง+ครั้งในแต่ละครั้ง

>+++.

หลังจากที่เราเสร็จแล้วเรานำมาใช้+เซลล์โดยการเพิ่มที่จะให้3.

>>-.

ในที่สุดเราย้ายไปที่63ลดลงเป็น62( >) และส่งออกที่เช่นกัน xย้ำต่อไปจะใช้มือถือนี้เป็น


5
ฉันจะให้รางวัลนี้ถ้าฉันมีตัวแทนเพิ่มเติม
user8397947

34

Brainfuck, 39 33 32 31 ไบต์

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

อัลกอริทึมที่สถานที่ที่45ในเทปจะนำมาจากEsolang ของค่าคงที่

คำตอบนี้อนุมานว่าล่ามของโปรแกรมเอาต์พุตมีการล้อมรอบเซลล์ที่ถูก จำกัด และ,เลขศูนย์เซลล์ปัจจุบัน (หมายความว่าโปรแกรมเอาต์พุตจะทำงานโดยไม่มีอินพุต) ลองออนไลน์!

สำหรับ (อีกต่อไป) วิธีการแก้ปัญหาที่ทำงานโดยไม่มีเงื่อนไขให้ดูคำตอบอื่น ๆ ของฉัน

ทดสอบการทำงาน

สำหรับอินพุต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 , -1และ0 - เป็นเซลล์เดียวที่เราจะใช้ในโปรแกรมนี้

ในครั้งแรกของการวนซ้ำแต่ละครั้งเซลล์ที่อยู่ด้านขวาสุดคือจากนั้นเซลล์และเซลล์กลางจะถูกลดค่าลงสองครั้งออกจากสถานะต่อไปนี้

     v
000 254 252

ในการทำซ้ำ 126 ครั้งถัดไปการ-ลดลงเริ่มต้นของเซลล์กลาง[>]<กระโดดไปที่เซลล์ที่อยู่ด้านขวาสุดและ--<--ลดค่าที่ตรงกลางและเซลล์ที่เหมาะสม เป็นผลให้3ถูกลบออกจากเซลล์กลาง (โมดูโล256 ) และ2ถูกลบออกจากเซลล์ขวาสุด

ตั้งแต่254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170และ252 ÷ 3 = 84เซลล์ที่อยู่ด้านขวาสุดจะถูกทำให้เป็นศูนย์ก่อนกลางออกจากสถานะต่อไปนี้

     v
000 132 000

ในทำนองเดียวกันกับการวนซ้ำครั้งแรกของการวนซ้ำการทำซ้ำครั้งถัดไปจะลบ3ออกจากเซลล์กลางและ2จากเซลล์ซ้ายสุดโดยวางหัวไว้ที่เซลล์ซ้ายสุด

 v
254 129 000

การวนซ้ำครั้งที่ตามมาเช่นเดียวกับในการวนซ้ำก่อนหน้า 126 ลบ3จากเซลล์ซ้ายสุดและ2จากเซลล์ขวาสุด

เนื่องจาก254 ÷ 3 (mod 256) = 170และ129 ÷ 2 (mod 256)ไม่ได้ถูกกำหนดซึ่งจะทำ 170 ครั้งโดยออกจากสถานะต่อไปนี้

 v
000 045 000

เซลล์ใต้หัวเป็นศูนย์ ลูปสิ้นสุด

ตอนนี้เราพร้อมที่จะสร้างผลผลิตแล้ว

,      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 ผลลัพธ์จึงไม่แปลกลับไปยังสตริงอินพุตสำหรับฉัน นี่คือล่ามฉันใช้ซึ่งใช้ได้ผลกับคำตอบอื่น ๆ
บ้า

2
ล่ามนั้นมีการตั้งค่ามากมาย สำหรับรุ่น 32 ไบต์คุณต้องมีหน่วยความจำแบบไดนามิกและในตอนท้ายของการป้อนข้อมูล: \0
Dennis

10

Brainfuck, 35 13 43 ไบต์

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

คำตอบนี้ไม่ได้ตั้งสมมติฐานเกี่ยวกับล่ามของโปรแกรมเอาท์พุท ลองออนไลน์!

สำหรับการแก้ปัญหาที่สั้นกว่า (ซึ่งทำงานได้เฉพาะกับบางล่าม) ดูคำตอบอื่น ๆ ของฉัน

ทดสอบการทำงาน

สำหรับอินพุต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 (สมัย 256) ตั้งแต่(2 + 256) ÷ 6 = 258 ÷ 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.

แย่จัง! คุณไม่สามารถแยก meme ที่ตัดกับ 44 ออกเป็น 44 ได้มาเลย! อย่างไรก็ตามความพยายามของคุณที่จะเอาชนะมันล้มเหลวอย่างน่าสังเวชเพราะมันดูไม่ออกดูเหมือนว่ามีสิ่งสกปรกบนหน้าจอของฉัน (บางทีอาจเป็น PHP): P
cat

2
อะไรก็ตามที่จะหลีกเลี่ยงความคิดเห็นนั้นไม่ได้ ...
Dennis


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

ลองออนไลน์

บันทึกแล้ว 1 ไบต์ขอบคุณ @Adnan


'+×แทนที่จะF'+}บันทึกเป็นไบต์
Adnan

1
@Adnan: ขอบคุณ! ฉันกำลังมองหาคำสั่ง "ทำซ้ำ"
Emigna

4

Java, 98 ไบต์

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

Stringไม่มีอะไรมากไปกว่าที่ไม่เปลี่ยนรูป char[] s ที่ด้วยวิธีการยูทิลิตี้มากมายดังนั้นเรามาใช้อาร์เรย์กันเถอะ!

Ungolfed:

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

รับรู้ก่อนที่ฉันจะโพสต์ว่าคำตอบของฉันเป็นรุ่นของคุณลง golfed
บ้า

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และ: D

ลองออนไลน์!


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.

คำอธิบายโปรด: D
Addison Crump

@VTCAKAVSMoACE เสร็จสิ้น! :)
kirbyfan64sos

2

Python 3, 43 ไบต์

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

Python ใส่จำนวนของ pluses ที่เทียบเท่ากับรหัส ASCII ของอักขระแต่ละตัวตามด้วย .>เพื่อพิมพ์และย้ายไปยังเซลล์ถัดไป brainfuck เพิ่มขึ้นถึงค่าที่ถูกต้องพิมพ์และย้ายไปยังเซลล์ถัดไป

เอาต์พุตสำหรับhi(พร้อมบรรทัดใหม่เพื่อความชัดเจน):

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

ผลลัพธ์ของโปรแกรมนั้น:

hi

2

Perl, 25 ไบต์

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

การใช้

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

คำอธิบาย

ใช้การดำเนินการแทนที่นิพจน์ปกติเพื่อแทนที่อักขระทุกตัวในทุกบรรทัดที่กำหนดในอินพุตมาตรฐานด้วยจำนวนที่+คำนวณจากค่าลำดับของอักขระนั้นจากนั้นเอาต์พุต.>ไปยังการพิมพ์และเลื่อนไปยังอักขระถัดไป

ใช้-pแฟล็กperl เพื่ออ่านอินพุตและพิมพ์ผลลัพธ์โดยอัตโนมัติโดยเพิ่ม 1 รายการลงใน bytecount


2

Java, 91 ไบต์

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

อุปกรณ์ประกอบฉากเพื่อdorukayhanสำหรับการตีฉันไปที่ :)


คุณไม่สามารถลบแผ่นสำเร็จรูปและเปลี่ยนชื่อของตัวแปรทั้งหมดแล้วอ้างว่าเป็นคำตอบใหม่
Leun Nun

@LeakyNun ฉันไม่ได้ทำ แต่ฉันทำได้ถ้าต้องการ
บ้า

คำตอบนี้แตกต่างจากคำตอบที่คุณเชื่อมโยงถึงอย่างไร
Leun 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

Lua, 67 66 61 Bytes

เพียงแค่ย้ำกว่าตัวละครในการโต้แย้งในแต่ละครั้งและพิมพ์สายหนึ่งที่มีแต่ละn +s ตามด้วย.>ที่nคุ้มค่าของตัวละครตัวนี้ในตาราง ASCII ที่

ใช้ gmatch ตามที่ @LeakyNun แนะนำไว้ในความคิดเห็นสำหรับการบันทึก 1 ไบต์บนโซลูชัน gsub

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())..".>")endfor 48 bytes
Leaky Nun

1

J, 28 ไบต์

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

เรียบง่ายพอสมควร 3&u:แปลงตัวอักษรให้เป็นรหัสถ่าน ส่วนที่เหลือเป็นเพียงการทำซ้ำ'+'จำนวนครั้งนั้นจากนั้นเชื่อมต่อกับ.>ที่ส่วนท้ายของแต่ละบรรทัดและ;แผ่ผล

ผลลัพธ์บางอย่าง

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


1

จริงแล้ว 13 ไบต์

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

ลองออนไลน์!

กลยุทธ์ที่ใช้ที่นี่เป็นเช่นเดียวกับในหลายโซลูชั่นอื่น ๆ - สำหรับตัวละครแต่ละตัวพอเอาท์พุท+เพื่อเพิ่มเซลล์ศูนย์ที่เริ่มไปลำดับ ASCII ที่เหมาะสมการส่งออกมันด้วยและย้ายไปยังเซลล์ถัดไปด้วย.>

คำอธิบาย:

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:)".>")

สิ่งนี้ทำงานได้ทั้งในทางทฤษฎีและตามเอกสารของภาษา แต่การใช้งานการอ้างอิงของล่ามของ Mouse ดูเหมือนว่าจะมีข้อผิดพลาดที่การป้อนข้อมูลสตริงต่อท้าย a 'ดังนั้นสำหรับaผลลัพธ์นี้

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

a'ซึ่งในการเปิดเอาท์พุท นั่นอาจจะใช่หรือไม่ใช่ก็ได้ดังนั้นนี่ ยาว39 ไบต์ที่ไม่ส่งออก'เลยและมีแนวโน้มว่าจะไม่ถูกต้องมากกว่านี้

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

ซึ่งให้ผลลัพธ์ที่ถูกต้องในการอ้างอิง ตราบใดที่ไม่มี'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+".>"}

ฉันไม่รู้ทับทิม แต่ฉันรู้ว่าคุณสามารถใช้putsแทนได้printเนื่องจากรูปแบบของผลลัพธ์ไม่สำคัญตราบใดที่มันเป็น brainfuck ที่ถูกต้องและ brainfuck ไม่สนใจตัวละครอื่น ๆ
แมว

@cat โอ้ฉันไม่รู้ว่า bf ละเว้นอักขระอื่น ๆ ขอบคุณ!
CocoaBean

1

Sidef , 38 ไบต์

เฮ้ความยาวเท่ากับทับทิม! Sidef นั้นไม่ใช่ Ruby: 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

ขอบคุณ@catสำหรับการบันทึกฉัน 15 ไบต์!

Postramble

  1. ถือว่าสตริงอินพุตถูกแสดงตาม - อยู่ในไฟล์ที่ส่งเป็นอาร์กิวเมนต์แรก
  2. การใช้งาน: bash bfcat.sh <path to file containing string>
  3. การใช้งาน (มีชื่อไปป์): bash bfcat.sh <(echo -n '<string>')

Ungolfed

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. อ่านไฟล์ byte byte

  2. ord ของถ่านในทุบตี

  3. ปล่อยอักขระ $ n ครั้ง


1
ฉันได้ปรับปรุงการจัดรูปแบบและสิ่งต่าง ๆ ในคำตอบของคุณและลบข้อมูลที่ซ้ำซ้อนออกจากลิงก์ อย่าลังเลที่จะเลิกทำถ้าคุณไม่ชอบ นอกจากนี้ยังเป็น GNU Bash ไม่ใช่ GNU / Bash เช่น GNU / Linux :)
แมว

1
เคล็ดลับการเล่นกอล์ฟ (ฉันไม่นักกอล์ฟทุบตี): read -rn1กำจัดช่องว่างหลังจาก;นั้นกำจัดพื้นที่ในdone <"$1"เพื่อบันทึกทั้งหมด 9 ไบต์
แมว

1
@cat มันดูยอดเยี่ยม! ฉันต้องแก้ไขตัวเอง -> preview-> edit -> ...
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}

บันทึกแล้ว 4 ไบต์ขอบคุณ @Leibrug


1
คุณสามารถกำหนดcharCodeAtให้ var (สมมติว่าc) และใช้เช่นนั้นs[c](i)เพื่อย่อให้สั้นลง 1 ไบต์และยังลบอักขระบางตัวออก (ฉันพบ 3: ช่องว่างก่อน[...s]แทนที่ตรรกะหรือด้วยบิตทริกเกอร์และเซมิโคลอนก่อนreturn)
Leibrug


0

ทับทิมขนาด 26 ไบต์

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

+ 1 ไบต์สำหรับpตัวเลือกบรรทัดคำสั่ง เพื่อเช่นรับรหัส brainfuck สำหรับABC xyzคุณสามารถเรียกใช้

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

และรับ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.