brainfuck - 617 616 604 byte
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Điều này đã cho tôi phần tốt hơn của hai ngày. Tôi nghĩ nó đáng đấy. Có lẽ các bộ phận có thể được đánh gôn nhiều hơn bằng cách thay đổi tế bào gì đó được lưu trữ trong bất cứ thứ gì, nhưng ngay bây giờ tôi rất vui khi tôi làm cho nó hoạt động.
Chương trình này sẽ phải hoàn toàn khác nếu câu hỏi không chỉ định rằng đầu vào sẽ được sắp xếp. Cách thức hoạt động này là bằng cách xây dựng một danh sách 10 chân xung quanh các chân được nhập. Điều đó thật khó hiểu nhưng có lẽ điều này sẽ giải thích nó tốt hơn:
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]
Trong khi thực hiện điều đó, nó sẽ nhớ những chân nào mà người dùng đặt ở đó và những cái nào được đặt ở đó. Chiến lược này sẽ rất khó sử dụng nếu đầu vào không được sắp xếp.
Một điều nữa mà việc sắp xếp dễ dàng hơn là phát hiện ra số 10. Vì brainfuck xử lý từng byte riêng lẻ, không phải là "số" mỗi se, nó có thể gây khó khăn cho ass, nhưng đầu vào được sắp xếp giúp tôi dễ dàng xử lý hơn với. Lý do cho điều đó có liên quan đến cách tôi lưu trữ dữ liệu trong chương trình. Tôi lấy một ký tự đầu vào tại thời điểm và trừ 32 từ kết quả. Nếu ô đó khác không sau đó, tôi di chuyển về phía trước 4 ô. trước khi lặp lại. Điều này có nghĩa là tôi nhận được một byte không gian đầu vào cứ sau 4 ô và tôi lưu trữ các chân một cách hiệu quả dưới dạng số của chúng + 16. Tuy nhiên, 10 mất hai byte để nhập, vì vậy tôi phải đặc biệt sử dụng nó. Nếu đầu vào không được sắp xếp, tôi phải xem qua các chân, nhưng vì nó được sắp xếp nên nó sẽ luôn là chân cuối cùng nếu nó xuất hiện. Tôi kiểm tra xem (byte cuối cùng của đầu vào + 1) == (byte cuối cùng thứ hai của đầu vào) và nếu vậy, nó phải là 10. Tôi thoát khỏi byte cuối cùng và đặt byte cuối cùng vào thứ mà hệ thống của tôi hiểu là "10". Các nhân vật'1'
và '0'
không vừa trong một byte đơn, nhưng số 26 chắc chắn có!
Đến với các thủ thuật chỉ để làm cho một cái gì đó hoạt động là phần yêu thích của tôi khi sử dụng ngôn ngữ này. :)
Nếu bạn quan tâm đến cách chương trình này hoạt động chi tiết hơn, bạn có thể xem chương trình với các nhận xét tôi đã sử dụng trong khi viết để đảm bảo tôi nhớ mọi thứ đã làm. Ngay cả việc viết bình luận trong brainfuck cũng khó, vì không có cú pháp bình luận. Thay vào đó, mọi nhân vật ngoại trừ những nhân vật trong <[+.,-]>
đều là những người không hoạt động. Thật dễ dàng để giới thiệu các lỗi bằng cách vô tình bao gồm .
hoặc ,
trong ý kiến của bạn! Đó là lý do tại sao ngữ pháp rất hay và dấu chấm phẩy ở khắp mọi nơi.
EDIT: Như một ví dụ về việc điều này dễ dàng như thế nào: Tôi đã sử dụng "phi không gian" trong một trong các ý kiến! Khi tôi loại bỏ tất cả các ký tự không phải bf khỏi nguồn, chương trình tôi đã sử dụng để giữ nó trong -
. May mắn thay, nó đã không phá vỡ bất cứ điều gì, nhưng bây giờ tôi đã loại bỏ nó để tiết kiệm một byte. :)
EDIT II: Đã lâu rồi tôi mới chạm vào cái này, haha. Trong một câu trả lời khác trên trang web này, tôi nhận thấy rằng tôi đã vô tình sử dụng dấu phẩy trong phiên bản nhận xét. Vì đầu vào đã cạn kiệt, nó đặt ô hiện tại thành 0 (điều này phụ thuộc vào việc triển khai, nhưng theo kinh nghiệm của tôi, đó là hành vi phổ biến nhất). Tôi đã sửa lỗi, nhưng nó làm tôi suy nghĩ. Cách thành ngữ để đặt một ô thành 0 là [-]
(đại khái while (*p) { *p--; }
), dài hơn hai byte. Bất cứ khi nào tất cả các đầu vào đã được đọc, tôi có thể sử dụng ,
thay thế. Điều này đã tiết kiệm cho tôi 2 byte trong câu trả lời đó và 12 byte trong câu trả lời này!
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!! :)
<[<<]<...<<.