In der esoterischen Programmiersprache Curly bestehen Programme ausschließlich aus geschweiften Klammern {}
und Semikolons ;
. Trotz dieses bescheidenen Toolsets verfügt Curly über Literale, die eine beliebige nichtnegative Ganzzahl darstellen können. Das Format ist jedoch für die Uneingeweihten etwas schwierig zu lesen. Schreiben wir also Code, um die Konvertierung für uns durchzuführen.
Format der Zahlen
Geschweifte Zahlen sind nach folgenden Regeln aufgebaut:
- Durch Hinzufügen eines Semikolons wird die Zahl um eins erhöht.
- Eine Zahl in geschweiften Klammern wird mit vier multipliziert.
- Geschweifte Klammergruppen können verschachtelt, aber nicht verkettet sein. Hosenträger müssen richtig passen.
- Semikolons außerhalb einer Reihe von geschweiften Klammern müssen nachher kommen, nicht vorher.
- Um Mehrdeutigkeiten beim Parsen zu vermeiden, muss eine Zahl immer mit einer geschweiften Klammer beginnen.
Einige Beispiele:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Beachten Sie, dass Regel 5 bedeutet, dass die Zahlen 0 bis 3 mit einem leeren Paar geschweifter Klammern beginnen müssen.)
Und einige ungültige Beispiele:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Hier ist eine BNF-Grammatik für Curly-Zahlen:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Zahlen wie {;;;;}
(mehr als 3 Semikolons in einer Reihe) oder {{};}
(unnötige leere Klammergruppen) werden als falsche geschweifte Zahlen bezeichnet. Sie gehorchen die obige Grammatik und können in der üblichen Weise ausgewertet werden, aber sie sind auch in der Lage kürzerer Darstellungen (für die obigen Beispiele {{;}}
und {;}
respectively).
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge eingibt / empfängt. Wenn die Zeichenfolge eine nichtnegative Dezimalzahl ist, geben Sie die richtige (dh kürzestmögliche) Curly-Darstellung für diese Ganzzahl aus bzw. geben Sie sie zurück. Wenn es sich bei der Zeichenfolge um eine geschweifte Zahl handelt, geben Sie die Dezimaldarstellung aus bzw. geben Sie sie zurück.
Eingaben können über STDIN, Befehlszeilenargument oder Funktionsparameter empfangen werden. Es muss eine Zeichenfolge sein; Das heißt, Sie dürfen keine Funktion schreiben, die Zeichenfolgen für geschweifte Zahlen akzeptiert, sondern ganze Zahlen für Dezimalzahlen.
Die Ausgabe kann auf STDOUT gedruckt oder von der Funktion zurückgegeben werden. Eine Funktion kann gegebenenfalls eine Ganzzahl oder in allen Situationen Zeichenfolgen zurückgeben.
Ihr Programm muss keine falschen Eingaben verarbeiten (geschweifte Zahlen, die gegen die Formatierungsregeln verstoßen, Gleitkommazahlen, negative Ganzzahlen, zufälliger Text), und es muss keine falschen geschweiften Zahlen verarbeiten (siehe unten). Die Eingabe besteht nur aus druckbaren ASCII-Zeichen.
Wertung
Der kürzeste Code in Bytes gewinnt. Wenn Ihr Programm beide der folgenden Funktionen ausführen kann :
- richtig mit unsachgemäßen geschweiften Zahlen umgehen, und
- Wenn Sie eine geschweifte Zahl haben, ignorieren Sie alle zusätzlichen Zeichen, die nicht vorhanden sind
{};
Dann ziehen Sie 10% von Ihrer Punktzahl ab. (Die Ganzzahleingabe wird auch für den Bonus niemals überflüssige Zeichen enthalten.)
Testfälle
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Für den Bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Hinweis: Curly ist noch nicht implementiert. Aber wenn diese Frage gut ist, kann ich sie weiterentwickeln.
quelle
Antworten:
Pyth,
3532 Bytes - 10% = 28,8Probieren Sie es online aus: Demo oder Test Suite
edit: Wie sich herausstellte, kann ich auch versehentlich mit falschen Curly Numbers umgehen. War überhaupt nicht geplant. ;-)
Erläuterung:
Der Code enthält zwei Ausdrücke. Der erste wandelt eine Zahl in eine geschweifte Zahl um, und der zweite wandelt eine geschweifte Zahl in eine reguläre Zahl um.
.x
behandelt, welcher Ausdruck gedruckt wird. Es wird versucht, den ersten Ausdruck zu drucken. Wenn die Eingabe keine Ziffern enthält, schlägt der erste Ausdruck fehl (über Exception)..x
fängt die Ausnahme ab und druckt die zweite.quelle
.[Z2
notwendig war.CJam,
51474441 BytesProbieren Sie es online aus: Probelauf | Testsuite
Wie es funktioniert
quelle
Python 2, 167 Bytes - 10% = 150,3
In dieser Implementierung
c
ist die Funktion, die die Anforderungen erfüllt. Es gibt eine Zeichenfolge zurück, wenn eine nicht negative Ganzzahl als Eingabe angegeben wird, oder eine Ganzzahl, wenn eine geschweifte Zahl als Eingabe angegeben wird.quelle
Python 266 Bytes - 10% =
1268,1326,7239,4 BytesJunge, ich bin noch kein Code-Golfer = /, aber diese 10% haben mir sehr geholfen , als meine Punktzahl noch über 1000 lag!
Ich habe hier eine vollständig ausgearbeitete (und ausführliche) Version dieses Codes . Es erkennt die Gültigkeit von geschweiften Zahlen und bietet eine Schleifenschnittstelle zur Eingabe von Zahlen zum Testen.
(Kommentare nur zur Verdeutlichung)
Sehen Sie diesen Code in Aktion
Vielen Dank an Erik Konstantopoulos für die große Reduzierung der Bytes! Man könnte sagen ... er hat wirklich ein ... Byte ... aus meinem Code genommen ... * self five *
quelle
print
Anweisungen und einen Kommentar, Ihre Variablennamen sind zu lang und einige Leerzeichen können entfernt werden. Ich empfehle auch, Tipps zum Golfen in Pyrhon zu lesen .value
nachv
etc), 3) mache cleveres Golf-Zeug : Dies ist der Punkt, an dem du Dennis 'Link betrachten musst. Ich bin gespannt, wie viel Sie hier einsparen können!CJam,
87 bytes80.1 score (89 bytes - 10% bonus)Update-Version, die sich für den Bonus qualifiziert und gleichzeitig um 2 Byte wächst:
Probieren Sie es online aus
Zum ersten Mal habe ich die Rekursion in CJam! Das Ganze mag etwas langweilig aussehen, aber die beiden völlig getrennten Konvertierungen summieren sich.
Ich habe einen völlig separaten Fall für die Konvertierung von Zahlen kleiner als 4 in Curly verwendet. Es ist wahrscheinlich möglich, dies zu vermeiden, aber das Falten der Sonderfallbehandlung in die rekursive Funktion wäre nicht ganz trivial. Und das Hinzufügen des Extra
{}
als Nachbearbeitungsschritt sah nicht wirklich besser aus, obwohl ich es noch einmal versuchen sollte, wenn es etwas kürzer sein könnte.quelle
C #, 173 - 10% = 155,7
171,0, 177,3Dies führt keine Validierung durch und sucht nur nach
;
und}
Zeichen. Es wird davon ausgegangen, dass alle{
Zeichen vor den;
Zeichen stehen. Das Schwierigste, was ich gefunden habe, war, keine{}
in die Mitte einer Curly-Zahl einzufügen .Zeilenumbrüche und Einrückungen zur Verdeutlichung:
quelle
Java 326 Bytes - 10% = 294 Bytes
Es ist ein vollständiges Programm, das in Java geschrieben wurde.
Ich bin sicher, dass es viel kürzer sein kann, aber ich kann jetzt nicht viel Zeit haben, um es zu optimieren
quelle
public
vor klasse zu vermeidenpublic static void main(String[]c){
mitstatic{
GNU sed,
330326 - 10% = 293,4(Ich habe eine für die Verwendung von hinzugefügt,
-r
bevor ich den Bonus 10% beanspruchte. Ich hoffe, das ist richtig.)Die Vollversion zeigt, dass der größte Teil der obigen Konvertierung zwischen Dezimal und Unär ist:
quelle
Perl,
183177Dies ist möglicherweise nicht die kürzeste Perl-Antwort, aber ich denke, es ist interessant genug, sie zu posten (Eingabe in
$_
, Ausgabe als Rückgabewert):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Wir beobachten, dass Curly einfach eine quaternäre Notation (Basis 4) ist. Wir sind ein wenig behindert von Perls mangelnder nativer Unterstützung für Quaternary, aber zum Glück besteht jede Quaternit aus zwei binären Bits und wir können Binärdateien lesen und schreiben. Wir haben also folgendes:
Erweiterte Version
quelle
JavaScript (ES6), 95 (105-10%)
Testen Sie das folgende Snippet
quelle
Rubin,
126,9129,6 (144 - 10%)Verwendet die Rekursion, um Dezimalzahlen in geschweifte Form umzuwandeln. Das Deaktivieren des Kontrollkästchens zum Ignorieren von Zeichen außerhalb von
/[;{}]/
erhöht die Punktzahl0.4
im Moment um.quelle
Perl 5, 154 (
185170 Bytes - 10% + 1 Strafe)Regex & eval lösen die Locken auf.
Die Erzeugung der Locken erfolgt unterschiedlich.
Prüfung
Die Testdatei enthält auch die Bonusfälle
quelle
Retina ,
6964 BytesTesten Sie die Test Suite
Erläuterung
Zerlegen Sie die innersten Klammern in
;
s. Schleife, bis keine Klammern mehr vorhanden sind.Zwischen Dezimalzahl und Unärzahl konvertieren
;
Suchen Sie den längsten Lauf mit
;
einem Vielfachen von 4 und schachteln Sie in geschweiften Klammern. Führen Sie eine Schleife aus, bis keine Läufe mit 4+ mehr vorhanden sind.Wenn die resultierende geschweifte Zahl mit einer
;
leeren Zeichenfolge beginnt oder leer ist, fügen Sie diese{}
voran.quelle
Python 2 , 157 Bytes -10% = 141,3
Probieren Sie es online!
Eine eher golfene Antwort auf Python 2, die die Bonusfälle behandelt. Wollte keine toten Beiträge mit diesem als Kommentar necro, also hier ist es.
Es funktioniert von innen nach innen mit geschweiften Zahlen und addiert 4 ^ (die Anzahl der in der Zeichenfolge verbleibenden geschweiften Klammern) zur Summe für jedes gefundene Semikolon. Wenn es sich bei der Zeichenfolge um eine Zahl handelt, wird die geschweifte Zahl auf die gleiche Weise wie in der angegebenen Grammatik rekursiv erstellt.
quelle