In der Mathematik bedeutet ein Ausrufezeichen !
oft Fakultät und kommt nach dem Argument.
Bei der Programmierung bedeutet ein Ausrufezeichen !
oft Negation und steht vor dem Argument.
Für diese Herausforderung wenden wir diese Operationen nur auf Null und Eins an.
Factorial
0! = 1
1! = 1
Negation
!0 = 1
!1 = 0
Nehmen Sie eine Folge von null oder mehr !
, gefolgt von 0
oder 1
, gefolgt von null oder mehr !
( /!*[01]!*/
).
Beispielsweise kann die Eingabe !!!0!!!!
oder !!!1
oder !0!!
oder 0!
oder sein1
.
Das !
's vor dem 0
oder 1
sind Negationen und das !
' s nach sind Fakultäten.
Fakultät hat höhere Priorität als Negation, daher werden Fakultäten immer zuerst angewendet.
Zum Beispiel !!!0!!!!
wirklich bedeutet !!!(0!!!!)
, oder noch besser !(!(!((((0!)!)!)!)))
.
Die resultierende Anwendung aller Fakultäten und Negationen ausgeben. Die Ausgabe wird immer 0
oder sein 1
.
Testfälle
0 -> 0
1 -> 1
0! -> 1
1! -> 1
!0 -> 1
!1 -> 0
!0! -> 0
!1! -> 0
0!! -> 1
1!! -> 1
!!0 -> 0
!!1 -> 1
!0!! -> 0
!!!1 -> 0
!!!0!!!! -> 0
!!!1!!!! -> 0
Der kürzeste Code in Bytes gewinnt.
Antworten:
Mathematica,
2517 BytesNimmt Eingaben von einer Benutzereingabeaufforderung entgegen. Übernimmt die Notebook-Umgebung von Mathematica für implizites Drucken. Um es zu einem Befehlszeilenskript
Print[...]
zu machen, schließen Sie es ein oder machen Sie es zu einer argumentlosen Funktion (die dann Eingaben von der Eingabeaufforderung entgegennimmt)&
.Mathematica verfügt über beide erforderlichen Operatoren (mit der erforderlichen Priorität), sodass wir die Eingabe nur "auswerten" können (was automatisch von ausgeführt wird
Input[]
), der Operator für die logische Negation jedoch nicht für ganze Zahlen funktioniert (sodass er nicht ausgewertet wird). Wenn!x
das Ergebnis einen Rest enthält, ersetzen wir diesen durch1-x
.Ein paar lustige Fakten zur Bewertung:
!!
, der berechnetn*(n-2)*(n-4)*...
, aber auf angewendet0
oder1
immer noch gegeben wird1
, sodass es keine Rolle spielt,0!!!!!
als was tatsächlich analysiert wird((0!!)!!)!
.!0
und nicht!1
ausgewertet ist, weiß es, dass dies!
selbstinvers ist, sodass es automatisch alle Führungspaare aufhebt!
. Nachdem dasToExpression
sind wir immer mit einem von links0
,1
,!0
,!1
.quelle
x=${x/[01]!*/1};echo $(($x))
- nicht erlaubt, eine richtige Antwort zu posten :([Bash] + Unix-Dienstprogramme,
2117 BytesDies muss in einer Datei gespeichert und als Programm ausgeführt werden. Wenn Sie versuchen, den Befehl direkt über die Befehlszeile einzugeben, funktioniert er nicht, weil !! wird erweitert, da die Ersetzung des Verlaufs im interaktiven Modus von bash aktiviert ist. (Alternativ können Sie die Protokollersetzung mit deaktivieren
set +H
.)Testfall läuft:
quelle
mkdir -p 's/.!!'{bunch,of,different,directories}\$/1
? Dann erhalten Sie Pathname Expansion und Sed versucht, Verzeichnisse wie Dateien zu lesen, anstatt die Standardeingabe zu lesen, und gibt nichts aus! :)Retina ,
201514 BytesDanke an Leo für das Speichern von 1 Byte.
Probieren Sie es online!
Erläuterung
Biegen Sie
0!
in1
. Andere Trailing!
s sind uns egal , die resultierende Zahl ist dieselbe, als hätten wir alle Fakultäten angewendet.Negationspaare aufheben. Dies kann auch einige Fakultäten aufheben, aber das ist irrelevant.
Zählen Sie die Anzahl der Übereinstimmungen dieser Regex, die entweder
1
oder ist0
und das gewünschte Ergebnis liefert.quelle
\d.+
...^
vor!0
Schmutz ,
14 129 BytesProbieren Sie es online!
Erläuterung
Dies vergleicht die Eingabe mit einem Muster und druckt
1
für Übereinstimmung und0
für keine Übereinstimmung.Die Idee ist dies. Wenn die Eingabe mit einer Ziffer beginnt,
\!_
schlägt der rekursive Teil immer fehl und ist\0!
erfolgreich , es sei denn, wir haben einen einzigen0
. Ihr xor ist erfolgreich, es sei denn, die Eingabe ist eine einzelne0
. Beginnt die Eingabe mit einem!
, ist dies\0!
immer erfolgreich und ist\!_
erfolgreich, wenn die rekursive Übereinstimmung erfolgreich ist. Ihr xor ist genau dann erfolgreich, wenn die rekursive Übereinstimmung fehlschlägt und sie somit negiert.quelle
Brainfuck,
8572 (84) Bytesnumerisch zurückgeben oder
für ASCII-Text. > kann auch vorangestellt werden, um Speicherumbrüche zu vermeiden.
Probieren Sie es online!
Oder ersetzen Sie für eine Textantwort die letzte Zeile durch
quelle
Brainfuck - Weg zu vielen Bytes (232 Bytes)
Offensichtlich die falsche Sprache für das Gewinnen im Codegolf. Hauptsächlich bemerkte ich einen Mangel an jemandem, der diesen Esolang benutzte. Es gibt einen guten Online-Dolmetscher für Interpeter, oder Sie können mit diesem bf visualizer beobachten, was das Programm macht .
quelle
Python,
-44-42 Bytes2 Bytes gespart dank Zgarb!
Schritt für Schritt:
x[-1]!='0'
wenn
x
Ende mit1
oder!
⇔x
nicht am Ende mit0
dem faktoriellen Teil muss Wert haben1
, sonst0
^len(x.rstrip('!'))%2
das Eigentum von xor als "bedingtes Nicht" ausnutzen. Die Bedingung ist in diesem Fall, wenn die Länge des Anfangs
!
s ungerade ist. Jedoch,.rstrip
entfernt nicht die Anzahl von der Saite , so dass die Länge berechnet , indem 1 versetzt ist, damit der Zustand invertiert wird!=
zu==
in Schritt 1 gewechselt wird. Zgarb schlug vor, einen Differenzvergleichsoperator zu verwenden, anstatt eine andere Inversion anzuwenden, wodurch 2 Bytes eingespart werden.Probieren Sie es online!
quelle
!!0
; es kehrt gerade zurück1
.lambda x:(x[-1]=='0')^len(x.rstrip('!'))%2
vermeidet die zusätzliche Inversion.JavaScript (ES6),
434129 BytesNon-Regex-Methode (
4131 Bytes)Unten ist mein erster Ansatz. Es ist etwas interessanter, aber auch nach einer signifikanten Optimierung von Neil (10 Bytes gespart) noch
deutlich länger.Testfälle
Code-Snippet anzeigen
quelle
f=([c,...s])=>1/c?c|s>'':1-f(s)
.Gelee , 5 Bytes
Probieren Sie es online!
Monadische Funktion, die einen String erwartet. Eingänge mit führenden
!
s verursachen a1
auf dem Weg nach STDOUT gedruckt wird. Die von mir angegebene TIO-Verknüpfung ist also ein Testkabel, das die Eingabe-Ausgabe-Paare unter der ersten Ausgabezeile druckt.Wie?
quelle
05AB1E , 9 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! oder Überprüfen Sie alle Testfälle!
Erläuterung:
quelle
Retina , 13 Bytes
Ein etwas seltsamer Ansatz, aber er ist kurz und funktioniert.
Mit den ersten beiden Zeilen ersetzen wir eine Endung
0
mit!1
: Mit dieser Ersetzung wissen wir jetzt, dass der Teil unserer Zeichenfolge ab der Ziffer gleich 1 ist.Entfernen Sie in den nächsten beiden Zeilen die folgenden Paare
!
: Die doppelte Negation löscht sich von selbst, und wir haben die Fakultät bereits im vorherigen Schritt berücksichtigt.Die letzte Zeile muss mit einer Ziffer am Anfang der Zeichenfolge übereinstimmen und die Anzahl der Übereinstimmungen zurückgeben: Wenn alle Negationen beseitigt sind, werden wir eine Übereinstimmung finden (und wie wir bereits sagten, ist dies gleich 1), wenn es noch eine gibt Eine Negation, die nicht passt.
Probieren Sie es online!
quelle
1
eher als verwenden\d
.0!
bleibt die Eingabe zum Beispiel bis zur letzten Zeile unverändertRuby, 12 + 1 =
39241513 BytesVerwendet die
-n
Flagge. Danke an @GB für -9 Bytes!quelle
0
oder dem Zeilenende zu suchen!*$
ist kürzer um zwei!Perl , 20 Bytes
19 Byte Code +
-p
Flag.Probieren Sie es online!
Perl Negation kehrt
undef
oder1
, damit ich0+
das Ergebnis numerify0+undef
kehrt0
. Abgesehen davon gibt es nicht viel über den Code zu sagen.quelle
C
68626153 BytesNoch ein paar Bytes mit einigem Missbrauch rausgedrückt
Probieren Sie es online!
quelle
int
aus der Funktion entfernen und du kannst das*a==33
auf ändern*a<34
.*a%2
ist kürzer als*a-48
for(;*a<34;a++)
,for(;*a++<34;)
dass man 1 Byte sparen kannPerl 6 ,
322823 BytesWie es funktioniert
quelle
Haskell , 39 Bytes
Definiert eine Funktion
f
, die eine Zeichenfolge akzeptiert und ein Zeichen zurückgibt. Probieren Sie es online!Erläuterung
Es gibt drei Fälle: Die Eingabe beginnt mit
!
, die Eingabe hat die Länge 1 und alles andere.quelle
f('!':b)=[1,0]!!f b;f"0"=0;f _=1
.Befunge, 24 Bytes
Probieren Sie es online!
Dies beginnt mit dem Zählen der Anzahl der
!
von stdin gelesenen Zeichen. Das erste Zeichen, das nicht a ist, ist!
entweder a0
oder1
, aber beim Testen auf haben!
wir 33 subtrahiert, was entweder 15 oder 16 ergibt. Dann lesen wir ein weiteres Zeichen, das entweder a!
oder EOF ist, und vergleiche, ob das kleiner als 0 ist (dh EOF).Aus diesen drei Datenpunkten - der Ausrufezahl ( c ), dem Ziffernwert ( d ) und der Dateiende-Bedingung ( e ) - können wir das Ergebnis wie folgt berechnen:
Das Multiplizieren des Ziffernwerts mit der Dateiendebedingung bedeutet, dass er auf Null konvertiert wird, wenn auf die Ziffer ein folgt
!
, wodurch ihm der gleiche Modulo-2-Wert wie ein1
(der in 16 konvertiert wurde) gegeben wird. Bevor Sie jedoch das Modulo 2 anwenden, fügen Sie die anfängliche Ausrufezahl hinzu, wodurch das Modulo 2-Ergebnis effektiv so oft umgeschaltet wird, wie!
Präfixe vorhanden waren. Und schließlich wir nicht das Ergebnis , da unsere Ausgangswerte für0
und1
ist das Gegenteil von dem, was wir brauchen.Sehen Sie sich den Code genauer an:
quelle
Haskell , 27 Bytes
Probieren Sie es online!
Jede führende
!
Zeile ergänzt die Ausgabe für den Rest des Ausdrucks, und zwar als1-
. Wir drehen weiter, bis wir eine Ziffer erreicht haben. Wenn der Rest gerade ist"0"
, ist das Ergebnis 0. Andernfalls ist es ein1
oder gefolgt von einem oder mehreren!
, sodass das Ergebnis 1 ist.quelle
Ruby,
22 2120 BytesErläuterung:
(-1 Byte, das die Idee von @Value Ink stiehlt)
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Dies ist eine Funktion (monadischer Link), die ein Argument akzeptiert und über ihren Rückgabewert zurückgibt. (Als Nebeneffekt schreibt es auch oft Junk auf die Standardausgabe, aber das interessiert uns nicht.)
Erläuterung
Beachten Sie zunächst, dass die Eingabe immer aus einer Anzahl von Zeichen besteht
!
, gefolgt von einer Ziffer, gefolgt von einer weiteren!
. Wenn Sie das abschließende Zeichen löschen!
und die Länge übernehmen, erhalten Sie eine Zahl plus der Anzahl der führenden Zeichen!
im Programm. Wenn Sie die Parität davon nehmen, wird 0 zurückgegeben, wenn es eine ungerade Zahl gab!
, oder 1, wenn es eine gerade Zahl gab!
. Das Vergleichen mit 0 ist eine "Nicht" -Funktion, während das Vergleichen mit 1 die Identitätsfunktion ist; Dadurch wirdœr”!LḂ=
der!
Teil der Frage "Führende Operatoren als NICHT-Operatoren behandeln" effektiv implementiert .Was die zweite Hälfte angeht,
!
ist die Behandlung von Fakultäten eine Fakultätsoperation in Jelly. Wenn das Programm also keine Führungslinie hat!
, können wir das Problem direkt mit simpleeval
(V
) lösen . Wenn das Programm über eine führende Stelle verfügt!
, werden diese so interpretiert, dass sie die Fakultät 0 annehmen (möglicherweise mehrmals), was einen Rückgabewert von 1 ergibt, der auf der Standardausgabe ausgegeben und verworfen wird, sobald eine Ziffer angezeigt wird. Daher haben sie keinen Einfluss auf den Rückgabewert der Funktion, die ich der Frage unterbreitet habe.quelle
Python, 38 Bytes
TryItOnline!
Eine unbenannte Funktion, die eine Eingabezeichenfolge verwendet
s
und eine Ganzzahl0
oder zurückgibt1
.s[1::2]
ist ein Teil der Eingabezeichenfolge, der bei Index 1 beginnt und eine Schrittgröße von zwei hat:'Like this' -> 'ieti'
s[::2]
ist ähnlich, beginnt jedoch mit dem Standardindex 0:'Like this' -> 'Lk hs'
Der Test
(s[1::2]>s[::2])
prüft, ob der auf 0 basierende Index des'0'
oder'1'
ungerade ist, dh ob wir ergänzen müssen.Dies funktioniert, weil die Reihenfolge der Zeichenfolgen lexikografisch mit einer nicht leeren Zeichenfolge überprüft wird, die größer als die leere Zeichenfolge ist, und mit der ASCII-Reihenfolge
'1'>'0'>'!'
. Dies ist ein Byte kürzer als das einfacheres.index(max(s))%2
.Das
ord(s[-1])%2
prüft, ob das letzte Zeichen kein'0'
(für eine gültige Eingabe) ist, und führt zu einer Ganzzahl (wobei dieselbe Länge(s[-1]!='0')
einen Booleschen Wert zurückgeben würde).Dies funktioniert, weil das letzte Zeichen der Eingabe
s[-1]
a'0'
ist'1'
oder'!'
ASCII-Codepunkte 48, 49 und 33 aufweist, die 0, 1 und 1 Modulo 2 sind.Das
^
führt dann eine bitweise Exklusiv- oder Operation für die beiden obigen Werte durch und gibt eine Ganzzahl zurück, da eine Eingabe, die rechte, eine Ganzzahl ist. Wenn die linke wahr ist, wird das Komplement der rechten zurückgegeben, wenn die linke falsch ist, wird die rechte nach Bedarf zurückgegeben.quelle
Java 7,
1058281 BytesProbieren Sie es online!
Alte reguläre Lösung
quelle
c^=1
ist super schlau. Das ist ein unbenutzter Operator, falls ich jemals einen gesehen habe.CJam ,
1211 BytesProbieren Sie es online! Testsuite (druckt eine
1
für jeden richtigen Testfall).quelle
Haskell ,
6765 BytesProbieren Sie es online! Verwendungszweck:
f "!!!0!!!!"
Zwei Bytes dank @nimi gespeichert.
quelle
Brainfuck, 115 Bytes
Probieren Sie es online!
Ungolfed:
quelle
Batch, 62 Bytes
Übernimmt die Eingabe für STDIN. Batch versteht die führenden
!
s für diese Herausforderung tatsächlich richtig, aber die nachfolgenden!
s müssen behandelt werden, was drei Schritte umfasst:0!
zu1
!!
(dies ist auch für das!!
s vor der Ziffer sicher )!
(die jetzt erst nach einem sein können1
)quelle
IBM / Lotus Notes-Formel - 77 Byte
Es gibt kein TIO für Notes Formula, daher wird unten ein Screenshot aller Testfälle angezeigt:
Wie es funktioniert
@Eval()
wertet einen String als Ausdruck ausZuerst prüfen wir, ob die Eingabezeichenfolge in Feld (Eingabe) oder
a
enthält, und nehmen alle Zeichen links von der Zeichenfolge, bei der es sich um eine Zeichenfolge handelt . Es ist uns egal, wie viele. werde mich darum kümmern.1
0
!
@Eval()
Als nächstes prüfen wir, ob sich
!
am Ende der Zeichenfolge ein befindet. Wenn dies der Fall ist, hängen wir1
an die!
Zeichenfolge an (0!
und1!
beide sind 1 - es spielt keine Rolle, wie viele!
Zeichen sich am Ende befinden), andernfalls hängen wir das letzte Zeichen unverändert an, da es kein a ist!
und entweder a1
oder a sein kann0
.Wir haben jetzt eine Zeichenkette mit den führenden Inversionen und einer Zahl, die definiert ist, ob Fakultätszeichen vorhanden sind, damit wir diese mit Feeds versehen
@Eval()
und die obigen Ergebnisse erhalten können.quelle
sed,
363331 bytesPure sed, keine bc / shell utils. Funktioniert mit GNU sed <4.3; 33 Bytes unter BSD und GNU 4.3+.
Einfach genug, wenn Sie sich auskennen
sed
; kommentiert für diejenigen, die nicht sind:Prüfung:
quelle
sed
können Sie die Nullzeichenfolge als Labelnamen verwenden. Wenn Sie das hier zum Laufen bringen, sparen Sie zwei Bytes. Eigentlich bin ich mir nicht sicher, ob das Etikett überhaupt gebraucht wird. Sofern ich nichts übersehen habe, ist die erste Zeile idempotent, sodass Sie möglicherweise zum Programmstart zurückkehren können, anstatt ein Etikett zu benötigen.:
(eher ein Bug, der als Feature angesehen wird). In diesem Fall können sowohl dast
als auch dasb
! Befehle springen an die Position des Etiketts. Außerdem muss ein sed-Code für mindestens eine Version von sed funktionieren, ähnlich wie in anderen Sprachen, sodass Sie keinen Code erstellen müssen, der auch für BSD funktioniert.PHP 7.1,
5855543735 BytesAnmerkung: Verwendet die IBM-850-Codierung
Laufen Sie wie folgt:
Erläuterung
Optimierungen
-R
(was$argn
verfügbar macht )quelle
Bohne , 24 Bytes
Hexdump:
Entsprechendes JavaScript:
Entschuldige, dass du auf die Zehen getreten bist, Arnauld .
Erläuterung:
Übernimmt die erste Eingabezeile als unformatierten String
a
und ersetzt eine beliebige Ziffer gefolgt von einer oder mehreren!
durch1
, sodass der Resteval
von JavaScript verarbeitet werden kann.Probieren Sie die Demo oder die Testsuite aus
quelle