¿Es 7 l8r que 9? (¿Son las siete más tarde que las nueve?)

10

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-9como una entrada debe volver 1.

7convierte a código ASCII 55y 9convierte a código ASCII 57.

Como 57ocurre numéricamente después 55, 9es posterior a 7.

Otro ejemplo:

LKzb-LKaj como una entrada debe volver -1

Las secuencias de código ASCII para esto son 76-75-122-98y76-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 jes posterior a b, zes 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
Sam Weaver
fuente
1
¿Se garantiza que las dos cuerdas tengan la misma longitud?
es1024
55
Caso de prueba 11-Z-> -1no tiene sentido dada la redacción actual de la pregunta. Z(90) es mayor que 1(49) y es la letra más significativa. Aclare cómo se comparan las cadenas de diferentes longitudes.
George Reith
2
¿Y de qué A-AA?
2
@SamWeaver Sé que el más a la izquierda es el dígito más significativo, de ahí mi confusión sobre por qué 11>Zen tus ejemplos cuando 1<Z. Debe haber algún comportamiento indefinido que ver con cadenas de diferentes longitudes o el ejemplo es incorrecto.
George Reith
3
Como se explicó anteriormente: cada cadena debe tratarse como un dígito en un número base-127. Si tuviera que contar en este sistema, comenzaría con un carácter, lo incrementaría hasta la barrera de caracteres imprimibles, ~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.
Sam Weaver

Respuestas:

11

Pyth - 11 bytes

Fácil, utiliza el ._signo para obtener el signo y Cobtener códigos de caracteres.

._-F_CMcz\-

Pruébelo en línea aquí .

Banco de pruebas .

._               Sign of number
 -F              Fold subtraction (this finds difference of a tuple)
  _              Reverse list to get correct order of operands when subtracting
   CM            Map char, already treats strings as digits of base256 number
    c \-         Split by "-"
     z           Input
Maltysen
fuente
¡Muy agradable! Funciona como se esperaba.
Sam Weaver
7

CJam, 12 bytes

l'-/esfb~\-g

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

l   e# Read a line from STDIN.
'-/ e# Split it at spaces.
es  e# Push the current time (milliseconds since epoch).
fb  e# Consider each string as digits in base huge-number.
~\  e# Dump the results and reverse their order.
-g  e# Subtract and apply sign function.
Dennis
fuente
¡Excelente! Esto pasa todos los casos de prueba.
Sam Weaver
6

Java, 86 118

int f(String...s){return(int)Math.signum((s=s[0].split("-"))[1].compareTo(s[0])*(s[0].length()==s[1].length()?1:-1));}  

Una 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 signumsugerencia

Geobits
fuente
¿La comparación de Java no devuelve 1,0, -1 de todos modos? Sé que no está garantizado, pero ¿hay algún caso de que no lo sea? en cuyo casoreturn s[0].compareTo(s[1]);
Vartan
Esto es bueno, pero no pasa el caso de prueba de 11-Zregresar -1, regresa 1.
Sam Weaver
Ah, esto no estaba claro para mí antes de que se agregaran esos casos de prueba. Fijo.
Geobits
@Vartan No, devuelve la diferencia de valor en la primera posición que no coincide (o la diferencia de longitud si hay uno y todos los caracteres coinciden). Por ejemplo, "A".compareTo("Z") vuelve-25 . Desafortunadamente.
Geobits
¿Puedes explicar esta línea? 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;
Vartan
4

Perl, 31 bytes

#!/usr/bin/perl -p
/-/;$_=($`.$'^$`)cmp($'.$`^$')

30 bytes + 1 byte para -p. Acepta entradas en STDIN.

Explicación

Cuando los operandos cmptienen diferentes longitudes, como chickeny egg, se alinean así:

c  h  i  c  k  e  n
e  g  g  \0 \0 \0 \0

para que egg> chicken( \0es un byte nulo). Pero queremos que estén alineados así:

c  h  i  c  k  e  n
\0 \0 \0 \0 e  g  g

para que chicken> egg.

Para hacer esto, los concatenamos, una vez con chickenbefore eggy otra con eggbefore chicken:

c  h  i  c  k  e  n  e  g  g
e  g  g  c  h  i  c  k  e  n

Ahora que nuestras dos cadenas tienen la misma longitud, eliminamos la palabra principal usando un XOR para obtener:

\0 \0 \0 \0 \0 \0 \0 e  g  g
\0 \0 \0 c  h  i  c  k  e  n

Y ahora podemos usar cmppara encontrar cuál vino primero. (¡Ahí lo dije!)

ThisSuitIsBlackNot
fuente
Muy inteligente, ¡bravo!
Sam Weaver
3

Python 2, 88 caracteres

a=raw_input().split('-');print-cmp(*(map(ord,s.rjust(max(map(len,a)),'\0'))for s in a))

cmpno hace lo correcto cuando tiene dos cadenas de longitud diferentes, por lo que tengo que rellenarlas con el carácter nulo (que se ordconvierte en 0) 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.

Alex Van Liew
fuente
Desafortunadamente, esta no es una solución válida. El siguiente caso de prueba:, 1-2que debería devolver 1retornos -1. Trabajo inteligente sin embargo.
Sam Weaver
Vaya, parece que los operandos se intercambian. Eso es muy extraño, lo probé con un par de casos de prueba y pensé que funcionaba bien. No importa, puedo cambiarlo sin cambiar el recuento de caracteres. Dale una oportunidad ahora.
Alex Van Liew
Su edición solucionó ese caso, pero ahora falla el 11-Acaso, que debería regresar -1, en lugar de regresar 1en este ejemplo.
Sam Weaver
No me gustan tus reglas de longitud. Lo arreglé al costo de unos 35 caracteres, y no creo que pueda mejorarlo.
Alex Van Liew
1
Logré obtener una respuesta más corta que la suya codificando la cadena en formato hexadecimal y luego analizando esa cadena como int. En python 2, parece que el valor predeterminado es big-endianness para esto. Por lo tanto, el relleno 0 ya no es necesario.
Dunas
2

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.

diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))

Ejemplos de prueba

> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: LKzb-LKaj
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: A-9
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 11-Z
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 3h~J*-3h~J*
3: 
Read 2 items
[1] 0
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: Xv-Y0
3: 
Read 2 items
[1] 1
MickyT
fuente
Inteligente. Buen trabajo :)
Alex A.
2

CoffeeScript, 143 140 139

f=(s)->[a,b]=((t=s.split '-').map (y)->Array((m=Math.max) 1, 1+(m ((l=(c)->c.length) t[0]),l t[1])-l y).join('\u0000')+y);`b<a?-1:(b>a?1:0)`

Aquí hay un jsfiddle con los resultados (mira en la consola)

danielrw7
fuente
2

PERL, 46 36 Bytes

print$2cmp$1if"@ARGV"=~/(\S+)-(\S+)/

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

Eric
fuente
Sospecho que puedes deshacerte de varios espacios y el;
MickyT
Debería poder salirse con la suya: "@ARGV"=~/-/;print$`cmp$' (sin probar)
Jarmex
1
Es una buena idea usar 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.
ThisSuitIsBlackNot
1

Python 3, 84 bytes

x,y=[int.from_bytes(i.encode(),"big")for i in input().split("-")];print((x<y)-(y<x))

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) cmpya no está disponible en Python 3.

Python 2, 69 bytes

print -cmp(*[int(i.encode("hex"),16)for i in raw_input().split("-")]) 
Dunas
fuente
Puedes afeitar a un personaje eliminando el espacio entre printy cmp.
Alex Van Liew
1

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í

s,t=raw_input().split('-')
x,y=len(s),len(t)
print(x<y)*2-1if x-y else cmp(t,s)
mbomb007
fuente
1

perl5, 64

perl -aF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

Simplemente ejecútalo desde la línea de comandos. aunque se vería mejor con una nueva línea, pero eso cuesta 1 char.

perl -laF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

Esta versión más larga maneja longitudes no coincidentes correctamente.

hildred
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 para paF-, guardados en un archivo y ejecutados como perl -paF- file.pl).
primo
1
Como señalé en la respuesta de Eric , cmpno funciona cuando las dos cadenas son de diferente longitud, como con 11-Z.
ThisSuitIsBlackNot
@ThisSuitIsBlackNot, fijo.
hildred
Agradable. Puedes jugar golf hasta 39 con /-/;$_=length$'<=>length$`||$' cmp$`y -p. ( $`almacena todo antes de la coincidencia de expresiones regulares, $'almacena todo después). El uso en maprealidad cuesta más bytes que simplemente llamar lengthdos veces.
ThisSuitIsBlackNot
0

F #, 53

fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a

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

> "7-9" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
1
> "abc-abc" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
0
> "LKzb-LKaj" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
-1
Jwosty
fuente
0

JavaScript ES6, 46 43 bytes

f=s=>((a=s.split('-'))[1]>a[0])-(a[1]<a[0])
George Reith
fuente
Buen trabajo, pero esto no logra el caso de prueba 2: 11-Zdebería regresar -1pero regresa 1.
Sam Weaver
1
@SamWeaver De hecho, eso se agregó después de la respuesta y también rompe otras respuestas. ¿Puede explicar por qué '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?
George Reith
La intención de la pregunta nunca cambió, solo agregué esos casos de prueba y aclaraciones porque me di cuenta de que al principio no estaba lo suficientemente claro. Tiene razón en que nunca definí el valor de una cadena vacía, y actualizaré la pregunta en consecuencia. Esos casos de prueba no cambiaron el comportamiento o el objetivo de la pregunta, simplemente lo aclararon. Los ejemplos que nombró funcionan como tales porque cada carácter debe tratarse como un "dígito" individual en un número cuya base es equivalente a todos los caracteres ASCII imprimibles. Esta mecánica de la pregunta nunca cambió, simplemente se hizo más clara.
Sam Weaver
1
@SamWeaver Cambiar de comportamiento indefinido a definido lo cambia. Nada no es un personaje. A menos que sea el carácter nulo, que esto maneja.
George Reith
0

Ruby, 59 bytes

a,b=gets.chomp.split ?-
p (b.size<=>a.size).nonzero?||b<=>a
daniero
fuente
0

05AB1E , 12 11 9 bytes

'-¡₄ö¥0.S

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

'-¡          # Split the (implicit) input on '-'
             #  i.e. 'LKzb-LKaj' → ['LKzb','LKaj']
   ₄ö        # Convert both parts to a Base-1000 number
             #  i.e. ['LKzb','LKaj'] → [21020061037,21020036045]
     ¥       # Push the deltas (subtraction between each sub sequential pair) of the list
             #  i.e. [21020061037,21020036045] → [-24992]
      0.S    # Get the sign [1 for a>0; -1 for a<0; 0 for a==0] (and output implicitly)
             #  i.e. [-24992] → [-1]
Kevin Cruijssen
fuente