Geben Sie die gespiegelte Version einer Zahl zurück

18

Wenn eine Zahl auf einem Taschenrechner angezeigt wird, können Sie überlegen, wie verschiedene Transformationen dieser Zahl aussehen würden. Beispiel: Auf einer Siebensegmentanzeige wird 2 folgendermaßen angezeigt:

Bildbeschreibung hier eingeben

Und wenn es horizontal gedreht wird, sieht es so aus:

Bildbeschreibung hier eingeben

Als solches ist das Spiegelbild von 2 5.

Die Aufgabe bei dieser Herausforderung besteht darin, eine einstellige Zahl zu nehmen und die Zahl, die das Spiegelbild ist, zurückzugeben (falls möglich). Wenn das Spiegelbild nicht wie eine Zahl aussieht, geben Sie die Zahl um 180 Grad gedreht zurück (falls möglich). Ist dies nicht der Fall, geben Sie -1 zurück.

Hier ist die vollständige Liste der Ein- und Ausgaben, die Ihr Programm verarbeiten muss:

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

Als Herausforderung gewinnt der kürzeste Code!

James Williams
quelle
17
Ich bin mit Ihrem letzten Punkt nicht einverstanden - eine 1 auf einer 7-Segment-Anzeige würde einfach auf die andere Seite gedreht, also sollte 1 auf 1
schlafen.
29
Ich bin verwirrt darüber, wie man jede Ziffer umdreht. Wenn 2 zu 5 wird, sollte 6 zu 9 und nicht zu 9 werden. Wenn 6 zu 9 wird, ist der Flip nur eine Drehung, also wird 2 zu 2 und nicht zu 5.
kernigh
6
6, 9 um 180 Grad gedreht, 2, 5 horizontal gedreht, und 1, 3 sind tatsächlich Reflexionen von sich selbst über die vertikale Achse.
Jimmy23013
22
Die in der Frage definierten Übersetzungen sind überhaupt nicht konsistent. Warum drehen 2 und 5, 3 aber nicht?
Rynant
4
Mir ist eine merkwürdige Tatsache bei den umschaltbaren Zahlen aufgefallen: Sie bilden entgegengesetzte binäre Muster, dh 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Kann jemand diese Tatsache in ihrer Lösung verwenden?
Jack Aidley

Antworten:

32

Haskell - 43 31

43 Charaktere ohne etwas Besonderes.

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

Es wurde auf 31 Zeichen reduziert, indem eine Teilfunktion erstellt wurde.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
Taylor Fausak
quelle
4
Ich lachte. Habe eine +1.
Siehe auch
6
+1 Für die Verwendung von Haskell, um genau das zu tun , was der Spezifikation entspricht. sagt!
recursion.ninja
1
Ich glaube nicht, dass Sie f=für die zweite Lösung benötigen, da es sich um einen gültigen Ausdruck handelt
Cyoce
23

GolfScript, 15 14

Ich las die Spezifikation erneut und stellte fest, dass die Eingabe eine Zeichenfolge sein muss.

"0.5..29.86"\?

Zu rennen:

echo -n 2 | ruby golfscript.rb a.gs

Alte Version (mit Integer-Eingabe):

[0.5..2 9.8 6]?

Das neuere (14 Byte) ist etwas von der CJam-Antwort von aditsu inspiriert .

jimmy23013
quelle
1
Ich kann nicht glauben, dass ich nicht daran gedacht habe ...
Dennis
19

PowerShell - 27

'0 5  29 86'.indexof($args)
Rynant
quelle
14

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
quelle
2
Insbesondere Python 2.x.
Siehe auch
6
Mit Python 3 können Sie das `s entfernen und 2 Zeichen speichern.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
quelle
benutze .search()und speichere ein Byte.
Ismael Miguel
@IsmaelMiguel Schön, danke!
DarkAjax
8

CJam, 20 Bytes

q25691347`"5296W"er~

Probieren Sie es online aus.

Ausgabe

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

Wie es funktioniert

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";
Dennis
quelle
8

BEFUNGE 93 - 18 14 20 Bytes

Ich denke, die Kommentatoren haben Recht, obwohl Befunge als 2D-Sprache etwas anders ist. Dennoch haben die Kommentatoren in diesem Moment Recht.

&1g01g-.  
! &  #* )'

Schritte:

&

Liest die Eingabe als numerischen Wert x und schiebt sie auf den Stapel.

1g

Erhält den Zeichenwert c (also '!' = 33 oder '*' = 42. Eine leere Zelle = 32) an Position x, 1.

01g-.

Liest den Zeichenwert der Zelle 0,1 (33), subtrahiert ihn von c und gibt ihn als numerischen Wert aus.

AndoDaan
quelle
2
Ganz nett. Habe eine +1.
Siehe auch
Bitte korrigieren Sie die Länge: es ist 20 Bytes
har-wradim
1
Sie haben tatsächlich die falschen Bytes gezählt. Sie haben 19 Bytes verwendet. Wir zählen Zeilenumbrüche und Leerzeichen. Wenn Sie jedoch zu Befunge 98 wechseln, können Sie eine speichern. 1. Zeile ändern auf:&1g'!-.
Justin
8

Java - 49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

Hier 0x790a300601ist ein Wert, der mit den gewünschten Ausgängen gefüllt ist, wobei einer hinzugefügt wird, um sie positiv zu machen. Die Werte werden in Halbbytes innerhalb des Werts gespeichert, daher ist ein wenig Verschieben und Maskieren erforderlich, um sie auszublenden.

Java - 100 (unterhaltsame Option)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

Nicht die kleinste Option, aber ein bisschen Spaß. Ich habe einen zufälligen Startwert gefunden, der beim X- maligen Aufruf die richtigen Werte liefert (wobei 0> = X <= 9).

Duncan Jones
quelle
Klug. Haben Sie ein +1
Cyoce
8

JavaScript (ECMAScript 6) 25

x=>'1060039097'[x]-(x!=6)

JavaScript (ECMAScript 5) 43

function f(x){return'1060039097'[x]-(x!=6)}

UPDATE: edc65 hat eine viel bessere Technik vorgeschlagen. Zahnbürste hat eine viel bessere Sprache vorgeschlagen. Zu diesem Zeitpunkt sind mein Hauptbeitrag das Debuggen und Kaugummi.

Daran interessiert
quelle
1
Wenn Sie es in ECMAScript 6 (in Firefox unterstützt) ändern, können Sie dies einfach tun x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Zahnbürste
Anfangs hätte ich fast gepostet function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], auch dank Firefox. Ich würde sowieso nicht gewinnen, also beschloss ich, mich nur an die Antwort mit der höchsten Kompatibilität zu halten. Wenn ich anfange, die Sprache der Kürze halber zu wechseln, werde ich irgendwann meine eigene Sprache für jede meiner Herausforderungen definieren. Aber ich werde trotzdem die ECMAScript 6-Version erwähnen, da Sie sie vorgeschlagen haben
Keen
1
Gleiches Konzept, aber kürzer (Tschüss Kommas): x => '106003907' [x] - (x! = 6)
edc65
@ edc65 Weißt du, ich wollte eine Zeichenfolge verwenden, und ich hatte völlig ausgeblendet, dass ich das Ergebnis zurück zu einer Zahl zwingen könnte. Ein bizarrer Fehler. Ich hätte es mir trotzdem nicht ausgedacht -(x!=6). Vielen Dank.
Keen
6

Bash 29

tr 1-9 x5xx29x86|sed s/x/-1/g

z.B

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6

quelle
Sie können 'den Ausdruck um sed weglassen . Auch ich denke, Sie können das weglassen, gweil die Spezifikation nur eine Ziffer auf einmal liefert
Digital Trauma
Vielen Dank. Es ist nur in dem Beispiel, das die Übermittlung selbst nicht verwendet '. Ich mag die gfür längere Eingabe!
4

Kona - 29

Diese Funktion gibt das Element xaus dem Array zurück0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

Beispiele:

> f 2
  5
> f 5
  2
> f 8
  8
Kyle Kanos
quelle
Ist ein Vektor an sich wirklich erlaubt?
Siehe auch
@TheRare: Hmm, es heißt "Algorithmus" also nehme ich nicht an. Ich werde es ändern und es mehr wie deine machen ...
Kyle Kanos
Scheint besser, habe eine +1.
Siehe auch
4

JavaScript 36 37 41

alert('0x'+'65b558f5ec'[prompt()]-6)

als ES6 Funktion - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
core1024
quelle
2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore
@nderscore Du liebst es einfach, die Codes der Leute zu verbessern, oder?
Siehe auch
3
@TheRare Ich bin gerade auf der Suche nach dem kürzesten Javascript-Code. :) Wenn jemand anderes bereits eine gute Antwort gepostet hat, ist es für mich sinnvoller, darin Optimierungen zu finden, als eine neue Antwort zu posten, die fast doppelt vorhanden ist. Ich bin nicht hier, um zu konkurrieren, nur um zusammenzuarbeiten, um dieses Ziel zu erreichen.
nderscore
@nderscore Ich habe die gleiche Mentalität, solange meine Idee ähnlich genug ist. Wie auch immer, nett.
Siehe auch
@nderscore Du hast mir wirklich eine Motivation gegeben. Ich bin mir nicht sicher, ob ich es kürzer machen kann, aber ich werde es versuchen :)
core1024
4

Sclipting, 11 Zeichen

걄럣뉥밈결⓷方分결剩貶

Schließlich habe ich einen Windows-Computer gefunden, auf dem Visual Studio installiert ist, um dessen Interpreter zu erstellen. Und es hat meinen GolfScript-Code leicht besiegt.

Es liest 18453063256\11\?/11%(in GolfScript.

jimmy23013
quelle
2
Interessant, aber Ihre GolfScript-Antwort gewinnt immer noch. Sofern in der Frage nichts anderes angegeben ist, wird die Länge in Bytes gemessen.
Dennis
@Dennis Dies war meine 3. oder 4. Antwort auf dieser Seite. Ich wusste es nicht. Und ich denke, APL ist eine Ausnahme.
Jimmy23013
@Dennis Und die meisten Leute mögen kein Sclipting. :)
Jimmy23013
Nicht wirklich eine Ausnahme, wir lassen die Leute nur ihre Kodierung auswählen. Diese Antwort würde 22 Bytes ergeben, da dies die Größe mit UTF-16 ist. APL verwendet nur 256 verschiedene Zeichen und es gibt eine APL-Codepage, bei der ein Zeichen genau ein Byte lang ist.
Dennis
@ Tennis Ah, du hast recht.
Jimmy23013
3

J - 28 27 Bytes

Du weißt was ich mag? Einfachheit (28 Bytes). Beachten Sie, dass in J _1eine negative Zahl (-1) ist.

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

Fügen Sie ein wenig Komplexität hinzu und Sie haben 27 Bytes.

f=:-{&0 2 _3 4 5 3 _3 8 0 3

Beispiel:

   f 2
5
   f 6
9
   f 5
2
...
seequ
quelle
3

CJam - 14

Eingabe- / Ausgabeversion:

"0 5  29 86"q#

Stack-Version (setzt voraus, dass sich die Nummer auf dem Stack befindet):

[0W5WWY9W8 6]=

Probieren Sie sie unter http://cjam.aditsu.net/

aditsu
quelle
Es gibt keinen Wikipedia-Artikel über CJAM, und der Link führt nur zu einem leeren Geiger. Wo finden Sie Informationen über die Sprache und ihre etablierten Veröffentlichungen?
Panzercrisis
Sieht so aus: sourceforge.net/projects/cjam
Panzercrisis
@Panzercrisis cjam.aditsu.net hat "CJam" mit der
SourceForge-
3

Perl, 27 26

Count enthält die pFlagge

y/2569/5296/,s/[1347]/-1/

Verwendung:

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

Warten Sie, hat Perl gerade J geschlagen? :)

Zaid
quelle
+1 Ich wollte posten y+0-9+9a4aa70a13+;$_=9-hex, das ist die gleiche Länge, aber Ihr ist origineller;)
Core1024
1
@ Core1024: Und es wurde gerade kürzer;)
Zaid
Es hat nicht:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
Core1024
@ core1024: Ich habe die Angaben falsch gelesen, sollte jetzt behoben sein. Es ist immer noch kürzer als die J-Lösung.
Zaid
In J gibt es wirklich keine präzise Möglichkeit, dies zu tun, da die Werte streng getippt sind und Zahlen nicht mit Zeichenfolgen übereinstimmen können.
Siehe auch
3

Marbelous 34 Bytes

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

Es ist nicht die kürzeste Lösung, aber auch nicht die längste.

Wie es funktioniert

}0erzeugt eine Murmel, die die erste Befehlszeileneingabe darstellt. Dieser Marmor fällt beim nächsten Tick auf die =6Zelle. =6Ist eine Vergleichszelle, drückt sie jeden Marmor mit dem Wert 6 nach unten und alle anderen nach rechts. Diese Reihe von Vergleichszellen drückt die Murmeln nach rechts, bis sie einem gewünschten Wert entsprechen. 0 und 8 fallen einfach durch und werden gedruckt, wenn sie von der Unterseite der Platine fallen. 6 und 2 und 9 und 5 werden zuerst mit 3 addiert und von diesen jeweils abgezogen. Wenn ein Marmor nicht den gewünschten Werten entspricht, landet er in der ?0Zelle, wodurch jeder Marmor zu einem 0-Marmor 1 wird . Dieser Marmor wird dann dekrementiert und fällt vom Brett.

1 Ein ?nMarmor verwandelt technisch jeden Marmor in einen Marmor zwischen 0 und n. Das hat den netten Nebeneffekt, dass ?0alles zu 0 wird.

Überakteur
quelle
2

MATLAB - 35

Ich würde dies in eine Funktion mit ndem einzigen Parameter einschließen.

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35 Zeichen.

lukass
quelle
2

ECMAScript 6, 24

f=x=>~-++'0n5nn29n86'[x]

Mit normalem JavaScript wäre es 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
quelle
2

TI-BASIC, 24 22

-1+int(11fPart(11^Ans.0954191904

Dies codiert die möglichen Ausgaben in einer Nachschlagetabelle, die als Gleitkommazahl zur Basis 11 gespeichert ist. Die (N + 1) -te Ziffer der Basis 11 nach dem Dezimalpunkt wird aus der Tabelle extrahiert, um den Wert der invertierten Ziffer zu erhalten. In der Basis 11 ist die Zahl .106003A097und die Ziffern dieser Zahl sind genau 0,-1,5,-1,-1,2,9,-1,8,6.

Der Trick von edc65, bei 6 eine zu subtrahieren, führt zu dieser 24-Byte-Lösung, bei der ⑩^(es sich um ein einzelnes 1-Byte-Token handelt:

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

Der String-Ansatz ist 29 Bytes:

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

Der Array-Ansatz (den auch Ypnpyn gewählt hat) ist 30 Byte, vorausgesetzt, die Nummer ist in X gespeichert:

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24 -> 22: Zwei zusätzliche Präzisionsziffern in der magischen Konstante entfernt.

Lirtosiast
quelle
Dies kann mit ziemlicher Sicherheit auf 19 und möglicherweise auf 18 golfen werden; Ich muss jedoch nach den richtigen Nummern suchen.
Lirtosiast
2

C - 47 Bytes [war 48 Bytes]

f(i){return(int[]){1,0,6,0,0,3,10,0,9,7}[i]-1;}

So fügen Sie E / A für 86 Bytes hinzu (was andere Antworten nicht immer taten):

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}
NoSeatbelts
quelle
1
Wow, ich hatte keine Ahnung, ob Inline-Array-Literale wie diese eine Sache waren. Sehr nette erste Antwort und willkommen bei PPCG! (Es ist nicht erforderlich, E / A- Funktionen hinzuzufügen. Einsendungen sind vollkommen gültig .)
Martin Ender
1

Python - 34

f=lambda n:ord("A@F@@CJ@IG"[n])-65

quelle
1
33 f=lambda n:ord(" "[n])-3Arbeiten mit Leerzeichen codeskulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti
Vielleicht möchten Sie erklären, wie und warum dies funktioniert
Riot
Unter Verwendung der ASCII-Tabelle asciitable.com können die ausgewählten Leerzeichen in Python gedruckt werden. es sieht tatsächlich so aus, als wäre &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;es minus 3, weil -1 ein Null-Zeichen hinterlässt, was nicht gut ist, und minus 2 einen Zeilenvorschub, der in Python reserviert ist
Dylan Madisetti,
1

Java, 58-59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

ODER

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}
Ypnypn
quelle
Sie können Ihren Code etwas kürzer machen, indem Sie zu jedem Wert im Array 1 addieren und danach [i] 1 subtrahieren.
barteks2x
@ Barteks2x Guter Punkt; Danke
Ypnypn
1

JavaScript 42 37

Führen Sie es in der Konsole Ihres Browsers aus

alert(~-[1,,6,,,3,10,,9,7][prompt()])
William Barbosa
quelle
1

C - 117 108 106 77 76 Bytes

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

Nicht die beste Sprache zum Golfen, aber na
ja ... Kompilieren mit gcc progname.c -o progname. (Ignorieren Sie die Warnungen oder ergänzen Sie -include stdio.hden Kompilierungsbefehl.)

Verwendung: ./progname <Nummer>

BEARBEITEN

Nach dem Vorschlag von @ bebe ist hier ein Beispiel, das stattdessen die Eingabe von STDIN übernimmt:

C - 68 51 Bytes

main(){printf("%d","106003:097"[getchar()-48]-49);}
BenjiWiebe
quelle
Verwenden d=*b[1]-48könnte eine gute Idee sein
Bebe
@bebe Ah ja, danke!
BenjiWiebe
1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}Es tut mir leid, dass ich Sie so gestört habe, aber ich finde das etwas kürzer.
Bebe
Sie können ein anderes Zeichen speichern, indem Sie das Array global machen, sodass Sie die Besetzung nicht benötigen. a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);}
Allbeert
2
main(){printf("%d","106003:097"[getchar()-48]-49);} 51 Bytes
Bebe
1

J (24, Funktion)

(Das Eingabefeld spielt nicht gut. Fügen Sie Folgendes in einen Python-Interpreter ein, und meine Antwort wird angezeigt :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"
ɐɔıɐɔuʇǝɥʇs
quelle
1

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
Core-Dump
quelle
1

05AB1E , 13 Bytes (nicht konkurrierend)

0®5®®Y9®8 6¹@

Probieren Sie es online!

-3 danke an Emigna .

Erläuterung:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.
Erik der Outgolfer
quelle
0®5®®Y9®8 6¹@sollte auch funktionieren.
Emigna
@Emigna Ich hatte keine Ahnung, danke!
Erik der Outgolfer
Gutes Denken mit @. Nicht oft sieht man das gebraucht :)
Emigna
@Emigna Ein Byte kürzer als )¹èoder )sè.
Erik der Outgolfer
1

Jelly , 14 Bytes (nicht konkurrierend)

ị“-5--29-860”V

Probieren Sie es online!

Erläuterung:

ị“-5--29-860”V Takes argument as an integer.
 “-5--29-860”  "-5--29-860" (1-indexed string).
ị              Return the xth char of the string above (y) (x=argument).
             V Eval. - is the same as -1.
Erik der Outgolfer
quelle
ịV = žh‡in 05AB1E
Magic Octopus Urn