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
7dpueden ascender al primer rango profesional de dan1py 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 ko4Kmenos, tampoco.)30k,29k,1k,1detc., 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:bJalea , 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:
Nes un átomo monádico que niega su entrada9 30Nno usa realmente el nueve y da como resultado el entero-30des 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 7dresulta en emparejado con que es[0,7]pes un átomo diádico que realiza un producto cartesiano, que incluye la identificación de rango implícita 1 indexada de sus entradas9 p3produce 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
plistas se aplanan (por ejemplo,[[1,1],[1,2],...]->[1,1,1,2]) podemos usar el átomo monádico de un solo byteFaplicado 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
comparingy,maximumBypero eso terminó siendo 3 bytes más, ¡maldito sea ustedbasey sus nombres de funciones legibles de vez en cuando!)(Sugerencias aplicadas por Amphibological y Lynn)
fuente
Truea1<2.(-x)puede ser0-x.r(x,_)=x+7!0-xpuede ser `-x`)Python 2 , 54 bytes
Pruébalo en línea!
Usando el método de Arnauld . El mapeo
int(x,27)%9-3solo 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
1ppueda 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.doublelugar de,strtoiya que este último no maneja espacios / puntos y no podía pensar en otro personaje válido para reemplazardranklugar deorder, ya que son iguales cuando solo hay dos elementosfuente
Len 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:
ken un número negativo, por lo que se ordena al revésden un número positivopen 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. Graciasargmaxconindmax) 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-3asigna el carácter a un multiplicadorLa idea era tomar los valores de sus personajes
[107,100,112]y elegir28tener 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
readsse 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:1cond:2arreglado.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=>.PadLeftrequierechary usar en107lugar 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
pcon un cero final ykcon un signo negativo inicial. Entonces se10kconvierte-10(así se invierte el orden) y se3pconvierte30(así quepestá 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
orderedlugar defactorToma información de stdin (aunque el enlace TIO se reestructura ligeramente para facilitar la prueba). Convierte los rangos de entrada en un orden
factorde todos los rangos, luego toma el máximo.La salida se ve así:
fuente
factory 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 bytesgracias a @Laikoni-2 bytesgracias 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
pantes que el rango dandy el rango kyū que comienza1porque 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 seguimientokde 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,deliminado. 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 ymaxtoma 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"-1d>= 0"1d""7d"1p°"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 letteryi(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
1plo que espen!!dpes 3, reduce en uno y alimentado a 3 será 8. Así que parte entera de todas las*pfilas se multiplica por 8. Este medio de1p = 8,2p = 16, ...,9p = 72.Para todos los
*drangos, la parte entera se multiplicará por 1 (o simplemente sin multiplicación). Esto significa1d = 1, ...,7d = 7.Y para todos
*ky**krangos, la posición del segundo carácter!!dpseráfalseigual 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:A2y salidas a la consola.Explicación
fuente