brainfuck - 617 616 604 ไบต์
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
ส่วนนี้ทำให้ฉันดีขึ้นในสองวัน ฉันคิดว่ามันคุ้มค่า อาจมีบางส่วนที่สามารถตีกอล์ฟได้มากขึ้นโดยการเปลี่ยนแปลงสิ่งที่เซลล์ถูกเก็บไว้ในหรืออะไรก็ตาม แต่ตอนนี้ฉันแค่มีความสุขที่ได้ทำงาน
โปรแกรมนี้จะต้องแตกต่างอย่างสิ้นเชิงหากคำถามไม่ได้ระบุว่าจะมีการเรียงลำดับข้อมูลเข้า วิธีการทำงานนี้คือการสร้างรายการ 10 พินรอบ ๆ ที่มีการป้อนข้อมูล มันค่อนข้างสับสน แต่อาจอธิบายได้ดีกว่า:
If you input these pins: [2, 3, 6, 8, 9]
First, the program does this: [2, 3, 6, 8, 9] + [10]
Then this: [2, 3, 6] + [7] + [8, 9, 10]
Then this: [2, 3] + [4, 5] + [6, 7, 8, 9, 10]
Finally, this: [1] + [2, 3, 4, 5, 6, 7, 8, 9, 10]
To build this: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ในขณะที่มันกำลังทำอยู่มันจะจดจำว่าหมุดใดที่ผู้ใช้ใส่ไว้ กลยุทธ์นี้จะใช้ยากมากหากอินพุตไม่ได้ถูกจัดเรียง
อีกสิ่งหนึ่งที่การเรียงลำดับทำให้ง่ายขึ้นคือการตรวจจับหมายเลข 10 เนื่องจาก brainfuck เกี่ยวข้องกับแต่ละไบต์ไม่ใช่ "หมายเลข" ต่อ se มันอาจจะเป็นความเจ็บปวดในตูด แต่อินพุตที่เรียงลำดับทำให้ฉันจัดการได้ง่ายกว่ามาก กับ เหตุผลที่เกี่ยวข้องกับวิธีการจัดเก็บข้อมูลในโปรแกรม ฉันรับอินพุตหนึ่งตัวอักษรในเวลานั้นและลบ 32 จากผลลัพธ์ ถ้าเซลล์นั้นไม่ใช่ศูนย์หลังจากนั้นฉันก็เลื่อนไปข้างหน้า 4 เซลล์ ก่อนทำซ้ำ ซึ่งหมายความว่าฉันได้รับไบต์ที่ไม่ใช่ช่องว่างของการป้อนข้อมูลทุก 4 เซลล์และฉันเก็บหมุดได้อย่างมีประสิทธิภาพเป็นตัวเลขของพวกเขา + 16 อย่างไรก็ตาม 10 ใช้เวลาสองไบต์ในการพิมพ์ดังนั้นฉันต้องกรณีพิเศษมัน หากอินพุตไม่ได้เรียงฉันจะต้องตรวจสอบพิน แต่เนื่องจากมันถูกจัดเรียงมันจะเป็นพินสุดท้ายเสมอหากปรากฏขึ้น ฉันจะตรวจสอบว่า (ไบต์สุดท้ายของอินพุต + 1) == (ไบต์สุดท้ายที่สองของอินพุต) หรือไม่และถ้าเป็นเช่นนั้นจะต้องเป็น 10 ฉันจะลบไบต์สุดท้ายแล้วตั้งค่าวินาทีสุดท้ายให้เป็นสิ่งที่ระบบของฉันเข้าใจ "10" ตัวละคร'1'
และ'0'
ไม่พอดีกับไบต์เดียว แต่หมายเลข 26 แน่นอน!
การได้ลูกเล่นขึ้นมาเพื่อทำให้บางสิ่งบางอย่างทำงานได้ดีเป็นส่วนหนึ่งที่ฉันชอบใช้ภาษานี้ :)
หากคุณสนใจว่าโปรแกรมนี้ทำงานในรายละเอียดมากขึ้นคุณสามารถดูโปรแกรมพร้อมความคิดเห็นที่ฉันใช้ในขณะที่เขียนมันเพื่อให้แน่ใจว่าฉันจำได้ว่าทุกอย่างทำอะไร แม้แต่การเขียนความคิดเห็นใน brainfuck ก็ทำได้ยากเนื่องจากไม่มีไวยากรณ์ความคิดเห็น ตัวละครทุกตัวยกเว้นตัวละครใน<[+.,-]>
นั้นไม่มีตัวละครแทน มันง่ายที่จะแนะนำข้อบกพร่องโดยบังเอิญรวม.
หรือ,
ในความคิดเห็นของคุณ! นั่นเป็นเหตุผลว่าทำไมไวยากรณ์จึงไม่มีความหมายและอัฒภาคมีอยู่ทั่วไป
แก้ไข:เป็นตัวอย่างของวิธีง่าย ๆ ที่จะทำให้ตกใจ: ฉันใช้ "non-space" ในความคิดเห็นอย่างใดอย่างหนึ่ง! เมื่อผมปล้นทุกตัวอักษรที่ไม่-BF -
จากแหล่งโปรแกรมที่ผมใช้ในการทำที่เก็บไว้ใน โชคดีที่มันไม่ได้ทำลายอะไรเลย แต่ตอนนี้ฉันได้ลบมันเพื่อบันทึกไบต์แล้ว :)
แก้ไขครั้งที่สอง:นานมาแล้วที่ฉันได้สัมผัสสิ่งนี้ฮ่าฮ่า ในอีกคำตอบที่ brainfuck ในเว็บไซต์นี้ฉันสังเกตเห็นว่าฉันใช้เครื่องหมายจุลภาคในเวอร์ชันที่แสดงความคิดเห็นโดยไม่ได้ตั้งใจ เนื่องจากอินพุตหมดแล้วจึงตั้งค่าเซลล์ปัจจุบันเป็น 0 (นี่ขึ้นอยู่กับการใช้งาน แต่จากประสบการณ์ของฉันมันเป็นพฤติกรรมที่พบบ่อยที่สุด) ฉันแก้ไขข้อผิดพลาด แต่มันทำให้ฉันคิด วิธีที่ใช้สำนวนการตั้งค่าเซลล์เป็น 0 คือ[-]
(คร่าวๆwhile (*p) { *p--; }
) ซึ่งมีความยาวสองไบต์ ทุกครั้งที่อ่านอินพุตทั้งหมดฉันสามารถใช้,
แทนได้ สิ่งนี้ช่วยฉัน 2 ไบต์ในคำตอบนั้นและ 12 ในคำตอบนี้!
one flag at the very left; will be important later
+>>>>
all nonspace bytes of input separated by 3 empty cells; pin number `n` stored with value `n` plus 16
,[>++++[<-------->-]<[>>>>],]<<<<
test if last pin is 10
[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>
[
if not: find 10 minus the number it is; put that many placeholder pins (cells with value 1) at the end
,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<
]>
[
if so: get rid of '0' byte; convert '1' byte to 26 (10 plus 16)
>>[,<]<<+++++++++<
]<<<
pointer now sitting on the cell with the second greatest pin that was inputted (ie not a placeholder)
;;;;;;;
[
check for flag placed at the very beginning of the program; if present: break
-[+>>-<]>
[
find ((pin to our right) minus 1) minus pin to our left
move all pins left of us 4*(that value) cells and insert placeholder pins
>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]
]
find first non placeholder pin to our left
there has to be one because we haven't hit the flag yet
<<<[-[+>]+<<<<]>>>>-<<<<<
]>>>>>+
we have now added placeholder pins at the end and in the middle; all that's left is the beginning
subtract 17 from lowest pin and put that many placeholders to the left
++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]
subtract 32 from an empty cell 2 to the left of the lowest pin; will be useful later
<[<<<<]>>>++++[<-------->-]>
placeholder pins have the value 1; real pins have a value somewhere between 17 and 26
normalize it by stepping through and setting every pin with value != 1 to 3 (0's ascii code is 2 higher than period so this will make it easier to print later)
[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>
start writing 32s across the board; hitting every second cell
that's every pin and the cell 2 to the right of each pin
this is done in such a way that it will only halt if adding 32 to a cell sets it to 0; which is why we subtracted 0 from an empty cell earlier
it will catch us and prevent an infinite loop
+[<++++[<++++++++>-]<]
now write 13 to each pin; this adds up to 46 or 48; which are exactly the ascii values we want
>>[+++++++++++++>>>>]
we happen to have made a 14; turn it into a 10 for a newline
<<<<----
we're so close now; i can taste it
we have a list of 10 pins; each one with the ascii value that needs to be written
we have 32 everywhere because we'll need spaces
we even have a newline
the only problem now is that our list looks like this:
;;;;;;;;;;;;;;;;;;;;;;;;
;;1 2 3 4 5 6 7 8 9 10;;
;;;;;;;;;;;;;;;;;;;;;;;;
and we need to print in this order:
;;;;;;;;;;;;;;;;;;;;;;;;
;;7 8 9 10 4 5 6 2 3 1;;
;;;;;;;;;;;;;;;;;;;;;;;;
it's a pretty simple fix
once we print a pin we obviously don't need to remember it any more
so we simply print the last 4 pins on the list; destroying them on the way
then we print the last 3; which have become the ones we want
then two; then one
<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]
print pins 7 8 9 10
>[.,>>]
print pins 4 5 6
<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]
print pins 3 2
<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]
print the final pin!! :)
<[<<]<...<<.