Brainfuck - 617 616 604 Bytes
+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.
Das hat mich fast zwei Tage gekostet. Ich denke, es hat sich gelohnt. Es gibt wahrscheinlich Teile, die man besser spielen kann, wenn man ändert, in welcher Zelle etwas gespeichert ist oder was auch immer, aber im Moment bin ich einfach froh, dass es funktioniert.
Dieses Programm müsste völlig anders sein, wenn die Frage nicht angibt, dass die Eingabe sortiert werden soll. Die Art und Weise, wie dies funktioniert, besteht darin, eine Liste von 10 Stiften um die eingegebenen Stifte herum zu erstellen. Das ist etwas verwirrend, aber vielleicht wird es dadurch besser erklärt:
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]
Dabei merkt es sich, welche Pins der Benutzer dort abgelegt hat und welche dort abgelegt wurden. Diese Strategie wäre sehr schwierig anzuwenden, wenn die Eingabe nicht sortiert wäre.
Eine andere Sache, die das Sortieren erleichtert, ist das Erkennen der Nummer 10. Da es sich bei Brainfuck um einzelne Bytes und nicht um "Zahlen" an sich handelt, hätte es ein Ärgernis sein können, aber die sortierte Eingabe hat es mir viel leichter gemacht, damit umzugehen mit. Der Grund dafür hat damit zu tun, wie ich Daten im Programm gespeichert habe. Ich nehme die Eingabe jeweils um ein Zeichen und subtrahiere 32 vom Ergebnis. Wenn die Zelle danach nicht Null ist, gehe ich 4 Zellen vorwärts. vor dem Wiederholen. Dies bedeutet, dass ich alle 4 Zellen ein Nicht-Leerzeichen-Byte an Eingaben erhalte und Pins effektiv als Nummer + 16 speichere. Für die Eingabe von 10 werden jedoch zwei Bytes benötigt, weshalb ich es in Sonderfällen tun musste. Wenn der Eingang nicht sortiert wäre, müsste ich die Stifte durchsehen, aber da er sortiert ist, ist er immer der letzte Stift, wenn er angezeigt wird. Ich überprüfe, ob das (letzte Byte der Eingabe + 1) == (das vorletzte Byte der Eingabe) ist und wenn ja, muss es 10 sein. Ich werde das letzte Byte los und setze das vorletzte auf das, was mein System versteht "10". Die Charaktere'1'
und '0'
passen nicht in ein einziges Byte, aber die Nummer 26 tut es auf jeden Fall!
Tricks auszudenken, um etwas überhaupt zum Laufen zu bringen, ist mein Lieblingsteil bei der Verwendung dieser Sprache. :)
Wenn Sie daran interessiert sind, wie dieses Programm im Detail funktioniert, können Sie das Programm mit den Kommentaren anzeigen, die ich beim Schreiben verwendet habe, um sicherzustellen, dass ich mich an alles erinnere, was es getan hat. Selbst das Schreiben von Kommentaren in Brainfuck ist schwierig, da es keine Kommentarsyntax gibt. Stattdessen sind alle Charaktere außer denen in <[+.,-]>
No-Ops. Es ist einfach, Fehler einzufügen, indem Sie versehentlich .
oder ,
in Ihre Kommentare aufnehmen! Deshalb ist die Grammatik so wackelig und Semikolons sind überall.
EDIT: Als Beispiel dafür, wie einfach es ist, Fehler zu machen: Ich habe in einem der Kommentare "Nicht-Leerzeichen" verwendet! Als ich alle Nicht-BF-Zeichen aus dem Quellcode entfernt habe, wurde das Programm, mit dem ich das gemacht habe, im beibehalten -
. Zum Glück hat es nichts kaputt gemacht, aber jetzt habe ich es entfernt, um ein Byte zu speichern. :)
EDIT II: Es ist schon eine Weile her, seit ich dieses berührt habe, haha. In einer anderen Antwort auf dieser Website habe ich bemerkt, dass ich in der kommentierten Version versehentlich ein Komma verwendet habe. Da die Eingabe bereits erschöpft war, wurde die aktuelle Zelle auf 0 gesetzt (dies ist implementierungsabhängig, aber meiner Erfahrung nach das häufigste Verhalten). Ich habe den Fehler behoben, aber ich habe nachgedacht. Der idiomatische Weg, eine Zelle auf 0 zu setzen, ist [-]
(ungefähr while (*p) { *p--; }
), was zwei Bytes länger ist. Jedes Mal, wenn alle Eingaben gelesen wurden, kann ich sie ,
stattdessen verwenden. Dies ersparte mir 2 Bytes in dieser Antwort und 12 in dieser!
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!! :)
<[<<]<...<<.