Helfen Sie mir, die Reparatur meines Computers hinauszuschieben!

23

Diese Herausforderung wird Ihnen durch echte (und tragische) Inspiration gebracht. Vor kurzem war die Zahlenreihe auf meiner Tastatur etwas sporadisch. Die Schlüssel 1-9funktionieren 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 1nicht so einfach hexadezimal geschrieben werden, und ich habe auf das Ersetzen von 1s 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 nmit 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 nals 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 Aes sich um einen Hexadezimalwert handelt 0x, der nur Ziffern enthält A-F a-fund %eines der Symbole ist -+/. /Beschreiben wir die ganzzahlige Division, nicht die Gleitkommazahl.

(Beachten Sie, dass Ihre Ausgabe nbei 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. 1

    0xF - 0xE(oder 0xF-0xEoder 0xB-0xAoder 0xd - 0xcoder 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 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-9in 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 nals 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!

BrainSteel
quelle
Gibt es eine Obergrenze für die Größe der Ganzzahl? Werden auch negative Zahlen mit einer willkürlichen Genauigkeit dargestellt (dh 32 Bit)?
FryAmTheEggman
@FryAmTheEggman Bearbeitet den ursprünglichen Beitrag zu klären. Die Eingabe ist möglicherweise negativ, und Ihr Programm sollte auf mindestens 32-Bit-Eingaben korrekt reagieren. Vielen Dank!
BrainSteel
Dies sieht für mich nach einer ziemlich soliden Spezifikation aus, aber wenn Sie ein Feedback wünschen, würde ich empfehlen, es in der Sandbox zu veröffentlichen (für zukünftige Herausforderungen), damit Sie Feedback erhalten können, bevor Sie es auf main veröffentlichen, und die Leute beginnen, daran zu arbeiten .
Martin Ender
1
Ganzzahl- oder Gleitkommadivision?
edc65

Antworten:

5

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 7 offene 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 ifs und explizite RegExp-Erstellung

Achtung: 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 - 0xDgü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)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

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

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Test Ändern Sie in der Firefox / FireBug-Konsole den Alarm mit der Rückgabe (viel besser verwendbar).

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Nur ein bisschen weniger offensichtlich (aber sei geduldig)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA

edc65
quelle
3

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.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

productErzeugt alle unterschiedlichen Anordnungen der erlaubten Zeichen. execversucht es zu entschlüsseln. Dies gibt leider eine Ausnahme zurück, von da an den langen try - catchBlock. Wenn das Ergebnis in Ordnung ist, druckt es und existiert.

2-fache Strafe wegen dieser Klammern bei Funktionsaufrufen.

Jakube
quelle
2
Diese Antwort könnte ein paar Probleme haben: (1) 0ist kein hexadezimales Literal; (2) Eine Division mit einer negativen Zahl in Python ergibt ein anderes Ergebnis als in C.
Feersum