Ich denke, es gibt hier nicht genug einfache Fragen, die Anfänger versuchen können!
Die Herausforderung: Bei einer zufälligen Eingabe von Einsen und Nullen wie:
10101110101010010100010001010110101001010
Schreiben Sie den kürzesten Code, der die bitweise Inverse ausgibt, wie folgt:
01010001010101101011101110101001010110101
=&'0'
funktioniert für die gleiche Anzahl von Bytes.GolfScript , 5 Bytes
Probieren Sie es online aus.
Wie es funktioniert
GolfScript liest die gesamte Eingabe von STDIN und platziert sie als Zeichenfolge auf dem Stapel.
{}%
Durchläuft alle Zeichen in der Zeichenfolge und führt den Codeblock für alle aus.1^
Berechnet das exklusive ODER der Zeichen des ASCII-Codes mit 1. "0" entspricht dem ASCII-Code 48, "1" dem ASCII-Code 49.Seit
48 ^ 1 = 49
und49 ^ 1 = 48
werden 0en zu Einsen und 1en zu Nullen.Anschließend druckt GolfScript die geänderte Zeichenfolge.
quelle
CJam - 4
Diese xor jedes Zeichen mit 1.
Im Gegensatz zu der anderen CJam-Antwort gehe ich nicht davon aus, dass die Eingabe bereits auf dem Stapel ist.
Versuchen Sie es unter http://cjam.aditsu.net/
quelle
f
.x86-Maschinencode unter DOS -
141311 BytesNun, es wurde wieder kürzer! Nachdem ich eine Lösung für eine nicht verwandte Herausforderung geschrieben hatte , bemerkte ich, dass derselbe Trick auch hier angewendet werden konnte. Auf geht's:
Kommentierte Versammlung:
Vorherige Lösung - 13 Bytes
Ich denke, es wird nicht viel kürzer.Eigentlich war es so! Vielen Dank an @ninjalj für das Abschneiden eines weiteren Bytes.Diese Version bietet erweiterte Interaktivität ™ - nachdem sie über die Befehlszeile ausgeführt wurde, werden die "invertierten" Zeichen ausgespuckt, solange Sie die Eingabeziffern eingeben (die nicht wiedergegeben werden). Zum Verlassen drücken Sie einfach Strg-C.
Im Gegensatz zur vorherigen Lösung treten bei der Ausführung von DosBox einige Probleme auf. Da DosBox Strg-C nicht korrekt unterstützt , müssen Sie das DosBox-Fenster schließen, wenn Sie das Programm beenden möchten. In einer VM mit DOS 6.0 wird es stattdessen wie beabsichtigt ausgeführt.
NASM-Quelle:
Alte Lösung -
272522 BytesDies akzeptierte seine Eingabe von der Kommandozeile; Läuft reibungslos als .COM-Datei in DosBox.
NASM-Eingabe:
quelle
xchg dx,ax
ist 1 Byte kürzer alsmov dl,al
Bash + Coreutils, 8 Bytes
Übernimmt die Eingabe von STDIN.
Oder
sed, 8 bytes
quelle
y 01 10
tr
...CJam , 4 Bytes
Angenommen, die ursprüngliche Zeichenfolge befindet sich bereits auf dem Stapel. Druckt die geänderte Zeichenfolge.
Probieren Sie es online aus, indem Sie den folgenden Code einfügen :
Wie es funktioniert
:~
wertet jedes Zeichen des Strings aus, dh es ersetzt das Zeichen 0 durch die Ganzzahl 0.:!
berechnet das logische NICHT jeder ganzen Zahl. Dies macht aus Nullen Einsen und aus Einsen Nullen.quelle
Brainfuck (
7071)Erläuterung:
quelle
a
für11
.PHP - 19 Bytes
Ja, nicht wirklich originell, denke ich!
quelle
Pfannkuchenstapel , 532 Bytes
Es wird davon ausgegangen, dass die Eingabe durch ein Nullzeichen abgeschlossen wird. Die Strategie ist wie folgt:
1
davon.0
(und gib ein1
wenn wir hatten0
oder ein0
wenn wir hatten1
)0
dazuquelle
C: 29
Probieren Sie es hier online aus .
Vielen Dank, dass Sie auf den XOR-Trick hingewiesen haben, Dennis.
quelle
i(char*s){while(*s)*s++^=1;}
while
durch einfor
Standbild mit einer Länge von 28 Zeichen ersetzen .Python 2.7 - 34 *
Oh, wie viel saugt dieser erste. Ziemlich hässlich, das ist. 63 Zeichen.
Dieser ist ein bisschen besser, aber immer noch nicht so schick. 44 Zeichen.
Da wird
int(x) and 1
zurückgegeben,int(x)
wenn es nicht 0 ist und sonst False. Die Lösung kann weiter auf 36 Zeichen reduziert werden.Da
join()
ein Generator benötigt, können die Halterungen entfernt werden. 32 Zeichen.Und Backticks können anstelle von verwendet werden
str()
Reduziert von 34 auf 44 dank Zeigern von @TheRare
In Python ist es schwierig, das eigene Komplement zu finden, da
bin(-int)
-0bxxx zurückgegeben wird.quelle
(int(x) and 1) == int(x)
'' == False
und'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
für x <maxint ist gleichstr(x)
Perl, 9 Zeichen
Das neunte Zeichen ist das 'p'-Flag
Verwendungszweck:
quelle
y/10/01/
aber ein Zeichen kürzer, weil es keine Flags benötigtJavascript ( ES6 ) 36
quelle
s
, Sie gebens.replace(/./g,x=>x^1)
22 Zeichen ein.p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
und das ist die gleiche Länge.Labyrinth , 6 Bytes
(Labyrinth ist neuer als diese Herausforderung, daher konkurriert diese Antwort nicht - nicht, dass sie sowieso gewinnt ...)
In diesem Code wird davon ausgegangen, dass STDIN nur die Ziffern enthält (insbesondere keine abschließenden Zeilenumbrüche).
Der Anweisungszeiger (IP) beginnt in der oberen linken Ecke und geht nach rechts. Während es zu lesende Ziffern gibt, durchläuft es den linken 2x2-Block in einer engen Schleife:
1
1 drücken,,
eine Ziffer lesen,$
mit 1 XOR-verknüpft, um das letzte Bit.
umzuschalten, das Ergebnis auszudrucken. Die IP nimmt diese Schleife, weil die Spitze des Stapels nach dem XOR positiv ist, so dass es eine Rechtskurve dauert. Wenn wir EOF drücken,,
kehren wir-1
stattdessen zurück. Dann gibt das XOR nach-2
und mit diesem negativen Wert biegt die IP nach links ab@
und das Programm endet.Diese Lösung sollte für Labyrinth optimal sein: Sie benötigen
,
und.
für eine E / A-Schleife und@
zum Beenden des Programms. Sie benötigen mindestens zwei Zeichen (hier1
und$
), um das letzte Bit umzuschalten. Und Sie benötigen mindestens eine neue Zeile für eine Schleife, die beendet werden kann.Es sei denn ... wenn wir STDERR ignorieren, dh das Beenden mit einem Fehler erlauben, können wir das speichern
@
und wir brauchen auch keine Möglichkeit, zwischen zwei Pfaden umzuschalten. Wir lesen und drucken einfach weiter, bis wir versehentlich versuchen, einen negativen Wert (das-2
) zu drucken . Dies ermöglicht mindestens zwei 5-Byte-Lösungen:quelle
Rubin: 23
quelle
Turing Machine Code, 32 Bytes (1 Zustand - 3 Farben)
Verwenden der für diesen Online-TM-Simulator erforderlichen Regeltabellensyntax. Ausgeliehen von einem Beitrag, den ich vor einigen Monaten in meinem Googology Wiki-Benutzerblog verfasst habe.
Sie können dies auch mit dieser Java-Implementierung testen .
quelle
Python 2.x - 44 Bytes
Warum es komplexer machen oder einige betrügerische Variablen verwenden?
quelle
print''.join('1-int(x)'for x in'input()')
. Ich konnte die Backticks im Kommentarcode nicht finden, also ersetzte ich sie durch '.`a\`b`
->a`b
.R, 27 Zeichen
Verwendungszweck:
quelle
APL (Dyalog Unicode) , 7 Byte SBCS
Volles Programm. Fordert stdin auf.
Probieren Sie es online!
⍞
prompt stdin⍎¨
Führe jedes Zeichen aus~
logisches NICHT⍕¨
Formatieren Sie jedes Zeichen als Text∊
ϵ nlist (Abflachen)quelle
PHP> 5.4 - 37 Zeichen
$s
ist der EingangTry it online
quelle
<kbd>
Tags.TI-BASIC, 7 Bytes
Dies ist eine Funktion, die eine Binärzeichenfolge (Through
Ans
) als Eingabe verwendet und die Ausgabe wie angegeben als invertierte (nicht umgekehrte) Zeichenfolge zurückgibt. Für weitere Hilfe können Sienot(
die Listenanwendung im TI-BASIC-Wiki durchlesen. Ich benutze die kompilierte Version, weil sie kleiner ist:In hex:
Erläuterung
»*r
- Funktionseingabe als String übernehmen und in Liste konvertieren>
- Geben Sie die Liste an die nächsten Bediener weiterÕ¸r
- Kehrt die Liste umquelle
»*r>Õ¸r
?expr(Ans:Returnnot(Ans
; 2. Da die Zeichenfolge nicht durch Kommas getrennt ist und nicht mit einem beginnt{
, wird sie zu einer Ganzzahl wie 1000010011 und nicht zu einer Liste ausgewertet. 3.Return
funktioniert nicht so, wie Sie es geschrieben haben; 4. Dies gibt die Ausgabe als Liste und nicht als Zeichenfolge aus.Haskell, 22 Bytes
Der Mangel an Haskell-Lösungen für diese Herausforderung hat mich überrascht. Es wird zu einer Funktion ausgewertet, die eine Zeichenfolge akzeptiert und deren Inverse zurückgibt.
Erläuterung
Hier ist nichts Besonderes.
quelle
Befunge 93, 25 Bytes
Angenommen, leerer Stapel und EOF lesen beide -1.
0
drückt eine \ 0 als Null-Terminator>~1+:#v_
ist eine Eingangsschleife, liest ASCII, addiert 1, prüft auf EOF + 1 = 0,^ -1<
sonst subtrahiert 1 und belässt den gepushten ASCII-Wert auf dem Stapel.$>:#,_@
Legt die zusätzliche Kopie von Null oben auf dem Stapel ab und druckt die Binärzeichenfolge von oben nach untenWenn der leere Stapel 0 lautet, speichern Sie 2 Bytes mit
Eine Version von ungefähr 15 Bytes ist mit demselben Algorithmus möglich, wenn EOF = 0 ist, aber ich habe eine solche Implementierung nicht zum Testen zur Hand.
quelle
Javascript ES6, 26 Zeichen
quelle
Befunge-98 (PyFunge) , 7 Bytes
Für jedes Zeichen wird
c
in der Eingabe das Zeichen mit einem ASCII-Wert von gedruckt94 - c
, wobei 94 der Wert von '0' + '1' oder 'a' ist.Probieren Sie es online!
quelle
Python3, 39
Methinks Python ist dafür nicht die beste Sprache. :)
Wenn Sie nach der Ausgabe eine neue Zeile haben möchten, finden Sie hier eine 43-stellige Alternative:
quelle
end=''
nur ein,
Wille zu tun :) - es sei denn, Sie kümmern sich darum, dass es keine Leerzeichen gibtprint
Funktion von Python3 muss derend
Parameter angepasst werden, um eine neue Zeile am Ende jedes Druckvorgangs zu unterdrücken. Gemäß der OP-Spezifikation ist es mir auch wichtig, dass keine Leerzeichen vorhanden sind. :) Danke für den Kommentar!J - 11 Zeichen
Boolesche Werte in J werden als Ganzzahlen dargestellt
0
und1
sind natürlich auch gültige Indizes für Arrays (in diesem Fall das 2-Zeichen-Array'01'
).quelle
C # 131 Bytes
Ein bisschen zu spät zur Party, aber hier ist meins. :)
quelle
MATLAB, 13 Bytes
Rufen Sie nach dem Ausführen des obigen Befehls einfach die Funktion mit Ihrer Eingabezeichenfolge auf, um die invertierte Zeichenfolge abzurufen. Zum Beispiel läuft:
druckt:
quelle
BotEngine , 4x8 = 32
Nicht konkurrierend, da die Sprache die Frage datiert.
Mit Hervorhebung:
quelle