brainfuck - 617 616 604 bayt
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Bu beni iki günün daha iyi bir parçası aldı. Bence buna değdi. Muhtemelen bir şeyde hangi hücrede saklanan hücreyi değiştirerek daha fazla golf oynayabilecek kısımlar vardır, ama şu anda çalışmasından dolayı mutluyum.
Soru, girdinin sıralanacağını belirtmediyse, bu programın tamamen farklı olması gerekecektir. Bunun işleyişi, girilenlerin etrafına 10 iğneli bir liste oluşturmaktır. Bu biraz kafa karıştırıcı ama belki bu daha iyi açıklar:
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]
Bunu yaparken, kullanıcının oraya hangi iğne koyduğunu, hangisinin oraya koyduğunu hatırlar. Girdi sıralanmamışsa, bu stratejiyi kullanmak çok zor olurdu.
Sıralamanın kolaylaştırdığı bir başka şey de 10 sayısının tespitidir. Brainfuck bireysel baytlarla ilgilendiği için "sayılar" değil, eşek için bir acı olabilirdi, ancak sıralanan girdi benim başa çıkmamı çok kolaylaştırdı. ile. Bunun nedeni, verileri programda nasıl sakladığımla ilgili. Girişte bir karakter alırım ve sonuçtan 32 çıkarırım. Hücre bundan sonra sıfır değilse, 4 hücreyi ileri doğru hareket ettiririm. tekrar etmeden önce. Bu, her 4 hücrede girdi olmayan bir boşluk baytı elde ettiğim ve pinleri + 16 gibi etkili bir şekilde sakladığım anlamına gelir. Girdi sıralanmadıysa, pinlere bakmak zorunda kalırdım, ancak sıralandığından beri her zaman son pin olacak. (+ 1 girişinin son baytı) == (girişin ikinci son baytı) olup olmadığını kontrol ettim ve öyleyse 10 olmalı. Son bayttan kurtulup ikinci sonuncuyu da sistemimin anladığı şekilde ayarlayın. "10". Karakterler'1'
ve '0'
tek bir bayta sığmıyor, ancak 26 sayısı kesin!
Sadece bir şeyler yapmak için püf noktaları ile gelmek, bu dili kullanmanın en sevdiğim yanı. :)
Bu programın nasıl daha ayrıntılı olarak çalışmasıyla ilgileniyorsanız, programı, her şeyin ne yaptığını hatırladığımdan emin olmak için yazarken kullandığım yorumlar ile birlikte görebilirsiniz. Yorum yazarken bile beyin fırtınasıyla yorum yazmak bile zordur. Bunun yerine, içinde olanlar hariç her karakter <[+.,-]>
op-op değildir. Yanlışlıkla yorumlarınıza .
veya ,
yorumlarınıza hatalar eklemek kolaydır ! Bu yüzden dilbilgisi çok garip ve noktalı virgüller her yerde.
EDIT: Bunun berbat olmasının kolay bir örneği olarak: yorumlardan birinde "boşluksuz" kullandım! Tüm bf olmayan karakterleri kaynaktan çıkardığımda, bunu programda tutardım -
. Neyse ki hiçbir şey kırmadı, ama şimdi bir bayt kurtarmak için kaldırdım. :)
EDIT II: Bir süredir buna dokunduğumdan beri haha. Bu sitedeki başka bir beyefendi cevabında, yorumlanan versiyonda yanlışlıkla virgül kullandığımı fark ettim. Girdi zaten tükenmiş olduğundan, mevcut hücreyi 0 olarak ayarlayın (bu uygulamaya bağlıdır, ancak benim tecrübeme göre en yaygın davranış budur). Böceği düzelttim ama beni düşündürdü. Bir hücreyi 0 olarak ayarlamak için deyimsel yol [-]
(kabaca while (*p) { *p--; }
), ki iki bayt daha uzun. Tüm girdiler okunduğunda, ,
onun yerine kullanabilirim . Bu bana bu cevabı 2 bayt, bu cevabında 12 bayt kazandırdı!
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!! :)
<[<<]<...<<.