Restituisce la versione capovolta di un numero


18

Quando un numero viene mostrato su una calcolatrice, è possibile considerare come sarebbero le varie trasformazioni di quel numero. Ad esempio, su un display a sette segmenti, 2 viene mostrato in questo modo:

enter image description here

E quando capovolto in orizzontale appare così:

enter image description here

Pertanto, l'immagine speculare di 2 è 5.

Il compito di questa sfida è prendere un numero a una cifra e restituire il numero che è la sua immagine speculare (se possibile). Se la sua immagine speculare non sembra un numero, restituisce il numero ruotato di 180 gradi (se possibile). Se nessuno di questi è il caso, restituire -1.

Ecco l'elenco completo di input e output che il tuo programma deve gestire:

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

Come una sfida di , vince il codice più corto!


17
Non sono d'accordo con il tuo ultimo punto: un 1 su un display a 7 segmenti verrebbe semplicemente girato dall'altra parte, quindi 1 dovrei fare un pisolino a 1.
Jwosty

29
Sono confuso su come capovolgere ogni cifra. Se 2 diventa 5, quindi 6 dovrebbe diventare 9 all'indietro, non 9. Ma se 6 diventa 9, il flip è solo una rotazione, quindi 2 diventa un altro 2, non 5.
kernigh

6
6, 9 ruotati di 180 gradi, 2, 5 ruotati orizzontalmente e 1, 3 in realtà sono riflessi di se stessi attraverso l'asse verticale.
jimmy23013,

22
Le traduzioni definite nella domanda non sono affatto coerenti. Perché 2 e 5 si capovolgono, ma 3 no?
Rynant,

4
Ho notato un fatto curioso sui numeri commutabili: formano schemi binari opposti, cioè 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Qualcuno può usare questo fatto nella loro soluzione?
Jack Aidley,

Risposte:


32

Haskell - 43 31

43 personaggi senza nulla di speciale.

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

Sono arrivato a 31 caratteri rendendolo una funzione parziale.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)

4
Mi misi a ridere. Prendi un +1.
Seequ,

6
+1 Per l'utilizzo di Haskell per fare esattamente ciò che le specifiche. dice!
recursion.ninja,

1
Non penso che tu abbia bisogno f=della seconda soluzione in quanto è un'espressione valida
Cyoce,

23

GolfScript, 15 14

Ho letto di nuovo le specifiche e ho scoperto che l'input deve essere una stringa.

"0.5..29.86"\?

Correre:

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

Vecchia versione (che ha input intero):

[0.5..2 9.8 6]?

Il più recente (14 byte) è in qualche modo ispirato dalla risposta CJam di aditsu .


1
Non riesco a credere che non ci abbia pensato ...
Dennis,


14

Python 2.x - 28

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

2
Python 2.x, in particolare.
Seequ,

6
Con Python 3, è possibile rimuovere `s e salvare 2 caratteri.
Rynant,


8

CJam, 20 byte

q25691347`"5296W"er~

Provalo online.

Produzione

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

Come funziona

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 byte

Immagino che i commentatori abbiano ragione, anche se Befunge essendo una seconda lingua le linee sono un po 'diverse. Tuttavia, in questo istante, i commentatori hanno ragione.

&1g01g-.  
! &  #* )'

passi:

&

Legge l'input come valore numerico x e lo inserisce nello stack.

1g

Ottiene il valore del carattere c (quindi, come '!' = 33, o '*' = 42. Una cella vuota = 32) nella posizione x, 1.

01g-.

Legge il valore del carattere della cella 0,1 (33), lo sottrae da c e lo emette come valore numerico.


2
Piuttosto bella. Prendi un +1.
Seequ,

Correggi la lunghezza: 20 byte
har-wradim,

1
In realtà hai sbagliato a contare i tuoi byte. Hai usato 19 byte. Contiamo newline e spazi. Ma se passi a Befunge 98, puoi salvarne uno; cambia la 1a riga in:&1g'!-.
Giustino il

8

Java - 49

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

Qui, 0x790a300601 c'è un valore pieno degli output desiderati, con uno aggiunto per renderli positivi. I valori sono memorizzati in nibble all'interno del valore, quindi è necessario un po 'di spostamento e mascheramento per eliminarli.

Java - 100 (opzione divertente)

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

Non è l'opzione più piccola, ma un po 'divertente. Ho trovato un seme casuale che produce i valori corretti quando viene chiamato X volte (dove 0> = X <= 9).


Intelligente.
Prendi

8

JavaScript (ECMAScript 6) 25

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

JavaScript (ECMAScript 5) 43

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

AGGIORNAMENTO: edc65 ha suggerito una tecnica molto migliore. lo spazzolino da denti ha suggerito un linguaggio molto migliore. A questo punto, i miei contributi principali sono il debug e il buon umore.


1
Se lo cambi in ECMAScript 6 (supportato in Firefox), potresti semplicemente farlo x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Spazzolino da denti,

All'inizio ho quasi pubblicato function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], anche grazie a Firefox. Non avrei vinto comunque, quindi ho deciso di attenermi alla risposta con la massima compatibilità. Se comincio a cambiare le lingue per brevità, alla fine inizierò a definire la mia lingua per ogni sfida che faccio. Ma andrò avanti e menzionerò comunque la versione ECMAScript 6, da quando l'hai suggerita
Keen

1
Stesso concetto ma più breve (ciao ciao virgole): x => '106003907' [x] - (x! = 6)
edc65,

@ edc65 Sai, avrei voluto usare una stringa e mi ero completamente oscurato dal fatto che avrei potuto forzare il risultato su un numero. Un bizzarro intervallo. Eppure non mi sarei ancora inventato -(x!=6). Grazie.
Appassionato il


6

bash 29

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

per esempio

$ 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

Puoi omettere l' 'espressione intorno a sed. Inoltre penso che tu possa ometterlo gperché le specifiche forniscono solo una cifra alla volta
Digital Trauma,

Grazie. È solo nell'esempio, l'invio stesso non utilizza '. Ti piace l' ginput più lungo!

4

Kona - 29

Questa funzione restituisce l'elemento xdall'array0 -1 5...

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

Esempi:

> f 2
  5
> f 5
  2
> f 8
  8

Un vettore da solo è davvero permesso?
Seequ,

@TheRare: Hmm, dice "algoritmo" quindi suppongo di no. Lo cambierò e lo renderò più simile al tuo ...
Kyle Kanos,

Sembra meglio, avere un +1.
Seequ,

4

JavaScript 36 37 41

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

come funzione ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6

2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore,

@nderscore Adori semplicemente migliorare i codici delle persone, vero?
Seequ,

3
@TheRare Sono solo alla ricerca del codice javascript più breve. :) Se qualcun altro ha già pubblicato una buona risposta, per me ha più senso trovare delle ottimizzazioni piuttosto che pubblicare una nuova risposta che è quasi un duplicato. Non sono qui per competere, solo per cooperare per raggiungere questo obiettivo.
nderscore,

@nderscore Ho la stessa mentalità purché la mia idea sia abbastanza simile. Comunque, bello.
Seequ,

@nderscore Mi hai davvero dato una motivazione. Non sono sicuro di poterlo abbreviare, ma ci proverò :)
core1024

4

Sclipting, 11 caratteri

걄럣뉥밈결⓷方分결剩貶

Finalmente ho trovato un computer Windows con Visual Studio installato per creare il suo interprete. E ha sconfitto facilmente il mio codice GolfScript.

Si legge 18453063256\11\?/11%(in GolfScript.


2
Interessante, ma la tua risposta GolfScript vince ancora. Se non diversamente indicato nella domanda, la lunghezza viene misurata in byte.
Dennis,

@Dennis Questa è stata la mia terza o quarta risposta su questo sito. Non lo sapevo. E penso che APL sia un'eccezione.
jimmy23013,

@Dennis E alla maggior parte delle persone non piace Sclipting. :)
jimmy23013,

Non proprio un'eccezione, lasciamo solo alle persone di scegliere la loro codifica. Questa risposta otterrebbe 22 byte, poiché questa è la sua dimensione usando UTF-16. APL utilizza solo 256 caratteri diversi e esiste una tabella codici APL in cui una volta il carattere corrisponde esattamente a un byte.
Dennis,

@Dennis Ah, hai ragione.
jimmy23013,

3

J - 28 27 byte

Sai quello che mi piace? Semplicità (28 byte). Si noti che in J _1è negativo (-1).

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

Aggiungi un po 'di complessità e hai 27 byte.

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

Esempio:

   f 2
5
   f 6
9
   f 5
2
...

3

CJam - 14

Versione input / output:

"0 5  29 86"q#

Versione stack (presuppone che il numero sia nello stack):

[0W5WWY9W8 6]=

Provali su http://cjam.aditsu.net/


Non ci sono articoli di Wikipedia su CJAM e il link va solo a un violinista vuoto. Dove vorresti trovare informazioni sulla lingua e le sue versioni stabilite?
Panzercrisis,


@Panzercrisis cjam.aditsu.net ha "CJam" collegato alla pagina sourceforge
aditsu,

3

Perl, 27 26

Il conteggio include il p bandiera

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

Uso:

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

Aspetta, Perl ha appena battuto J? :)


+1 Stavo per pubblicare y+0-9+9a4aa70a13+;$_=9-hex, che è della stessa lunghezza, ma il tuo è più originale;)
core1024

1
@ core1024: E si è appena accorciato;)
Zaid,

Non ha funzionato:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024,

@ core1024: ho letto male le specifiche, dovrei essere risolto ora. È ancora più breve della soluzione J.
Zaid,

Non esiste davvero un modo conciso per farlo in J, poiché i valori sono rigorosamente digitati e i numeri non possono corrispondere alle stringhe.
Seequ,

3

Marbelous 34 byte

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

Non è la soluzione più breve, ma non è nemmeno la più lunga.

Come funziona

}0genera un marmo che rappresenta il primo input della riga di comando. Questo marmo scende sul segno di spunta successivo, sulla =6cella. =6è una cella di confronto, spinge verso il basso qualsiasi marmo con valore 6 e tutti gli altri verso destra. Questa serie di celle di confronto spinge le biglie a destra fino a quando non corrispondono al valore desiderato. 0 e 8 cadono e vengono stampati quando cadono dalla parte inferiore del tabellone, 6 e 2, e 9 e 5 ottengono prima 3 aggiunti a loro, sottratti rispettivamente da loro. Se un marmo non eguaglia nessuno dei valori desiderati, atterra sulla ?0cella, che trasforma qualsiasi marmo in un marmo 0 1 . Questo marmo viene quindi decrementato e cade dal tabellone.

1 Un ?nmarmo trasforma tecnicamente qualsiasi marmo in un marmo tra 0 e n. Questo ha il piacevole effetto collaterale che ?0trasforma qualsiasi cosa in 0.


2

MATLAB - 35

Lo avvolgo in una funzione con nl'unico parametro.

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

35 caratteri.


2

ECMAScript 6, 24

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

Utilizzando JavaScript normale sarebbe 33:

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

2

TI-BASIC, 24 22

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

Questo codifica i possibili output in una tabella di ricerca memorizzata come un numero in virgola mobile di base 11; la (N + 1) th base-11 digit dopo che il punto decimale è estratto dalla tabella per ottenere il valore della cifra invertita. Nella base 11 il numero è.106003A097 e le cifre di questo meno uno sono esattamente 0,-1,5,-1,-1,2,9,-1,8,6.

Il trucco di edc65 di sottrarre uno nel caso di 6 porta a questa soluzione a 24 byte, dove ⑩^(c'è un singolo token a un byte:

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

L'approccio stringa è di 29 byte:

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

L'approccio array (che ha anche preso Ypnpyn) è di 30 byte, supponendo che il numero sia memorizzato in X:

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

24 -> 22: rimosse due cifre extra di precisione nella costante magica.


Questo può quasi certamente essere giocato a 19, e forse a 18; tuttavia, devo cercare i numeri corretti.
lirtosiast,

2

C - 47 byte [era 48 byte]

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

Per aggiungere I / O (che altre risposte non sempre) per 86 byte:

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
Caspita, non avevo idea di letterali inline come questo erano una cosa. Molto bella la prima risposta e benvenuti in PPCG! (Non è necessario aggiungere invii di funzioni I / O perfettamente validi .)
Martin Ender,

1

Python - 34

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

1
33 f=lambda n:ord(" "[n])-3lavorando con space codeskulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti,

Potresti voler spiegare come e perché funziona
Riot,

Usando la tabella ascii asciitable.com gli spazi bianchi scelti sono stampabili in python. in realtà sembra qualcosa &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;di meno 3 per il motivo che -1 lascia un carattere nullo che non va bene, e meno 2 lascia un feed di riga che è riservato in pitone
Dylan Madisetti il

1

Java, 58 59

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

O

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

Puoi rendere il codice un po 'più breve se aggiungi 1 a ciascun valore nell'array e dopo [i] sottrai 1
barteks2x

@Barteks2x Good point; thanks
Ypnypn

1

JavaScript 42 37

Run it on the console of your browser

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

Not the best language for golfing, but oh well...
Compile with gcc progname.c -o progname. (Ignore the warnings, or add -include stdio.h to the compile command.)

Usage: ./progname <number>

EDIT

As per @bebe's suggestion, here is an example that takes the input from STDIN instead:

C - 68 51 bytes

main(){printf("%d","106003:097"[getchar()-48]-49);}

using d=*b[1]-48 could be a good idea
bebe

@bebe Ah yes, thanks!
BenjiWiebe

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);} sorry for bothering you this much but i find this a bit shorter.
bebe

You can save another character by making the array global so you don't need the cast. 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, function)

(the input panel isn't playing nice. Paste the following in a python interpreter and my answer shall be revealed:)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"


1

05AB1E, 13 bytes (non-competing)

0®5®®Y9®8 6¹@

Try it online!

-3 thanks to Emigna.

Explanation:

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¹@ should work as well.
Emigna

@Emigna I had no idea, thanks!
Erik the Outgolfer

Good thinking with @. Not often you see that used :)
Emigna

@Emigna A byte shorter than )¹è or )sè.
Erik the Outgolfer


1

Jelly, 14 bytes (non-competing)

ị“-5--29-860”V

Try it online!

Explanation:

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

ịV = žh‡ in 05AB1E
Magic Octopus Urn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.