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!


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]!!)

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 .


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


14

Python 2.x - 28

'015..29.86'.find(`input()`)

2
Insbesondere Python 2.x.
Siehe auch

6
Mit Python 3 können Sie das `s entfernen und 2 Zeichen speichern.
Rynant


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. ";

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.


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).


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.


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

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

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

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.


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
...

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/


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


@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? :)


+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.


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.


2

ECMAScript 6, 24

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

Mit normalem JavaScript wäre es 33:

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

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.


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);}

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

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;}

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()])

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);}

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')"


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.

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.