Herausforderung
Schreiben Sie das kürzeste Programm, das ein vom Menschen lesbares Zeitintervall in Datumskomponenten des Formulars konvertiert:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Beispielfälle
Jeder Testfall besteht aus zwei Zeilen, Eingabe gefolgt von Ausgabe:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
Regeln
- Sie können
strtotime
keine integrierte Funktion verwenden, die die gesamte Arbeit erledigt. - Kürzester Code gewinnt (Bytes)
- Sie können Ihre Ausgabe in
stdout
oder in eine Datei drucken , das Ergebnis kann auch von einer Funktion zurückgegeben werden, es liegt an Ihnen - Das Token kann in Singular- oder Pluralform vorliegen.
- Die Komponenten können in zufälliger Reihenfolge sein
- Zwischen der Nummer und dem Token darf kein Leerzeichen sein
- Das Vorzeichen ist optional, wenn das Zeitintervall positiv ist (Eingabe und Ausgabe).
- Wenn eine Komponente mehrmals vorkommt, sollten die Werte hinzugefügt werden
- Jede Komponente hat ein eigenes Vorzeichen
- Die Komponenten sollten separat behandelt werden (zB
80 minutes
bleibt als 80 in der Ausgabe) - Die Eingabe erfolgt garantiert in Kleinbuchstaben
Viel Spaß beim Golfen!
Sign is optional when the time interval is positive
Bedeutet das, dass die Eingabe+
Zeichen enthalten kann ?Antworten:
CJam, 60 Bytes
Nachdem ich lange Zeit in den 60ern feststeckte, schaffte ich es endlich, dies auf 60 Bytes zu reduzieren. Gut genug! Es versenden!
Probieren Sie es online aus
Gequetscht:
Erweitert und kommentiert:
Ich habe anfangs mit einem tokenbasierten Ansatz begonnen, aber der blieb bei ... 61 Bytes ziemlich fest. Seufzer. Also habe ich die Gänge total gewechselt und zu diesem charakterbasierten Ansatz gewechselt, der sowieso viel interessanter ist.
Meine Parsing-Methode fügt alle gültigen numerischen Zeichen (
0
-9
und-
) zu einem Puffer hinzu und analysiert den Puffer als Ganzzahl, wenn ein bestimmtes Zeichen aus einem der Zeiteinheitennamen erreicht ist. Diese Zeichen sindy
,t
,d
,h
,i
, undc
, die alle die Bedingungen erfüllen, die sie in einem Zeiteinheitennamen enthalten und in keinem anderen Zeiteinheitennamen vor dem Erkennungszeichen stehen. Mit anderen Worten, wenn eines dieser Zeichen für die Erkennung von Zeiteinheiten erreicht ist, wird der numerische Puffer mit der zuletzt gesehenen Zahl gefüllt, wenn dies tatsächlich eine Zeiteinheit signalisiert, oder der numerische Puffer ist leer, wenn dies nur in angezeigt wird, sollte aber nicht t Signal, eine andere Zeiteinheit. In beiden Fällen wird der numerische Puffer als Ganzzahl oder 0, wenn er leer war, analysiert und zum entsprechenden Zeiteinheitswert addiert. Somit haben Erkennungszeichen, die in anderen Zeiteinheiten nach ihrem Erkennungszeichen erscheinen, keine Wirkung.Andere verrückte Hacks sind:
Für alle, die neugierig auf meine tokenbasierte Lösung sind, die bei 61 Byte hängen geblieben ist, werde ich sie auch hier veröffentlichen. Ich bin jedoch nie dazu gekommen, es zu erweitern oder zu kommentieren.
CJam, 61 Bytes
quelle
Perl: 61 Zeichen
Vielen Dank an @nutki.
Probelauf:
Meine schlechten Bemühungen:
7877 Zeichenquelle
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
spart zusätzliche 4.Ruby,
119106868584 BytesEin Byte gespart dank Sp3000.
Dies ist eine unbenannte Funktion, die die Eingabe als Zeichenfolge verwendet und das Ergebnis (auch als Zeichenfolge) zurückgibt. Sie können es testen, indem Sie es beispielsweise zuweisen
f
und wie folgt aufrufenquelle
Python 2, 99 Bytes
Dies ist eine Lambda-Funktion, die eine Zeichenfolge aufnimmt und einfach einen regulären Ausdruck verwendet, um die erforderlichen Zahlen zu extrahieren.
Dank Martin für den Hinweis auf , dass
\s*
gerade sein könnte<space>*
. Es ist leicht zu vergessen, dass reguläre Ausdrücke buchstäblich mit Leerzeichen übereinstimmen ...quelle
JavaScript 100
105 112Bearbeiten Hinzufügen von Template-Strings (erstmalig implementiert im Dezember 2014, also gültig für diese Herausforderung) - zu der Zeit war ich mir dessen nicht bewusst
Edit Eureka, endlich habe ich
m?
in allen anderen Antworten die Bedeutung verstanden !Prüfung
quelle
R, 197 Bytes
Mir ist klar, dass dies überhaupt kein Wettbewerbsbeitrag ist. Ich wollte meistens nur eine Lösung für R finden. Jede Hilfe, die dies verkürzt, ist natürlich willkommen.
Wie Martins Antwort ist dies eine unbenannte Funktion. Um es aufzurufen, weisen Sie es zu
f
und übergeben Sie eine Zeichenfolge.Das ist ziemlich abscheulich, schauen wir uns also eine ungegolfte Version an.
Anhand der Struktur allein ist es leicht zu erkennen, was los ist, auch wenn Sie mit R nicht allzu vertraut sind. Ich werde einige der merkwürdig aussehenden Aspekte näher erläutern.
paste0()
So kombiniert R Zeichenfolgen ohne Trennzeichen.Die
str_extract_all()
Funktion stammt aus Hadley Wickhamsstringr
Paket. Rs Umgang mit regulären Ausdrücken im Basispaket lässt zu wünschen übrig, und hierstringr
kommt es an. Diese Funktion gibt eine Liste von Übereinstimmungen mit regulären Ausdrücken in der Eingabezeichenfolge zurück. Beachten Sie, wie derperl()
reguläre Ausdruck in einer Funktion eingeschlossen ist - dies bedeutet lediglich, dass der reguläre Ausdruck im Perl-Stil und nicht im R-Stil vorliegt.gsub()
führt ein Suchen und Ersetzen durch, wobei ein regulärer Ausdruck für jedes Element des Eingabevektors verwendet wird. Hier sagen wir, dass alles, was weder eine Zahl noch ein Minuszeichen ist, durch eine leere Zeichenfolge ersetzt werden soll.Und da hast du es. Weitere Erläuterungen erhalten Sie gerne auf Anfrage.
quelle
library(stringr)
in Ihre Quelle aufgenommen?Cobra - 165
quelle
C ++ 14,
234229 BytesBearbeiten: Reduzieren Sie 5 Bytes, indem Sie die alte Deklaration anstelle von verwenden
auto
.Ich weiß, dass der Gewinner bereits ausgewählt wurde und dass dies die längste Einreichung bis jetzt sein würde, aber ich musste nur eine C ++ - Lösung posten, weil ich wetten, dass niemand überhaupt eine erwartet hat :)
Um ehrlich zu sein, bin ich ziemlich zufrieden damit, wie kurz es war (natürlich nach C ++ - Messungen), und ich bin mir sicher, dass es nicht kürzer werden kann als dies (mit nur einer Bemerkung, siehe unten). . Es ist auch eine schöne Sammlung von neuen Funktionen in C ++ 11/14.
Hier werden keine Bibliotheken von Drittanbietern verwendet, sondern nur Standardbibliotheken.
Die Lösung liegt in Form einer Lambda-Funktion vor:
Ungolfed:
Aus irgendeinem Grund musste ich schreiben
statt nur
weil der Iterator nur eine Übereinstimmung zurückgeben würde, wenn ich ein temporäres Objekt übergeben würde. Dies scheint mir nicht richtig zu sein, daher frage ich mich, ob es ein Problem mit der GCC-Regex-Implementierung gibt.
Vollständige Testdatei (kompiliert mit GCC 4.9.2 mit
-std=c++14
):Ausgabe:
quelle
PHP, 141 Bytes
Nimmt Eingaben vom ersten Befehlszeilenargument entgegen; verwendet
[,]
für die Ausgabe anstelle von{|}
. Laufen Sie mit-r
.Nervenzusammenbruch
quelle