Diese Herausforderung ist inspiriert von Mathematik ist Tatsache. Programmierung ist nicht .
Die mathematische Notation für eine Fakultät oder eine Tatsache ist ein Ausrufezeichen !
. Das Ausrufezeichen ist auch not
in vielen Programmiersprachen ein gängiges Symbol .
Herausforderung:
Nehmen Sie eine Zeichenfolge mit Ziffern und Zeichen: + !
Geben Sie als Eingabe und Ausgabe Folgendes ein:
Alles vor einem Ausrufezeichen sollte als mathematischer Ausdruck ausgewertet 2+2
werden 4
.
Alles nach einem einzelnen Ausrufezeichen sollte als Zubehör an das angehängt werden, was sich davor befindet. Also: 2+2!5
sollte geben 45
, weil 2+2=4
, und 5
ist ein Zubehör. 2+2!5+5
sollte geben 410
.
Da !
bedeutet auch not
, dass alles, was nachträglich kein Zubehör ist, nicht angehängt werden sollte. Also 2+2!!5
sollte geben 4
, da 5
ist kein Zubehör. Nun not(not(true))==true
, so 2+2!!!5
geben soll 45
. 2+2!!5!5+5
sollte geben : 410
, weil 2+2=4
dann gefolgt von einer Fakultät und !5!5+5
. Das erste 5
ist keine Tatsache, sondern 5+5
steht nach einem weiteren Ausrufezeichen und ist daher wieder eine Tatsache.
Erläuterungen:
- Die Ausrufezeichen befinden sich
+
auf keiner Seite neben a. - Es wird keine Führung
+
für Zahlen geben (es ist5
nicht so+5
). - Sie können optional eine führende Null einfügen, wenn dies das Ergebnis des Ausdrucks vor der ersten ist
!
. Beide4
und04
werden als Ausgabe für Eingabe akzeptiert:0+0!4
Zusammenfassung: Bewerten Sie jede Summe (Behandlung !
als Trennzeichen). Verwerfen Sie dann alle Zahlen, die nach einer geraden Zahl von !
(ab dem Beginn der Zeichenfolge) erscheinen. Dann entfernen Sie alle !
.
Testfälle:
!
<- Empty string
5
5
12!
12
!87
87
!!5
<- Empty string
5+5!2+2
104
5+5!!2+2
10
1!2!3!4!5!6!7!8!9
12468
10+10!!2+2!!3+3!4+4
208
2!!3!5
25
2!!3!5!7
25
10!!!!!!!5
105
Dies ist Code-Golf, also gewinnt der kürzeste Code in Bytes (in jeder Sprache)! Erklärungen sind ausdrücklich erwünscht!
25
(siehe hinzugefügten Testfall). Noch wichtiger ist,2!!3!5!7
würde immer noch geben25
, weil es eine gerade Anzahl von!
links von der gibt7
(so dass Sie nicht nur den Lauf direkt vor der Zahl zählen, sondern alle!
links davon).Row
?Antworten:
Netzhaut ,
353129 Bytes4 Bytes wurden gespart, indem Sie sich von ETH-Produktionen inspirieren ließen .
Vielen Dank an Leo für das Speichern von weiteren 2 Bytes.
Probieren Sie es online aus!
quelle
JavaScript (ES6),
5856 ByteDank Martin Ender zwei Bytes gespeichert .
Könnte irgendwie verbessert werden ...
quelle
replace
.1+1!5
. Ich denke du hasteval
das bisschen vor dem vergessen!
.Gelee , 16 Bytes
Probieren Sie es online aus!
Erläuterung
Die wichtigste Beobachtung hier ist, dass wir die Schritte "außer Betrieb" ausführen können; Anstatt die Summen zu bewerten und diejenigen zu ignorieren, die wir nicht mögen, können wir die Summen an ungültigen Positionen ignorieren und dann den Rest bewerten.
Wenn Sie eine Summe wie
"10+10"
bewerten, wird sie zu einer Zahl ausgewertet, z. B.20
zu einer Zeichenfolge"20"
. Das Wiederholen dieses Vorgangs hat keine zusätzlichen Auswirkungen (es ist idempotent). Daher bewerten wir effektiv jedes Element der Zeichenfolge mit Ausnahme der Nullzeichenfolge, die nicht bewertet wird, da sie eine Länge von Null hat.quelle
µ
eingeben (undµ
funktionieren nicht in einer Schleife, was bedeutet, dass Sie etwas benötigen noch ausführlicher). Ich habe es geschafft, es zum Laufen zu bringenṣ”!µḢW;m2$ȧVṾ$$€
, aber es ist nicht kürzer (und hat die charakteristische Ansammlung von Dollarzeichen, die auftreten können, wenn Sie Jelly an den Rand seiner Fähigkeit bringen, Kontrollstrukturen zu verschachteln.)Gelee , 18 Bytes
Probieren Sie es online aus!
Wie?
quelle
0+0
in der Mitte der Eingabe funktioniert (an einem Ort, an dem es nicht verworfen wird). es erzeugt die Nullzeichenfolge, obwohl es eine Ziffer 0 erzeugen sollte.CJam , 20 Bytes
Probieren Sie es online aus! (Linefeed-getrennte Testsuite.)
quelle
Ruby ,
5856 + 1 =5957 BytesVerwendet die
-p
Flagge. -2 Bytes von Tutleman .Probieren Sie es online aus! (Eine zusätzliche Codezeile wurde hinzugefügt, damit alle Eingabezeilen verwendet und die Ausgabe in verschiedenen Zeilen gedruckt werden.)
quelle
eval$1
, nein?Stapel,
192184 BytesEs ist unpraktisch, mit den leeren Zeichenfolgen umgehen zu müssen.
quelle
Pip , 18 Bytes
Ich denke, das ist das kürzeste, was es gibt ... obwohl ich das auch vor ungefähr drei Iterationen gesagt habe.
Übernimmt die Eingabe als Befehlszeilenargument. Probieren Sie es online aus!
Erläuterung
quelle
R 95 Bytes
Es gibt wahrscheinlich Raum für Verbesserungen, aber im Moment ist es das Beste, was ich mir einfallen lassen kann.
quelle