Devuelve la versión invertida de un número

18

Cuando se muestra un número en una calculadora, es posible considerar cómo se verían las diversas transformaciones de ese número. Por ejemplo, en una pantalla de siete segmentos, 2 se muestra así:

ingrese la descripción de la imagen aquí

Y cuando se voltea horizontalmente se ve así:

ingrese la descripción de la imagen aquí

Como tal, la imagen especular de 2 es 5.

La tarea en este desafío es tomar un número de un solo dígito y devolver el número que es su imagen especular (si es posible). Si su imagen especular no parece un número, devuelva el número girado 180 grados (si es posible). Si ninguno de estos es el caso, devuelve -1.

Aquí está la lista completa de entradas y salidas que su programa necesita manejar:

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

Como desafío de , ¡el código más corto gana!

James Williams
fuente
17
No estoy de acuerdo con su último punto: un 1 en una pantalla de 7 segmentos simplemente se voltearía al otro lado, por lo que 1 debería
tomar una
29
Estoy confundido acerca de cómo voltear cada dígito. Si 2 se convierte en 5, entonces 6 debería volverse hacia atrás 9, no 9. Pero si 6 se convierte en 9, entonces el giro es solo una rotación, por lo que 2 se convierte en otro 2, no 5.
kernigh
66
6, 9 giraron 180 grados, 2, 5 voltearon horizontalmente y 1, 3 de hecho son reflejos de sí mismos a través del eje vertical.
jimmy23013
22
Las traducciones definidas en la pregunta no son consistentes en absoluto. ¿Por qué voltean 2 y 5, pero 3 no?
Rynant
44
Noté un hecho curioso sobre los números conmutables: forman patrones binarios opuestos, es decir, 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. ¿Alguien puede usar este hecho en su solución?
Jack Aidley

Respuestas:

32

Haskell - 43 31

43 personajes sin nada lujoso.

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

Lo redujo a 31 caracteres al convertirlo en una función parcial.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
Taylor Fausak
fuente
44
Me reí. Tener un +1.
seequ
66
+1 Por usar Haskell para hacer exactamente lo que especifica. ¡dice!
recursion.ninja
1
No creo que necesite f=la segunda solución, ya que es una expresión válida
Cyoce
23

GolfScript, 15 14

Leí la especificación nuevamente y descubrí que la entrada debe ser una cadena.

"0.5..29.86"\?

Correr:

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

Versión anterior (que tiene entrada entera):

[0.5..2 9.8 6]?

El más nuevo (14 bytes) está algo inspirado en la respuesta CJam de aditsu .

jimmy23013
fuente
1
No puedo creer que no haya pensado en eso ...
Dennis
19

PowerShell - 27

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

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
fuente
2
Python 2.x, específicamente.
seequ
66
Con Python 3, puede eliminar el `s y guardar 2 caracteres.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
fuente
usar .search()y guardar un byte.
Ismael Miguel
@IsmaelMiguel Buen uno, ¡Gracias!
DarkAjax
8

CJam, 20 bytes

q25691347`"5296W"er~

Pruébalo en línea.

Salida

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

Cómo funciona

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
fuente
8

BEFUNGE 93 - 18 14 20 Bytes

Supongo que los comentaristas tienen razón, aunque Befunge siendo un lenguaje en 2d es un poco diferente. Aún así, en este instante, los comentaristas tienen razón.

&1g01g-.  
! &  #* )'

Pasos:

&

Lee la entrada como un valor numérico x, y lo empuja a la pila.

1g

Obtiene el valor de carácter c (por ejemplo, '!' = 33 o '*' = 42. Una celda vacía = 32) en la posición x, 1.

01g-.

Lee el valor de caracteres de la celda 0,1 (33), lo resta de c y lo genera como un valor numérico.

AndoDaan
fuente
2
Muy agradable. Tener un +1.
seequ
Corrija la longitud: son 20 bytes
har-wradim
1
De hecho, has estado contando mal tus bytes. Usaste 19 bytes. Contamos nuevas líneas y espacios. Pero si cambia a Befunge 98, puede guardar uno; cambiar la primera línea a:&1g'!-.
Justin
8

Java - 49

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

Aquí, 0x790a300601hay un valor relleno con los resultados deseados, con uno agregado para que sean positivos. Los valores se almacenan en nibbles dentro del valor, por lo que se requiere un poco de desplazamiento y enmascaramiento para extraerlos.

Java - 100 (opción divertida)

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

No es la opción más pequeña, pero sí un poco divertida. Encontré una semilla aleatoria que produce los valores correctos cuando se llama X veces (donde 0> = X <= 9).

Duncan Jones
fuente
Inteligente. Tener un +1
Cyoce
8

JavaScript (ECMAScript 6) 25

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

JavaScript (ECMAScript 5) 43

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

ACTUALIZACIÓN: edc65 ha sugerido una técnica mucho mejor. el cepillo de dientes ha sugerido un lenguaje mucho mejor. En este punto, mis contribuciones principales son la depuración y el gumption.

Afilado
fuente
1
Si lo cambia a ECMAScript 6 (compatible con Firefox), simplemente podría hacerlo x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Cepillo de dientes
Al principio, casi publiqué function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], también gracias a Firefox. No iba a ganar de todos modos, así que decidí seguir con la respuesta de mayor compatibilidad. Si comienzo a cambiar los idiomas por brevedad, eventualmente comenzaré a definir mi propio idioma para cada desafío que haga. Pero seguiré adelante y mencionaré la versión ECMAScript 6 de todos modos, ya que lo sugirió
Keen
1
Mismo concepto pero más corto (adiós comas): x => '106003907' [x] - (x! = 6)
edc65
@ edc65 Sabes, quería usar una cadena, y había dejado completamente en blanco el hecho de que podía forzar el resultado a un número. Un extraño lapso. Sin embargo, todavía no se me habría ocurrido -(x!=6). Gracias.
Keen
6

bash 29

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

p.ej

$ 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

fuente
Puede omitir el 'alrededor de la expresión sed. También creo que puede omitir el gporque la especificación solo proporciona un dígito a la vez
Digital Trauma
Gracias. Es solo en el ejemplo, el envío en sí no se usa '. Me gusta la gentrada más larga!
4

Kona - 29

Esta función devuelve el elemento xde la matriz.0 -1 5...

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

Ejemplos:

> f 2
  5
> f 5
  2
> f 8
  8
Kyle Kanos
fuente
¿Está un vector en sí mismo realmente permitido?
seequ
@TheRare: Hmm, dice "algoritmo", así que supongo que no. Lo cambiaré y lo haré más como el tuyo ...
Kyle Kanos
Parece mejor, tener un +1.
seequ
4

JavaScript 36 37 41

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

como función ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
core1024
fuente
2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore
@nderscore Te encanta mejorar los códigos de las personas, ¿no?
seequ
3
@TheRare Estoy en una búsqueda para encontrar el código javascript más corto. :) Si alguien más ya ha publicado una buena respuesta, tiene más sentido para mí encontrar optimizaciones en ella en lugar de publicar una nueva respuesta que es casi un duplicado. No estoy aquí para competir, solo para cooperar para lograr este objetivo.
nderscore
@nderscore Tengo la misma mentalidad siempre que mi idea sea lo suficientemente similar. De todos modos, agradable.
seequ
@nderscore Realmente me diste una motivación. No estoy seguro de poder hacerlo más corto, pero lo intentaré :)
core1024
4

Sclipting, 11 caracteres

걄럣뉥밈결⓷方分결剩貶

Finalmente encontré una computadora con Windows con Visual Studio instalado para construir su intérprete. Y ha derrotado mi código GolfScript fácilmente.

Se lee 18453063256\11\?/11%(en GolfScript.

jimmy23013
fuente
2
Interesante, pero su respuesta de GolfScript aún gana. A menos que la pregunta indique lo contrario, la longitud se mide en bytes.
Dennis
@ Dennis Esta fue mi tercera o cuarta respuesta en este sitio. No lo sabia Y creo que APL es una excepción.
jimmy23013
@Dennis Y a la mayoría de la gente no le gusta Sclipting. :)
jimmy23013
No es realmente una excepción, solo dejamos que las personas elijan su codificación. Esta respuesta obtendría 22 bytes, ya que ese es su tamaño usando UTF-16. APL usa solo 256 caracteres diferentes, y hay una página de códigos APL donde el carácter una vez es exactamente un byte.
Dennis
@ Dennis Ah, tienes razón.
jimmy23013
3

J - 28 27 bytes

¿Sabes lo que me gusta? Simplicidad (28 bytes). Tenga en cuenta que en J, _1es negativo uno (-1).

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

Agregue un poco de complejidad y tiene 27 bytes.

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

Ejemplo:

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

CJam - 14

Versión de entrada / salida:

"0 5  29 86"q#

Versión de la pila (se supone que el número está en la pila):

[0W5WWY9W8 6]=

Pruébalos en http://cjam.aditsu.net/

aditsu
fuente
No hay un artículo de Wikipedia sobre CJAM, y el enlace solo va a un violinista en blanco. ¿Dónde encontrarías información sobre el idioma y sus versiones establecidas?
Panzercrisis
Parece que esto es todo: sourceforge.net/projects/cjam
Panzercrisis
@Panzercrisis cjam.aditsu.net tiene "CJam" vinculado a la página de sourceforge
aditsu
3

Perl 27 26

El recuento incluye la pbandera

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

Uso:

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

Espera, ¿Perl acaba de vencer a J? :)

Zaid
fuente
+1 Iba a publicar y+0-9+9a4aa70a13+;$_=9-hex, que tiene la misma longitud, pero la tuya es más original;)
core1024
1
@ core1024: Y se acortó;)
Zaid
No lo hizo:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024
@ core1024: He leído mal las especificaciones, ahora debería corregirse. Todavía es más corto que la solución J.
Zaid
Realmente no hay una forma concisa de hacer esto en J, ya que los valores están estrictamente escritos y los números no pueden coincidir con las cadenas.
seequ
3

Maravilloso 34 bytes

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

No es la solución más corta, pero tampoco es la más larga.

Cómo funciona

}0genera una canica que representa la primera entrada de línea de comando. Esta canica cae al siguiente tic, sobre la =6celda. =6es una celda de comparación, empuja cualquier canica con valor 6 hacia abajo y todas las demás hacia la derecha. Esta línea de celdas de comparación empuja las canicas hacia la derecha hasta que sean iguales al valor deseado. 0 y 8 simplemente caen y se imprimen cuando se caen de la parte inferior del tablero, 6 y 2, y 9 y 5 primero obtienen 3, restados de ellos respectivamente. Si una canica no iguala ninguno de los valores deseados, aterriza en la ?0celda, que convierte cualquier canica en una canica 0 1 . Este mármol luego se disminuye y se cae del tablero.

1 Una ?ncanica técnicamente convierte cualquier canica en una canica entre 0 y n. Esto tiene el agradable efecto secundario que ?0convierte cualquier cosa en 0.

overactor
fuente
2

MATLAB - 35

Envolvería esto en una función con ncomo único parámetro.

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

35 caracteres

lukass
fuente
2

ECMAScript 6, 24

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

Usando JavaScript normal sería 33:

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

TI-BASIC, 24 22

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

Esto codifica las salidas posibles en una tabla de búsqueda almacenada como un número de punto flotante base-11; el (N + 1) th dígito de base 11 después de que el punto decimal se extrae de la tabla para obtener el valor del dígito invertido. En la base 11 el número es .106003A097, y los dígitos de este menos uno son exactamente 0,-1,5,-1,-1,2,9,-1,8,6.

El truco de edc65 de restar uno en el caso de 6 conduce a esta solución de 24 bytes, donde ⑩^(hay un solo token de un byte:

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

El enfoque de cadena es de 29 bytes:

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

El enfoque de matriz (que Ypnpyn también tomó) es de 30 bytes, suponiendo que el número esté almacenado en X:

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

24 -> 22: se eliminaron dos dígitos adicionales de precisión en la constante mágica.

lirtosiast
fuente
Es casi seguro que se puede jugar golf a 19, y posiblemente a 18; Sin embargo, necesito buscar los números correctos.
lirtosiast
2

C - 47 bytes [eran 48 bytes]

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

Para agregar E / S (que otras respuestas no siempre) para 86 bytes:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}
No cinturones de seguridad
fuente
1
Wow, no tenía ni idea de literales en línea como esto eran una cosa. Muy buena primera respuesta, y bienvenidos a PPCG! (No hay necesidad de agregar envíos de funciones de E / S son perfectamente válidos ).
Martin Ender
1

Python - 34

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

fuente
1
33 f=lambda n:ord(" "[n])-3trabajando con códigos
Dylan Madisetti
Es posible que desee explicar cómo y por qué esto funciona
Riot
Usando la tabla ascii asciitable.com, los espacios en blanco elegidos se pueden imprimir en python. En realidad, parece algo así como &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;Es menos 3 por la razón de que -1 deja un carácter nulo que no es bueno, y menos 2 deja un avance de línea que está reservado en Python
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;}

O

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}
Ypnypn
fuente
Puede hacer que su código sea un poco más corto si agrega 1 a cada valor en la matriz y luego de [i]
restar
@ Barteks2x Buen punto; gracias
Ypnypn
1

JavaScript 42 37

Ejecútalo en la consola de tu navegador

alert(~-[1,,6,,,3,10,,9,7][prompt()])
William Barbosa
fuente
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);}

No es el mejor idioma para jugar al golf, pero bueno ...
Compila con gcc progname.c -o progname. (Ignore las advertencias o agréguelo -include stdio.hal comando de compilación).

Uso: ./progname <número>

EDITAR

Según la sugerencia de @bebe, aquí hay un ejemplo que toma la entrada de STDIN en su lugar:

C - 68 51 bytes

main(){printf("%d","106003:097"[getchar()-48]-49);}
BenjiWiebe
fuente
usar d=*b[1]-48podría ser una buena idea
bebe
@bebe Ah sí, gracias!
BenjiWiebe
1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}lo siento por molestarte tanto pero me parece un poco más corto.
bebe
Puede guardar otro personaje haciendo que la matriz sea global para que no necesite el reparto. 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, función)

(el panel de entrada no se está reproduciendo bien. Pegue lo siguiente en un intérprete de Python y se revelará mi respuesta :)

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

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
volcado de memoria
fuente
1

05AB1E , 13 bytes (no competitivos)

0®5®®Y9®8 6¹@

Pruébalo en línea!

-3 gracias a Emigna .

Explicación:

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 el Outgolfer
fuente
0®5®®Y9®8 6¹@debería funcionar también.
Emigna
@Emigna No tenía idea, ¡gracias!
Erik the Outgolfer
Bien pensado con @. No es común ver que utiliza :)
Emigna
@Emigna Un byte más corto que )¹èo )sè.
Erik the Outgolfer
1

Jalea , 14 bytes (no competitiva)

ị“-5--29-860”V

Pruébalo en línea!

Explicación:

ị“-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 el Outgolfer
fuente
ịV = žh‡en 05AB1E
Urna de pulpo mágico el