Este es un desafío de golf de código bastante simple. Su programa, dada una cadena ASCII, es analizar esa cadena en dos cadenas, que evaluará. Si la segunda cadena es "posterior" a la primera, devolverá un 1, si es "anterior" a la primera, devolverá un -1, y si son iguales, devolverá 0. A aclare lo que significa "más adelante" y "más temprano", echemos un vistazo a los códigos de caracteres ASCII. Debe comparar cada carácter de la cadena, tratando cada uno de ellos como dígitos de un número. Más tarde se refiere a un número mayor, que ocurre después de un número menor. Las cadenas se formatearán con un guión para separar los dos grupos de entrada.
Echale un vistazo a éste ejemplo:
7-9
como una entrada debe volver1
.
7
convierte a código ASCII55
y9
convierte a código ASCII57
.Como
57
ocurre numéricamente después55
,9
es posterior a7
.
Otro ejemplo:
LKzb-LKaj
como una entrada debe volver-1
Las secuencias de código ASCII para esto son
76-75-122-98
y76-75-97-106
Este es un desafío de código de golf, y el recuento de bytes es cómo se puntuarán las entradas.
Se acepta cualquier entrada de los 95 caracteres ASCII imprimibles, excluyendo espacios y guiones para cualquier cosa que no sea separar la entrada. Además, no se garantiza que las cadenas tengan la misma longitud.
¡Buena suerte!
EDITAR: Para ser más claro, cada carácter debe tratarse como un dígito en un número. En el ejemplo LKzb-LKaj
, aunque j
es posterior a b
, z
es posterior a a
, y dado que es un dígito más significativo, tiene prioridad. Una cadena suministrada siempre tendrá al menos 3 caracteres, eliminando cadenas vacías del alcance de este problema.
EDITAR: Aquí hay algunos casos de prueba más, para su ayuda:
A-9
->-1
11-Z
->-1
3h~J*-3h~J*
->0
Xv-Y0
->1
fuente
11-Z
->-1
no tiene sentido dada la redacción actual de la pregunta.Z
(90) es mayor que1
(49) y es la letra más significativa. Aclare cómo se comparan las cadenas de diferentes longitudes.A-AA
?11>Z
en tus ejemplos cuando1<Z
. Debe haber algún comportamiento indefinido que ver con cadenas de diferentes longitudes o el ejemplo es incorrecto.~
en 126, luego incrementaría el siguiente dígito en uno, devolviendo el dígito inicial a!
. Cada aumento en el dígito más significativo es equivalente a incrementar el segundo dígito más significativo en 127.Respuestas:
Pyth - 11 bytes
Fácil, utiliza el
._
signo para obtener el signo yC
obtener códigos de caracteres.Pruébelo en línea aquí .
Banco de pruebas .
fuente
CJam, 12 bytes
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Java,
86118Una forma muy extraña de comparar cadenas. Hizo una solución rápida para que pase casos de prueba adicionales, más tarde buscará más golf.
Gracias a Vartan en comentarios por
signum
sugerenciafuente
return s[0].compareTo(s[1]);
11-Z
regresar-1
, regresa1
."A".compareTo("Z")
vuelve-25
. Desafortunadamente.i = a!=b ? b-a : s[1].compareTo(s[0]);
Parece que no lo entiendo ... Además, tal vez podrías usar Math.signum y ahorrarte declarando i;Perl, 31 bytes
30 bytes + 1 byte para
-p
. Acepta entradas en STDIN.Explicación
Cuando los operandos
cmp
tienen diferentes longitudes, comochicken
yegg
, se alinean así:para que
egg
>chicken
(\0
es un byte nulo). Pero queremos que estén alineados así:para que
chicken
>egg
.Para hacer esto, los concatenamos, una vez con
chicken
beforeegg
y otra conegg
beforechicken
:Ahora que nuestras dos cadenas tienen la misma longitud, eliminamos la palabra principal usando un XOR para obtener:
Y ahora podemos usar
cmp
para encontrar cuál vino primero. (¡Ahí lo dije!)fuente
Python 2, 88 caracteres
cmp
no hace lo correcto cuando tiene dos cadenas de longitud diferentes, por lo que tengo que rellenarlas con el carácter nulo (que seord
convierte en0
) para manejar ese caso. Desafortunadamente, eso agregó unos 35 caracteres, además ahora son dos líneas en lugar de una porque necesito tanto la longitud de la entrada como para iterar sobre ella.fuente
1-2
que debería devolver1
retornos-1
. Trabajo inteligente sin embargo.11-A
caso, que debería regresar-1
, en lugar de regresar1
en este ejemplo.R, 54 bytes
Esto requiere la biblioteca pracma. Divide la cadena de entrada en el
-
. La derecha justifica las cuerdas. Los clasifica y hace una diferencia.Entonces para 11-7 terminamos con las cadenas "11" y "7". El rango de estos es [2, 1]. La diferencia es -1. Por 3h ~ J * -3h ~ J * obtenemos "3h ~ J *" y "3h ~ J *". El rango de estos es [1.5, 1.5] con una diferencia de 0.
Ejemplos de prueba
fuente
CoffeeScript,
143140139Aquí hay un jsfiddle con los resultados (mira en la consola)
fuente
PERL,
4636 BytesConvierte la lista argv en una cadena, se divide por el guión en un argumento sin espacios a la izquierda y a la derecha, luego devuelve una llamada cmp.
fuente
"@ARGV"=~/-/;print$`cmp$'
(sin probar)cmp
, pero no funciona cuando las longitudes de las cadenas son diferentes."A" cmp "9"
es 1 mientras"11" cmp "Z"
es -1, aunque ambas entradas deberían devolver el mismo valor para este desafío.Python 3, 84 bytes
Divida la entrada de cadena por
"-"
. Convierta las cadenas unicode en cadenas de bytes, luego interprete estas cadenas de bytes como enteros big-endian. Finalmente haga la comparación: (desafortunadamente)cmp
ya no está disponible en Python 3.Python 2, 69 bytes
fuente
print
ycmp
.Python 2, 79 bytes
Solución bastante simple, y es fácil de entender. Compara longitudes de cadena, luego compara las cadenas de forma lexigráfica.
Pruébalo aquí
fuente
perl5, 64
Simplemente ejecútalo desde la línea de comandos. aunque se vería mejor con una nueva línea, pero eso cuesta 1 char.
Esta versión más larga maneja longitudes no coincidentes correctamente.
fuente
/-/,$_=$`cmp$'
sería más fácil y puedes saltarte el-aF-
bit. Además, cuento esto como 20 (16 para$_=$F[1]cmp$F[0]
y 4 parapaF-
, guardados en un archivo y ejecutados comoperl -paF- file.pl
).cmp
no funciona cuando las dos cadenas son de diferente longitud, como con11-Z
./-/;$_=length$'<=>length$`||$' cmp$`
y-p
. ($`
almacena todo antes de la coincidencia de expresiones regulares,$'
almacena todo después). El uso enmap
realidad cuesta más bytes que simplemente llamarlength
dos veces.F #, 53
Esto tiene la forma de una función anónima (lambda), por lo que debe pegarla y proporcionar el parámetro directamente después de (o, usando la notación de tubería). Por ejemplo (en FSI):
fuente
JavaScript ES6,
4643 bytesfuente
11-Z
debería regresar-1
pero regresa1
.'11'>'Z'
cuando'11'<'ZZ'
no hay nada en la pregunta sobre cómo comparar cadenas de diferentes longitudes o qué valor tiene una cadena vacía?Ruby, 59 bytes
fuente
05AB1E ,
12119 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente