Gepostet von hier .
Diese Herausforderung ist aus dieser Frage hoch "destilliert" . Besonderer Dank geht an @Akababa!
In dieser Aufgabe sollten Sie am Anfang der Zeichenfolge und nach jedem Zeichen ein Ausrufezeichen einfügen.
Regeln
- Es wird immer eine nicht leere Zeichenfolge eingegeben. Die Eingabe enthält auch keine Registerkarten. Sie können davon ausgehen, dass die Eingabe nur nicht erweiterte druckbare ASCII-Zeichen und Zeilenumbrüche enthält.
- Die Eingabe enthält keine nachgestellten Zeilenumbrüche, solange Ihre Sprache keine Zeilenumbrüche erkennt.
- Dies ist ein Code-Golf- Wettbewerb; Die kürzeste Antwort sollte gewinnen.
Beispiele
- 4 Zeilenumbrüche führen zu 5 durch Zeilenumbrüche getrennten Ausrufezeichen. Es ist sehr schwierig, diesen Text als Markdown-Text zu definieren, daher wird dies stattdessen angegeben.
1 2 3 4 5 6 129591 129012 129127 129582 0
Ausgänge
! 1! ! 2! !3! ! 4! ! 5! ! 6! ! 1! 2! 9! 5! 9! 1! ! 1! 2! 9! 0! 1! 2! ! 1! 2! 9! 1! 2! 7! ! 1! 2! 9! 5! 8! 2! ! ! 0!
asd afjoK ak: e kPrLd fOJOE; KFO KFkepjgop sgpaoj faj
Ausgänge
! a! s! d! ! a! f! j! o! K! ! a! k!:! e! ! k! P! r! L! d! ! ! ! ! ! f! O! J! O! E!;! ! ! ! ! ! K! F! O! ! K! F! K! E! P! J! G! O! P! ! s! g! p! a! o! j! ! ! ! f! a! j!
Ein Basistestfall mit nur einem Zeichen:
ein
Ausgänge
!ein!
(Auto-Vervollständigung! Nur ein Scherz, so etwas gibt es nicht.) Enthält Ausrufezeichen:
!! !! !! !! !!
Ausgänge:
!!!!! !!!!! !!!!! !!!!! !!!!!
a\n
und nicht erkennena
kann, können wir dann verlangen, dass keine Zeilenumbrüche folgen?Antworten:
QuadR , 1 Byte
Vielen Dank an A__ für die Halbierung der Byteanzahl!
Probieren Sie es online!
Ersetzt nichts durch
!
quelle
Python 3 , 27 Bytes
Probieren Sie es online!
Ehrlich gesagt hoffe ich, dass mir jemand einen coolen Weg zeigen kann, dies mit einer geringeren Anzahl von Bytes zu tun.
quelle
!!
, was in diesem Fall für mich sinnvoll ist). Wenn du den String meinst\n
: Das tut es, da die Ausgabe korrekt ist!\n!
.!\n!\n!
. gute Arbeit.Python 3 , 26 Bytes
Probieren Sie es online!
quelle
Retina 0.8.2 , 2 Bytes
Probieren Sie es online! Endlich eine Herausforderung, in die Retina eingebaut ist!
quelle
Haskell, 18 Bytes
-1 Byte danke an @nimi
Probieren Sie es online!
quelle
('!':).
Speichert ein Byte.Python 2 , 27 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 19 Byte
Nimmt die Eingabe als Array von Zeichen.
Probieren Sie es online!
JavaScript (ES6),
23 bis20 Byte3 Bytes gespart dank @ShieruAsakoto
Übernimmt die Eingabe als Zeichenfolge.
Probieren Sie es online!
JavaScript (ES6), 22 Byte
Vorgeschlagen von @tjjfvi
Übernimmt die Eingabe als Zeichenfolge.
Probieren Sie es online!
quelle
.replace
22 Bytess=>[,...s,,].join`!`
R , 25 Bytes
Probieren Sie es online!
Eine Funktion, die einen Zeichenvektor akzeptiert und zurückgibt.
quelle
scan(,'')
, wie so tio.run/##K/r/P724NElDSUlHSVFJpzg5MU9DR11dU/O/...scan
(aber mit der Lösung von Nick, zumindest wenn Sie die Ausgabe mit anzeigencat
).8086-Computercode, COM-Format (MS-DOS 2+), 32 Byte
(-1 je nach Emulator: siehe unten)
Um die besten Ergebnisse zu erzielen, leiten Sie die Standardeingabe aus einer Datei um, da die Eingabe aufgrund der fehlenden Pufferung eine ungewöhnlich aussehende Ausgabe ergibt. Außerdem sehen Zeilenumbrüche etwas seltsam aus, weil sie als gespeichert
CR LF
werden und dasCR
Teil die Ausgabe durcheinander bringt .Dieses Programm verhält sich in einer tatsächlichen MS-DOS-Emulation (z. B. PCjs) gut, aber DOSBox schien Probleme mit Strg + Z EOF zu haben (siehe Kommentare in der Assembly-Liste). Versuchen Sie daher NICHT , Eingaben über die Konsole in DOSBox einzugeben, es sei denn, Sie Fügen Sie den zusätzlichen Scheck hinzu!
Einige interessante Teile:
Ich sparte durch die Wiederverwendung von Speicher einige Datenraum , die bereits ausgeführt worden war (die
21H
inINT 21H
sein geschieht!
)Ich konnte fast einen interessanten Trick anwenden, den ich auf der Seite "Die verborgene Kraft von BCD-Anweisungen" gefunden hatte, der es mir ermöglicht hätte,
AAA
anstelle eines StandardsTEST
einen VergleichAL
mit 0 durchzuführen und dabei ein Byte zu sparen. Leider ist dies nicht vollständig dokumentiert, so dass ich mich nicht darauf verlassen konnte: PCjs passen zum Beispiel nur die Carry- und Auxiliary-Carry-Flags an. :-(Assembler-Code (TASM-Idealmodus):
quelle
Brainfuck ,
2422 Bytes-2 Bytes dank JoKing.
Probieren Sie es online!
quelle
Pepe , 47 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Labyrinth ,
19 11 109 BytesProbieren Sie es online!
Wie?
Wir betreten das Labyrinth oben links mit einem unendlichen Stapel von Nullen ...
Zum Glück müssen wir nicht druckbare Dateien nicht verarbeiten, sonst würde uns das erste Null-Byte umdrehen
,
und Chaos anrichten.quelle
sed , 12 bytes
Probieren Sie es online!
-3 Bytes dank Cows Quack
quelle
s/\b\|\B/!/g
funktioniert auch für 12 BytesZsh , 32 Bytes
Probieren Sie es online!
(s::)
Teilt sich in Zeichen,''
fügt am Anfang ein leeres Element hinzu und gibtecho -nE $c!
jeweils ein Echo gefolgt von einem!
.quelle
Perl 5 -p0,
176 bytesTry it online!
My original answer was
-p
and$_='!'.s,.,$&!,gr
. Thanks to @Nahuel Fouilleul for cutting 11 bytes and to @Grimy for the-p0
tip.quelle
-lp
gives incorrect output for the\n\n\n\n
test case (returns 4 newline-separated!
instead of the specified 5).-p0
works correctly.6502, 12 bytes (13 bytes if Apple II)
6502
The machine code assumes that a pair of zero page locations are connected to character input ($FE) and output (FF) hardware. Many 6502-based systems facilitate I/O in this fashion, albeit I/O address are usually not in zero page.
For simplicity, I used Py65, a 6502 microcomputer system simulator written in Python.
Hier ist ein Speicherauszug von Py65. Sie können den folgenden Code an einer beliebigen Stelle auf der Nullseite laden, sodass sich $ FE und $ FF nicht überschneiden.
In einem Windows-Befehlsfenster können Sie beliebigen Text einfügen (Strg + V) oder einfach eingeben. Drücken Sie bei der Eingabe Strg + J für eine neue Zeile (dasselbe ASCII-Zeichen). Drücken Sie Strg + C, um den Prozessor zu unterbrechen und zur Py65-Eingabeaufforderung zurückzukehren.
Assembler-Code ist natürlich einfacher zu lesen.
Der Übersichtlichkeit halber hier der Assembler-Code im CBA65- Format.
Apple II
Der obige Code geht davon aus, dass eine Null angibt, dass keine Eingabe vorliegt, und setzt die Abfrage fort, bis ein Wert ungleich Null zurückgegeben wird.
Zum Vergleich signalisieren Apple I und Apple II die Verfügbarkeit eines neuen Zeichens durch Setzen von Bit 7 der Tastatur-E / A-Adresse, das nach dem Abrufen des Zeichens gelöscht werden muss. Auf diesen Systemen wird die Zeichen-E / A normalerweise durch Aufrufen von Systemüberwachungsroutinen ausgeführt, anstatt direkt auf die Hardware zuzugreifen.
Durch Aufrufen von RDKEY ($ FD0C) und COUT ($ FDED) kann das Apple II-Äquivalent des oben genannten in 13 Bytes codiert werden und kann überall im RAM ausgeführt werden. Hier ist der Code, den ich in einem Apple // e-Emulator ausgeführt habe, a2ix auf Android 9.
Das Drücken der Eingabetaste hat den gleichen Effekt wie eine neue Zeile.
Haben Sie bemerkt, dass anstelle des normalen ASCII-Werts # $ 21 für das Ausrufezeichen # $ A1 verwendet wird? Das liegt daran, dass beim Senden von Standard-ASCII-Werten an COUT diese im "inversen Modus" (schwarz auf weiß) angezeigt werden. Um ASCII in normalem Weiß auf Schwarz anzuzeigen, müssen Sie dem Zeichenwert im Akkumulator vor dem Aufruf von COUT # $ 80 hinzufügen. Da RDKEY Zeichen mit dem Hi-Bit-Satz zurückgibt, löschten Assembly-Programme im Allgemeinen das Bit des Zeichens, um seinen ASCII-Wert zu erhalten, bevor sie es verwendeten.
quelle
Bash, 36 bytes
Try it online!
This counts on the newline terminating the input for the last ! mark.
quelle
!
at the end of the input.MarioLANG,
9594908969 bytesTry it online!
First time trying out MarioLANG, that was a lot of fun!
Thanks to Jo King for -20 bytes
Explanation:
So, as the name implies, MarioLANG is made to execute like a game of Super Mario Bros. It operates similarly to BF, with memory arranged in a tape of cells. There are operators to increment, decrement, print (as ascii or numeric) and read into the current memory cell, and operators to move left or right along the tape.
Mario (the instruction pointer) always begins in the top left cell of the program, with his intended direction of motion set to the right. If Mario does not have a floor-like object beneath him (=, ", or #), he will fall until he reaches a floor-like object. If Mario leaves the program space, the program ends due to Game Over :(
This specific program can basically be split into two halves: the setup, and the loop.
In the Setup section, we're simply incrementing the first memory cell until we reach 33 - the ASCII value for "!". Easy enough; if this can be golfed, it's purely a matter of shape. Mario starts from the top left, picks up 10 coins, starts falling when picking up the 11th, switches directions, then repeats. He picks up the last 11 coins without switching directions; he ends the setup section at the bottom-rightmost "+".
In the loop section, Mario starts by reaching an elevator. The "!" operator makes him cease motion, so that he remains on the elevator. On the way up, it prints the corresponding ASCII character to the current memory cell's value (this one is always 33, "!"), then switches to the next cell in memory. Mario reaches the top and sets his direction to the right. He falls, and reads a character from input as its ASCII value (or -1 if no character). We increment because the only measure of control in MarioLANG is to skip an instruction if the current memory cell has a value of 0. If it does, we skip changing Mario's direction, so he will walk right off of the next floor to his doom. If it does not, we set direction to left; walking left off of the floor below decrements the current cell back to its previous value, that value is printed, and we move back to the first memory cell before getting back on the elevator.
Previous version (89 bytes):
quelle
Perl 6,
1611 bytesTry it online!
Replaces all zero width matches with exclamation marks. Null regexes are not allowed, so we use a capture marker to capture nothing instead
quelle
C# (Visual C# Interactive Compiler), 28 bytes
Try it online!
quelle
05AB1E, 4 bytes
I/O as a list of characters.
Try it online.
Explanation:
quelle
Befunge-98 (PyFunge), 7 bytes
Try it online!
quelle
Triangular,
1513 bytesTry it online!
-2 bytes after remembering that Triangular has a conditional halt operator.
I believe this is as short as it gets on this one. Triangular does have conditional direction-change operators, but they unfortunately work differently than the other conditionals. While all others check if ToS <= 0, the direction-changing conditionals check ToS != 0. If this weren't the case, we would have 10 bytes in the form of
Bq3~#*/@<<
.Ungolfed:
Previous Version (15 bytes):
quelle
SimpleTemplate, 23 bytes
This is a language I wrote, and it was supposed to be for templates, but well.
Should be almost self-explanatory, once you see the ungolfed code:
And an explanation:
!
- Prints the literal!
character{@each argv.0 as char}
- Loops through every character, with the value set to the variablechar
(optional, the default variable is_
).argv.0
is the first parameter passed to therender()
method of the compiler.{@echo char}!
- outputs thechar
variable and a literal!
character.For the golfed version, the default variable
_
is used instead.{@/}
- closes the loop (optional)Pure SimpleTemplate solution:
Creates a function
x
that outputs the same result.You can use it like this:
You can try all of this on: http://sandbox.onlinephpfunctions.com/code/f6baff8d411fc8227ece81eccf05b6e7d3586bfa
On the line 908, you can use the variables
$golfed
,$ungolfed
and$fn
to test all the versions.However, if it is allowed to use a character array, the code is simplified (20 bytes):
And ungolfed:
Basically, outputs all items in the array, joined by
"!"
, surrounded by literal!
.Due to limitations in the compiler class, the space is mandatory (in the golfed version).
This code is also extremelly harder to use in pure SimpleTemplate (using the function as example):
The
@call
can call a function that exists in PHP, which means that it isn't a pure SimpleTemplate solution.quelle
Ruby,
1716 bytesTry it online!
Thanks Value Ink for -1 byte
quelle
gsub
.Gema, 11 characters
Unfortunately
!
starts a comment in Gema, so must be escaped.Sample run:
Try it online!
quelle
Jelly, 5 bytes
A full program accepting a string, which prints the result.
Try it online!
How?
quelle
Japt, 4 bytes
Try it
quelle
'
if the replacement were a number.Japt, 4 bytes
Try it
Japt
-P
, 7 bytesUnfortunately
!
is a reserved character, necessitating the quotation marks.Try it
Not much to explain:
ï
is Cartesian product andi
prepends.quelle
Perl 5 +
-p
, 11 bytesTry it online!
quelle