Los jugadores del tradicional juego de mesa Go miden su habilidad en un sistema de rangos :
- Los jugadores nuevos en el juego se clasifican en el 30 ° kyū (escrito
30k
) y el progreso cuenta atrás hasta el 1 ° kyū (escrito1k
). Estos se consideran las filas de los estudiantes . - Un jugador puede ascender desde el primer kyū al primer rango de dan (escrito
1d
), y luego progresar contando hasta el séptimo rango de dan (escrito7d
). Estos son los rangos maestros . - Los jugadores excepcionalmente hábiles del pasado
7d
pueden ascender al primer rango profesional de dan1p
y progresar contando hasta el noveno rango profesional de dan (escrito9p
). Este es el rango más alto.
En resumen: los rangos están ordenados 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
Tarea
Dadas dos cadenas entre { 30k
, ..., 1k
, 1d
, ..., 7d
, 1p
, ..., 9p
} como entrada, salida de la más alta categoría de los dos. (Si son iguales, simplemente envíe cualquiera de las entradas).
(Como de costumbre, la E / S es flexible : su respuesta puede ser una función o un programa completo, leer entradas de cualquier manera razonable y producir salidas de cualquier manera razonable).
Este es el código de golf : el objetivo es minimizar el recuento de bytes de su código.
Casos de prueba
(Formato:. input1 input2 output
)
29k 9k 9k
21k 27k 21k
6d 1p 1p
5d 17k 5d
1k 1d 1d
1d 1d 1d
1d 2d 2d
9p 1d 9p
2d 30k 2d
1p 1k 1p
1d 1p 1p
1p 2d 1p
7p 8p 8p
30k 30k 30k
4 k
o4K
menos, tampoco.)30k
,29k
,1k
,1d
etc., por lo que no voy a permitir cualquier variación allí.Respuestas:
JavaScript (ES7), 58 bytes
Toma las dos cadenas en sintaxis curry
(a)(b)
.Pruébalo en línea!
¿Cómo?
La función auxiliar g () traduce la cadena de entrada s en una partitura.
1) Buscamos s [1] en la cadena "_dp" . Esto da:
2) Cubicamos este resultado, que deja 1 y -1 sin cambios pero da 8 para un rango profesional de dan .
3) Multiplicamos por la parte decimal del rango.
fuente
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Jalea , 14 bytes
Un enlace monádico que acepta una lista de cadenas * (como se describe) que produce el rango más alto encontrado.
* También funciona con números que no sean dos.
Pruébalo en línea! O ver un conjunto de pruebas .
¿Cómo?
Ordena por una función clave y devuelve el extremo derecho (es decir, un máximo).
Las letras , y tienen ordinales , y respectivamente. En el binario tiene el conjunto de ocho bits, mientras que los demás no lo tienen, por lo tanto, OR-bit con 8 obtenemos 107, 108 y 120 respectivamente, estos están ahora en el orden requerido para ordenar las clases que identifican.d p 107 100 112 107k re pags 107 100 112 107
Los rangos de aficionados están en orden descendente, por lo que para completar nuestra función clave podríamos concatenar nuestro identificador de clase con el número dado en la cadena, negando si la cadena termina en (por ejemplo, -> while -> ). En el código, esto requiere almacenar el identificador de clase y exponer menos uno para la multiplicación , que es de bytes.16k dieciséis
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Para mejorar esto, podemos usar menos dos y multiplicar los elementos juntos, lo que se puede lograr con una sola multiplicación.
Tabla de la acción de la función clave ...
fuente
2^8=256
, que es ASCII, afaik. ¿No necesita más de un byte para contener caracteres unicode, entonces?Jalea ,
1110 bytes¡Inspirado para volver al tablero de dibujo por Arnauld!
Un enlace monádico que acepta una lista de cadenas * (como se describe) que produce el rango más alto encontrado.
Pruébalo en línea! O ver un conjunto de pruebas .
¿Cómo?
Ordena por una función clave y devuelve el extremo derecho (es decir, un máximo).
La función clave primero cambia cualquier k para convertirse en una N usando el átomo diádico
y
, traducir, con la lista de dos caracteres⁾kN
(código Jelly para['k','N']
) y luego evalúa la cadena como una mónada con un argumento de nueve (mediante el uso del códigov9
).En gelatina:
N
es un átomo monádico que niega su entrada9 30N
no usa realmente el nueve y da como resultado el entero-30
d
es un átomo diádico que produce el resultado de un divmod de Python de dos valores: el par de resultados de división entera y módulo9 7d
resulta en emparejado con que es[0,7]
p
es un átomo diádico que realiza un producto cartesiano, que incluye la identificación de rango implícita 1 indexada de sus entradas9 p3
produce el producto cartesiano de[1,2,3]
y[1,2,3,4,5,6,7,8,9]
que es[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
Una vez que se hayan realizado dichas evaluaciones utilizando las cadenas que se van a comparar, debemos poder comparar los resultados; dado que los ints no son comparables con las listas, necesitamos ajustar los valores negados en una lista, pero dado que el orden aún funcionaría después de que las
p
listas se aplanan (por ejemplo,[[1,1],[1,2],...]
->[1,1,1,2]
) podemos usar el átomo monádico de un solo byteF
aplicado a todas las evaluaciones.Una tabla de las entradas a su valor-clave es la siguiente:
Comentario de código:
fuente
MATL ,
30282523 bytesPruébalo en línea!
(-2 bytes gracias a Luis Mendo)
(reemplazando otro -3 bytes
v&X>
con>
, esta vez basado en la respuesta de Luis Mendo)(-2 bytes usando la
&)
sintaxis)Explicación:
Reste 'k' del último carácter (da n = -7, 0, 5 para 'd', 'k', 'p' respectivamente).
Calcule v = n ^ 2 + 6n-1 (da 7, -1, 54 respectivamente).
Multiplique ese valor v por el número de rango real (para que los niveles k obtengan productos negativos, los niveles d vayan de 7 a 49, los niveles p de 54 y más).
Haga eso para ambas cadenas de entrada, compare los productos
Obtenga la cadena de entrada correspondiente al producto mayor
Método alternativo y más directo:
23 bytes
Pruébalo en línea!
fuente
Haskell ,
7371 bytesPruébalo en línea!
Como de costumbre para mí, solo una implementación directa en lugar de cualquier cosa particularmente golf-y. La función "(#)" toma dos rangos como cadenas y devuelve el más grande. Funciona solo con exactamente el formato especificado en la pregunta.
(También probé una versión usando
comparing
y,maximumBy
pero eso terminó siendo 3 bytes más, ¡maldito sea ustedbase
y sus nombres de funciones legibles de vez en cuando!)(Sugerencias aplicadas por Amphibological y Lynn)
fuente
True
a1<2
.(-x)
puede ser0-x
.r(x,_)=x+7
!0-x
puede ser `-x`)Python 2 , 54 bytes
Pruébalo en línea!
Usando el método de Arnauld . El mapeo
int(x,27)%9-3
solo depende de la última letra dex
, ya que todos los dígitos, excepto el último, contribuyen con un múltiplo de9
. Se necesita:Esto es apenas un margen suficiente para que el multiplicador
1p
pueda vencer7d
, el rango dan más alto, cuando se interpreta en la base 26.Encontré esto mediante expresiones de fuerza bruta de esta forma y algunas otras.
Python 2 , 64 bytes
Pruébalo en línea!
fuente
R , 73 bytes
Pruébalo en línea!
as.double
lugar de,strtoi
ya que este último no maneja espacios / puntos y no podía pensar en otro personaje válido para reemplazard
rank
lugar deorder
, ya que son iguales cuando solo hay dos elementosfuente
L
en lugar de,.
pero tampoco funciona ... te haré saber si puedo encontrar algo más.Jalea , 13 bytes
Esto es bastante diferente de mi otra respuesta de Jelly , así que estoy publicando esto por separado.
Toma la entrada como una lista de dos (o más) cadenas.
Pruébalo en línea!
Comentado
fuente
Julia 0.7
10093 bytesNo es la forma más eficiente (contraste con la respuesta de Julia 0.6 de sundar ), pero es agradable porque es puramente numérico. También usa despacho (aunque lamentablemente solo una vez)
Código muy similar funciona en 0.6 Pruébelo en línea
Cómo:
El truco está en la
!(z)
función.Mapea el valor UTF-8:
k
en un número negativo, por lo que se ordena al revésd
en un número positivop
en un número positivo mayorComo se muestra:
Resultados de la prueba
fuente
.~[a,b]
era posible! Por cierto, creo que puede reemplazar collect (r) con[r...]
y guardar algunos bytes.Int[r...]
hacerlo en lugar deInt([r...])
ahorrar unos cuantos más. Graciasargmax
conindmax
) el 0,6 Julia también. Puede incluir un ¡ Pruébelo en línea! enlace si lo desea.Haskell , 64 bytes
Pruébalo en línea!
La expresión
gcd(fromEnum c)28-3
asigna el carácter a un multiplicadorLa idea era tomar los valores de sus personajes
[107,100,112]
y elegir28
tener factores cada vez más grandes en común con ellos, de manera fácil, pero el primero era primo. Este método ahorra 2 bytes al escribir explícitamente una asignación .El incorporado
reads
se utiliza para separar el número y el rango.(En realidad, la división directa de Sara J es un byte más corto, dando 63 bytes ).
El paso de tomar el más grande toma un molesto número de bytes en mi solución. Intenté otros enfoques, como iterar sobre los rangos en orden decreciente y tomar el primero del que es un elemento
[a,b]
, pero resultaron más largos.fuente
MATL ,
2827 bytesPruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Jalea , 16 bytes
Toma la entrada como una lista de dos cadenas.
Pruébalo en línea! (todos los casos de prueba)
¿Cómo?
Lo que da:
Comentado
Fórmula alternativa
Para 16 bytes también, podemos usar:
Pruébalo en línea!
fuente
JavaScript (ES6),
5554 bytes-1 byte gracias a @Shaggy
Pruébalo en línea!
Explicación
fuente
f("2d")("1d")
, pero sustituyendod:1
cond:2
arreglado.Ruby ,
5246 bytesPuerto directo de la respuesta de xnor.
Pruébalo en línea!
EDITAR: -6 bytes al darse cuenta de que podría haber usado un Proc
fuente
C # (compilador de Visual C #) ,
136135 bytesPruébalo en línea!
-1 Byte gracias a TheLethalCoder
Expansión:
fuente
a=>b=>
.PadLeft
requierechar
y usar en107
lugar de'k'
no hace ninguna diferencia.Perl,
4638 bytesCorre como
perl -pae '...'
. Toma datos de stdin, separados por espacios en una línea.Realiza un par de sustituciones para hacer la comparación "más fácil". Las sustituciones regexp esencialmente equivalen a reemplazar
p
con un cero final yk
con un signo negativo inicial. Entonces se10k
convierte-10
(así se invierte el orden) y se3p
convierte30
(así quep
está por encima de todo lo demás). Entonces es solo una simple comparación numérica.Gracias a DomHastings por la sugerencia
$`
/$'
, que redujo 8 bytes.fuente
/ /
y usando `` $ `` `y$'
: ¡ Pruébelo en línea!R ,
6562 bytesPruébalo en línea!
Esto es un poco más corto que las respuestas anteriores de R, y hace un buen uso de la funcionalidad de estadísticas de R :-)
-3 bytes gracias a la sugerencia de Robin Ryder de usar en
ordered
lugar defactor
Toma información de stdin (aunque el enlace TIO se reestructura ligeramente para facilitar la prueba). Convierte los rangos de entrada en un orden
factor
de todos los rangos, luego toma el máximo.La salida se ve así:
fuente
factor
y me la perdí por completoordered
.Java 8,
128122121 bytes-6 bytes gracias a @SaraJ .
Pruébalo en línea. (Consulte la parte inferior de la salida en los enlaces TIO para ver los valores asignados).
Explicación:
fuente
Haskell ,
757068 bytesPruébalo en línea!
-5 bytes
gracias a @Laikoni-2 bytes
gracias a @ ASCII-onlyfuente
(read$init k)
puede serread(init k)
. Una función auxiliar es más corta que usarcase of
: ¡ Pruébelo en línea!Python 2 , 61 bytes
Utiliza el algoritmo de Arnauld.
Pruébalo en línea!
Respuesta anterior, 73 bytes
Pruébalo en línea!
fuente
Julia 0.6 ,
757165 bytesPruébalo en línea!
(-4 bytes, analizar en 0.6 auto lo detecta como Int)
(-6 bytes, uso
(search("_dp",s[2])-1)^3)
basado en la respuesta JS de Arnauld, en lugar de((c=cmp(s[end],'k'))^2*6+4c-1)
)fuente
Retina 0.8.2 , 29 bytes
Pruébalo en línea! Acepta cualquier número de rangos y genera el más alto. Explicación:
Ordenar las líneas ...
... utilizando la clave especificada ...
... en orden inverso.
La clave se crea a partir de la línea de entrada de la siguiente manera: a) la letra de rango dan (profesional) b) el rango en unario c) la letra kyū (cuando corresponda). Dado que este es un orden inverso, el rango profesional de dan se clasifica
p
antes que el rango dand
y el rango kyū que comienza1
porque la letra kyū se deja al final. Dentro de los rangos, los rangos (profesionales) dan se clasifican en orden descendente debido a la longitud de la cadena unaria, sin embargo, el seguimientok
de los rangos kyū hace que se clasifiquen en orden ascendente.Seleccione la primera línea, que ahora es el rango más alto.
fuente
J, 39 bytes
Pruébalo en línea!
explicación
fuente
Python , 59 bytes
Una función sin nombre que acepta un iterable de cadenas que devuelve una máxima por rango Go. Funciona de manera similar a mi respuesta Jelly (solo usa toda la cadena evaluada como un entero en la base 26 para guardar bytes).
Pruébalo en línea!
fuente
C (gcc) , 95 bytes
Pruébalo en línea!
fuente
Perl 6 , 35 bytes
Pruébalo en línea!
Un enfoque bastante diferente a todas estas cosas de búsqueda y cubos. Esencialmente sustitución de cadenas:
...k -> -...
,p -> 0
,d
eliminado. Por lo tanto, los novatos obtienen un puntaje negativo, los dans obtienen su rango y los profesionales obtienen el rango * 10. El uso de WhateverStar nos da un cierre ymax
toma una función de comparación.fuente
05AB1E , 12 bytes
.V
(evaluar como código 05AB1E) está inspirado en el enfoque similar de @Arnauld en su respuesta de Jelly .Ingrese como una lista de dos (o más) de las cadenas válidas.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
k
"30k"
"1k"
-1
d
>= 0
"1d"
"7d"
1
p
°
"2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Ver todos los valores mapeados aquí.
fuente
Scala ,
3076154 bytesMuchas gracias a Kevin Crujissen y ASCII-only por su trabajo en esta respuesta, eso lo consiguió ~ 250b.
Algún algoritmo de optimización para ordenar la función de respuesta 61b.
Pruebe casos aquí: ¡ Pruébelo en línea!
Antigua respuesta de 61 bytes
El truco es calcular la distancia entre
rank letter
yi
(código char105
). Luego usamos esta distancia como una puntuación ( dan = 5, kyu = 2, pro = 7) que multiplicamos por el número de rango. Luego tomamos el máximo en la matriz de entrada usando la función de puntuación.¡Pruébalo en línea también!
fuente
var f: Function1[String, Function1[String, String]]=
. 247 bytes .PHP ,
10098 bytes(-2 bytes cambiando la declaración de la función)
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
PHP (7.4), 74 bytes
Pruébalo en línea!
¿Cómo?
Similar al enfoque de Arnauld , pero en PHP. Estoy usando una función para convertir cada rango a un valor numérico y comparar y generar el que tenga un valor más alto.
El valor de rango proviene de la posición del segundo carácter de la cadena de entrada
!!dp
, se reduce en uno y luego se potencia a 3 y se multiplica por la parte entera de la cadena de entrada.Así, por ejemplo, la posición del segundo carácter de
1p
lo que esp
en!!dp
es 3, reduce en uno y alimentado a 3 será 8. Así que parte entera de todas las*p
filas se multiplica por 8. Este medio de1p = 8
,2p = 16
, ...,9p = 72
.Para todos los
*d
rangos, la parte entera se multiplicará por 1 (o simplemente sin multiplicación). Esto significa1d = 1
, ...,7d = 7
.Y para todos
*k
y**k
rangos, la posición del segundo carácter!!dp
seráfalse
igual a 0 (no explícito), reducido por uno y potenciado por 3, significa que la parte entera se multiplicará por -1. Esto significa30k = -30
, ...,1k = -1
.Este es mi primer intento de golf, ¡no estoy seguro de lo malo que es!
fuente
Excel VBA, 129 bytes
Una función de ventana VBE Inmediata anónima que toma entrada en rango
A1:A2
y salidas a la consola.Explicación
fuente