Dado un bloqueo de combinación estándar como el de la imagen. La forma de desbloquearlo es alinear los 4 números en el código en la línea de combinación. Después de años de servicio leal, ha sido despedido de la fábrica de cerraduras y ha decidido vengarse al no mezclar las cerraduras antes de enviarlas, dejando así cada cerradura con la combinación para desbloquearla en la línea de combinación.
También sabe que al observar el orden de los números en las otras líneas, es posible determinar qué números deben estar en la línea de combinación (y, por lo tanto, la combinación para desbloquearla es).
Si a cada línea de la cerradura se le asigna un número que comienza desde la línea 0 para la línea de combinación (la línea que desbloquea la cerradura) hasta la línea 9. Por ejemplo, si los números de la línea 4 son 5336
, entonces la combinación para desbloquearlo sería 1992
.
Desafortunadamente, las cerraduras ya se han empaquetado y su vista de cada cerradura está oculta, por lo que solo puede ver números en diferentes líneas de la cerradura.
El reto
Dados 4 pares de dígitos, donde el primer dígito del número entero representa el número de línea y el segundo dígito representa el número que aparece en esa línea, calcule la combinación de la cerradura. Por ejemplo, si ingresa:
57 23 99 45
Entonces debería generar:
2101
O
25 78 63 15
y
3174
Suponga que la entrada siempre será 4 enteros positivos en la forma `25 64 72 18.
Este es el código de golf , por lo que gana el programa más corto en número de bytes.
También esta es mi primera pregunta, por lo que cualquier comentario es apreciado.
57 23 99 45
. Eso no son cuatro pares de enteros: son cuatro enteros. Y algunas respuestas suponen que lo obtienen como una cadena, mientras que otras suponen que viene analizado como 4 ints.0
s principales ).Respuestas:
CJam,
98 bytesLee los pares de dígitos como argumentos de línea de comandos. Para probar el código en línea , el cambio
ea
alS/
leer de STDIN simulado.Ejecución de ejemplo
Cómo funciona
El código de caracteres del dígito d es 48 + d . Por lo tanto, considerando la cadena de dos dígitos xy, un número base 9 produce 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
fuente
"99"
se interpreta realmente como la matriz[57 57]
porb
;"xy"9b
se implementa como9 * ord(x) + ord(y)
. Debo agregar eso a mi respuesta.CJam,
131211 caracteresGracias a user23013, ahora tiene solo 11 caracteres :)
Explicaciones:
Pruébalo en línea
Sé que se puede jugar más al golf. Pero este es mi primer intento real en CJam y estoy limitado por la experiencia :)
Alternativamente, los otros métodos para hacer lo mismo en 1 carácter adicional:
o
o
fuente
l~]
. Siento que analizar la entrada debería ser posible con menos de tres, pero nunca he usado CJam antes: /4{ri_A/-A%}*
es un byte más corto.4{Ar:--A%}*
.Golfscript (14
13)Pruébalo en línea aquí
Es casi lo mismo que la solución de Optimizer , pero en un idioma diferente. Es difícil abordarlo de una manera diferente porque el problema es bastante simple
, por lo que el empate definitivamente va a Optimizer, cuya entrada fue anterior de todos modos.Para la misma cantidad de bytes que puedes hacer
fuente
- 10
.GNU dc , 14 bytes
Pedir prestado el truco inteligente de base 9 de Dennis :
Enteros de entrada leídos de STDIN, uno por línea.
Explicación:
Salida:
Respuesta anterior, 18 bytes:
Porque pensé que podría acercarme a los idiomas de "golf" con esto (pero no lo hice):
fuente
9i[?A%nd]dxxxx
C
646356 o 61Si la entrada se puede canalizar desde el archivo
Si la entrada debe escribirse en stdin
Lee los cuatro números en un bucle y luego procesa cada uno restando el primer dígito del valor e imprimiendo el módulo de resultado 10.
Ahorro gracias a varios comentarios a continuación y también al uso de putchar en lugar de printf
fuente
scanf
exteriorfor()
asía,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
lugar dea-a/10
while
bucle y declarandoa
como argumento demain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Pitón 3, 64
Sencillo.
Puede ser más corto si se me permite imprimir, por ejemplo,
[2, 1, 0, 1]
( 46 ):fuente
str((i-i//10)%10)
directamente en lugar de usar un segundomap()
. También comencé con generadores para el mío, pero descubrí que unfor
ciclo real terminó siendo más corto.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Además, si los espacios son allowd en la salida se puede evitarjoin
y el uso tupla-desembalaje:print(*((i-i//10)%10for i in map(int,input().split())))
.C, 92
Entrada desde la línea de comandos. Resta el primer código ASCII de cada argumento del segundo, agrega 10 y toma el módulo 10.
Creo que esta es la primera vez que escribo un
printf
con cuatro%
sy sin coma (la coma está en el#define.
)fuente
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
seguidoa,b;main(){f;f;f;f;}
sería 18 bytes más corto.scanf
es necesario, dado quescanf
se supone que analiza el espacio en blanco solo como un separador. Alchymist tiene una idea aún mejor en C. Pero parece que ya la ganó con su respuesta de Cjam.a(n)
se puede omitir, luego noté que colocarprintf("%d%,...)
tu macro ahorraría unos pocos bytes y finalmente me dejé llevar un poco ... - El espacio es necesario ya que%c
lee un personaje, cualquier carácter, por lo que en la segunda ejecución almacenaría 32 pulgadasa
. - Vencer a CJam con C debería ser difícil.printf()
ya es mi respuesta ...Java - 203 bytes
Solo porque tiene que haber una entrada en Java, vi una buena oportunidad para darle una oportunidad a este código de golf (primer envío).
Si hay espacio para algunas mejoras, me alegraría saber sobre ellas ;-)
fuente
Lua - 46 caracteres
Lee tres caracteres a la vez (concédeme la pequeña misericordia de ingresar un espacio al final), y aunque a y b son cadenas y ... ba MÁGICAMENTE les permite concebir un bebé entero sano. Realiza la verificación envolvente durante la impresión.
fuente
JavaScript ES6 -
5343 bytesFunción bastante sencilla, utiliza expresiones regulares para obtener los números. Pruébelo en http://jsfiddle.net/efc93986/1/ . Si no se permiten funciones, un programa independiente de 52 bytes:
Como ES6 actualmente solo funciona en Firefox, el siguiente código funciona en cualquier navegador moderno, a 70 bytes:
fuente
1+
....?
lugar de/\d+ ?
. El espacio después del retorno puede omitirse. Además, como no se especificó ninguna E / S específica, debería poder usar una función.a-a[0]
en lugar de1+a[1]-a[0]
debería funcionar también.Python 2 - 33 bytes
Acepta entradas de usuario delimitadas por comas. Por ejemplo, entrada:
Salida:
Si se requiere un resultado que coincida exactamente con el ejemplo, entonces es mucho más largo. 47 bytes:
fuente
input()
no funciona en mi intérprete de Python 2.APL, 14
La explicación
⎕
toma la entrada de la pantalla. Los valores separados por espacios se analizan como una matriz.{...}¨
para cada número, aliméntelo en función.⍎¨⍕⍵
toma el argumento, crea una matriz de sus dígitos.--/
calcula unidades menos decenas.10|
mod 10.fuente
J -
2015La forma no verbal (como declaración en lugar de definición de función) es 5 caracteres más corta:
La forma verbal que es un buen tren :
Este verbo usado en las entradas de ejemplo:
fuente
Haskell
6058Dígitos de un solo personaje, una verdadera némesis en el golf de Haskell.
fuente
Perl:
3840Salida:
fuente
abs
no es necesario;x - x/10
No puede ser negativo. 3. Si usa las banderas-040pe
(generalmente contadas como 5 bytes) para iterar sobre la entrada delimitada por espacios, puede acortar su código a$_=($_-int$_/10)%10
. 4. Si prefiere evitar las banderas de línea de comandos, aún puede guardar algunos bytes configurando$/=$;
y eliminando la llamada asplit
.Ruby, 35 bytes
Explicación
La entrada se toma como argumentos de línea de comando.
String#bytes
devuelve una matriz de enteros (códigos de caracteres ASCII). Solo la diferencia entre el último y el primer código de caracteres es importante, no los enteros mismos.fuente
C # y LinqPad: 104
fuente
C ++ 118
fuente
#include<iostream>
ystd::
antescin
ycout
. 2. No necesita el condicional si lo omitea=a%10
. 3. No necesita las variablesb
yc
, los avances de línea y (con algunas modificaciones) los corchetes alrededor del bucle for.#include<iostream>
using namespace std;
PHP - 90 caracteres
Pensé en probar el código de golf, así que aquí está, mi primer intento, probablemente se pueda jugar más.
58 caracteres (cortesía de Ismael Miguel)
Acceda al archivo usando
fuente
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
que tiene 44 caracteres de longitud. Acceso desde un navegador usandofile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (código no probado)$_GET
pero muestra 57% 10 y necesito (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Lamentablemente, tiene 65 bytes de longitud. (olvidé el$i
incremento en el último) O podría intentar<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
acceder al navegador usandofile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
61 bytes de longitud.$_GET['n']
. Han editado mi respuesta.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. El%10
es inútil y este simplemente se ve mejor. Además, puede acceder usandofile.php?n[]=xyxyxyxy
. Esta solución tiene 58 bytes de longitud.Pitón 3, 60
Entrada y salida exactamente como se especifica, aunque no imprime una nueva línea final. Aquí hay dos trucos interesantes: 1) reemplazar dos llamadas a
int()
por una llamada aeval()
, y 2) usarjoin()
para obtenera-b
, luego negarlob-a
según sea necesario. Afortunadamente, el operador de módulo de Python da valores positivos incluso si el primer argumento es negativo.fuente
eval('-'.join(x))
truco es brillante.)