Diese Herausforderung wird Ihnen durch echte (und tragische) Inspiration gebracht. Vor kurzem war die Zahlenreihe auf meiner Tastatur etwas sporadisch. Die Schlüssel 1-9
funktionieren manchmal - aber manchmal haben sie kein Ergebnis. Als begeisterter Programmierer ist das schrecklich! (Sehen Sie dieses Ausrufezeichen? So wissen Sie, dass sie gerade funktionieren.) Ich brauche oft nicht nur die Zahlen selbst, sondern auch die Symbole!@#$%^&*(
sind auch die halbe Zeit völlig ineffektiv! Als C-Programmierer war ich mehr daran interessiert, das Problem zu umgehen, als mir die Zeit zu nehmen, mich mit Code zu beschäftigen, um meinen Laptop zu reparieren. In den letzten Wochen wurden langsam alle Zahlenliterale in meinem Code durch Hexadezimalzahlen ersetzt, damit ich nicht nach Zahlen suchen muss, die kopiert und eingefügt werden können. Einige Zahlen sind jedoch ohne die Tasten nicht einfach einzugeben 1-9
. Zum Beispiel kann die Zahl 1
nicht so einfach hexadezimal geschrieben werden, und ich habe auf das Ersetzen von 1
s in meinem Code durch zurückgegriffen 0xF - 0xE
. Die einzigen Tasten , die betroffen sind 1-9
, so dass ich vollen Gebrauch von Symbolen wie halten +
, -
und /
. Ich kann jedoch keine Multiplikation oder Klammern verwenden, da*
und (
sind oft kaputt. Dies führt zu Ihrer Herausforderung.
Eingang
Eine Ganzzahl, die n
mit stdin oder der Entsprechung Ihrer Sprache übereinstimmt. Wenn Sie möchten, kann der Ganzzahl eine neue Zeile oder ein anderes Leerzeichen vorangestellt oder gefolgt werden. Alternativ können Sie Eingaben über ein Befehlszeilenargument erhalten.
Ihr Programm sollte korrekt auf negative Eingaben reagieren und mindestens 32-Bit-Ganzzahlen mit Vorzeichen verarbeiten können.
Ausgabe
Ihr Programm sollte in einer beobachtbaren Form den kürzesten (in Leerzeichen) möglichen Weg ausgeben, um die Zahl n
als Summe, Differenz oder Division eines oder mehrerer Hexadezimalwerte zu schreiben . Es gibt mehr als eine Möglichkeit, dieses Problem zu lösen, und Sie müssen keine Ausgabe gleicher Länge gegenüber einer anderen bevorzugen.
Die Ausgabe sollte in der Form erfolgen, A % A % A...
bei der A
es sich um einen Hexadezimalwert handelt 0x
, der nur Ziffern enthält A-F a-f
und %
eines der Symbole ist -+/
. /
Beschreiben wir die ganzzahlige Division, nicht die Gleitkommazahl.
(Beachten Sie, dass Ihre Ausgabe n
bei der Auswertung von Divisionen zuerst von links nach rechts und dann von links nach rechts zu Additionen und Subtraktionen führen sollte, wie es die Konvention vorsieht.)
Testfälle
Input-Output
1
0xF - 0xE
(oder0xF-0xE
oder0xB-0xA
oder0xd - 0xc
oder0xF/0xF
)15
0xF
255
0xFF
30
0xF + 0xF
Wertung und Regeln
Das ist Code-Golf. Ihre vorläufige Bewertung ist die Anzahl der Bytes in Ihrer Quelldatei.
Sie dürfen KEINE der Ziffern 1-9
in Ihrer Quelle verwenden.
Sie KÖNNEN !@#$%^&*(
in Ihrer Quelle Symbole verwenden, aber für jedes werden Sie mit einer Strafe von +20 für Ihre Punktzahl bestraft.
Ihr Programm kann durch eine Funktion ersetzt werden, die n
als Argument verwendet wird, solange diese Funktion eine von Menschen lesbare Ausgabe erzeugt. Der Rückgabewert Ihrer Funktion zählt NICHT als Ausgabe.
Standardlücken sind nicht erlaubt.
Die niedrigste Punktzahl gewinnt! Viel Glück!
Habe ich etwas in Bezug auf Formatierung / Fragen / Klarheit vermasselt? Gib mir Bescheid! Dies ist meine erste Einreichung auf dieser Seite!
quelle
Antworten:
JavaScript 287 (187 + 20 * 5)
295 (195 + 20 * 5) 338 (198 + 20 * 7)Eine Funktion, die alle möglichen Kombinationen der 6 zulässigen Hexadezimalstellen (0xA bis 0xF) und der 3 zulässigen Operatoren überprüft. Ausgabe über Popup und nicht wie gewünscht Rückgabe eines Wertes.
Früher habe ich [] , um Gruppe Komma getrennt Ausdruck konnte aber nicht 5 vermeiden
7offene Klammern für Schleifen und Funktion aufrufen.Um Ziffern zu vermeiden, gibt es Variablen A, B, C für 1,2,3 (dies macht den Code noch dunkler)
Der Code wurde überarbeitet und konzentriert sich auf das Vermeiden von '('. Entfernte
if
s und explizite RegExp-ErstellungAchtung: Diese Funktion ist unglaublich langsam und überschreitet das Zeitlimit für ein Skript in FireFox, selbst für kleine Eingaben wie 90.
Um alle möglichen Ausdrücke aufzulisten, verwende ich eine Zahl, die bei 3 beginnt und für immer aufsteigt. Ziffernkodierung:
0,1,2 sind die Operatoren +, -, /
4 bis 9 sind die Hexadezimalziffern. A..F
3 ist nicht zulässig.
Jede Zahl wird mit einem regulären Ausdruck überprüft
/3|[0-2]{2}/
, um die Ziffer 3 zu vermeiden und 2 aufeinanderfolgende Operatoren zu haben (die prüfe auch vermeide traling und führende betreiber (siehe code)Der resultierende String ist so etwas wie ein
0xA + 0xA - 0xD
gültiges Javascript, also benutze ich eval, um ihn auszuwerten. Leider ist der Operator '/' in JavaScript ein Gleitkommawert und keine Ganzzahl. Daher bin ich mir nicht zu 100% sicher, ob das Ergebnis korrekt ist. Die Umwandlung in eine Ganzzahl ergibt das Endergebnis. Ich bin jedoch ziemlich zuversichtlich, da ein kleiner Rundungsfehler dies nicht kann durch ein '*' verstärkt werden)Etwas anderes
Nun, etwas lustigeres. Ich habe einen stark vereinfachten Ausdrucks-Parser verwendet, um den Auswertungsaufruf zu vermeiden, und das stellte sich amüsanterweise als viel schneller heraus.
Der Parser ist wirklich vereinfacht, in einem echten Parser sollten V und O Arrays sein, die den Stapel ausstehender Werte und den Stapel ausstehender Operatoren enthalten. Hier ist V der einzelne anstehende Wert (und auch der Rückgabewert) und O ist eine Zeichenfolge mit höchstens 2 Zeichen. P enthält die Rangfolgetabelle der Operatoren für '- + /' => '112'
Dies ergibt 275 + 4 * 20 => 355
Test Ändern Sie in der Firefox / FireBug-Konsole den Alarm mit der Rückgabe (viel besser verwendbar).
Nur ein bisschen weniger offensichtlich (aber sei geduldig)
quelle
Python 2: 185 Byte + 2 * 20 = 225
Viel zu lange für eine ernsthafte Antwort. Aber da es noch keine Antworten gibt, werde ich es trotzdem posten.
product
Erzeugt alle unterschiedlichen Anordnungen der erlaubten Zeichen.exec
versucht es zu entschlüsseln. Dies gibt leider eine Ausnahme zurück, von da an den langentry - catch
Block. Wenn das Ergebnis in Ordnung ist, druckt es und existiert.2-fache Strafe wegen dieser Klammern bei Funktionsaufrufen.
quelle
0
ist kein hexadezimales Literal; (2) Eine Division mit einer negativen Zahl in Python ergibt ein anderes Ergebnis als in C.