brainfuck - 617 616 604 byte
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Ini menghabiskan waktu dua hari bagi saya. Saya pikir itu sepadan. Mungkin ada bagian yang bisa lebih golf dengan mengubah sel tempat penyimpanan sesuatu atau apa pun, tapi saat ini saya senang saya membuatnya berfungsi.
Program ini harus benar-benar berbeda jika pertanyaan tidak menentukan bahwa input akan diurutkan. Cara kerjanya adalah dengan membuat daftar 10 pin di sekitar pin yang diinput. Itu agak membingungkan tapi mungkin ini akan menjelaskannya dengan lebih baik:
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]
Saat melakukan itu, ia mengingat pin mana yang diletakkan pengguna di sana dan mana yang diletakkan di sana. Strategi ini akan sangat sulit digunakan jika input tidak diurutkan.
Hal lain yang membuat penyortiran menjadi lebih mudah adalah mendeteksi angka 10. Karena brainfuck berurusan dengan byte individu, bukan "angka" per se, itu bisa saja menyebalkan, tetapi input yang diurutkan membuatnya lebih mudah bagi saya untuk berurusan. dengan. Alasannya ada hubungannya dengan bagaimana saya menyimpan data dalam program. Saya mengambil input satu karakter pada waktu dan mengurangi 32 dari hasilnya. Jika sel tidak nol setelah itu, saya bergerak maju 4 sel. sebelum diulang. Ini berarti bahwa saya mendapatkan byte input non-spasi setiap 4 sel, dan saya secara efektif menyimpan pin sebagai nomor mereka + 16. Namun, 10 membutuhkan dua byte untuk mengetik, jadi saya harus membuat case khusus. Jika input tidak diurutkan, saya harus melihat melalui pin, tetapi karena diurutkan maka akan selalu menjadi pin terakhir jika muncul. Saya memeriksa apakah (byte terakhir dari input + 1) == (byte terakhir dari input) dan jika demikian, itu harus 10. Saya menyingkirkan byte terakhir dan mengatur yang terakhir kedua untuk apa yang dipahami oleh sistem saya sebagai "10". Karakter'1'
dan '0'
tidak muat dalam satu byte, tetapi angka 26 pasti!
Menghasilkan trik hanya untuk membuat sesuatu bekerja sama sekali adalah bagian favorit saya menggunakan bahasa ini. :)
Jika Anda tertarik dengan cara kerja program ini secara lebih rinci, Anda dapat melihat program dengan komentar yang saya gunakan saat menulisnya untuk memastikan saya ingat apa yang dilakukan semuanya. Bahkan menulis komentar di brainfuck itu sulit, karena tidak ada sintaksis komentar. Alih-alih, setiap karakter kecuali yang <[+.,-]>
berada di no-ops. Mudah untuk memperkenalkan bug dengan memasukkan .
atau ,
dalam komentar Anda secara tidak sengaja ! Itu sebabnya tata bahasanya sangat miring dan titik koma ada di mana-mana.
EDIT: Sebagai contoh betapa mudahnya ini gagal: Saya menggunakan "non-space" di salah satu komentar! Ketika saya menghapus semua karakter non-bf dari sumbernya, program yang biasa saya lakukan menyimpannya di -
. Untungnya itu tidak merusak apa pun, tapi sekarang saya sudah menghapusnya untuk menghemat satu byte. :)
EDIT II: Sudah lama sejak saya menyentuh yang ini, haha. Dalam jawaban brainfuck lain di situs ini, saya perhatikan bahwa saya tidak sengaja menggunakan koma di versi komentar. Karena input sudah habis, ini mengatur sel saat ini ke 0 (ini tergantung implementasi, tetapi dalam pengalaman saya itu adalah perilaku yang paling umum). Saya memperbaiki bug, tetapi itu membuat saya berpikir. Cara idiomatis untuk mengatur sel ke 0 adalah [-]
(kira-kira while (*p) { *p--; }
), yang dua byte lebih lama. Setiap kali semua input telah dibaca, saya dapat menggunakannya ,
sebagai gantinya. Ini menyelamatkan saya 2 byte dalam jawaban itu, dan 12 dalam yang ini!
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!! :)
<[<<]<...<<.