Introducción
Un amigo planteó esta pregunta hoy de una manera ligeramente diferente: "¿Puede un solo comando [de Python] determinar el mayor de algunos enteros Y que no son iguales?".
Si bien no encontramos una manera de hacerlo dentro de las definiciones razonables de "un solo comando", pensé que podría ser un problema divertido para el golf.
Desafío
" Devuelve el mayor de una lista de enteros si-y-solo-si no son todos iguales " .
Más específicamente:
Dada una cadena que contiene solo una lista de enteros separados por comas:
- Si todos son iguales, no devuelve / genera nada
- De lo contrario, retorno / salida el mayor
Reglas
- La entrada debe ser una cadena que contenga solo una lista de enteros separados por comas
- La salida no debe ser nada (ninguna salida de ningún tipo) o el elemento más grande de la entrada, representado como está en la entrada
Las entradas pueden ser un programa completo o simplemente una función, ¡siempre que proporcione alguna forma de probarlas!
Supuestos
- Suponga que los elementos de la lista de entrada pueden tener más de un dígito pero no más de (2 32 - 1)
- Suponga que la lista de entrada no tiene más de un millón de elementos.
- Suponga que la entrada no incluirá valores negativos
- Suponga que la entrada nunca estará vacía
Para evitar dudas, la explicación del desafío dada justo después de "Más específicamente" reemplazará la declaración del desafío que se encuentra arriba ("Devuelve el más grande ...").
Ejemplos
(1) Todos iguales:
Input: 1,1
Output:
(2) diferente:
Input: 1,2
Output: 2
(3) ¡Cero !:
Input: 0,0,0,0,0,0,0,1,0,0
Output: 1
(4) Aleatorio:
Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9
(5) Números más grandes, lista más grande:
Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887
Ejemplos adicionales:
(6) Todos iguales, lista más grande:
Input: 7,7,7,7,7,7,7,7,7
Output:
(7) Todos iguales, lista más grande, números más grandes:
Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:
(8) No es igual, lista más grande, números más grandes:
Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185
Puntuación
Esto es code-golf
así, ¡entonces gana el código con el menor número de bytes!
None
en python) en lugar de no generar nada? Además, ¿por qué la entrada debe ser una cadena en lugar de una lista? ¿Y qué quiere decir con el elemento más grande de la entrada, representado como está en la entrada?7,3,7,2
.,
en la entrada?Respuestas:
R ,
5037 bytes-33 bytes gracias a digEmAll! -13 bytes gracias a rturnbull!
Pruébalo en línea!
fuente
MathGolf , 5 bytes
Pruébalo en línea!
Explicación
Esto funciona porque tanto el operador máximo como el descarte del operador izquierdo no hacen nada por las listas vacías. Bueno, el operador max elimina la lista y no introduce nada en las listas vacías.
Puede ser de 4 bytes si la entrada se puede tomar como una lista.
fuente
Perl 6 ,
26 2322 bytes-1 byte gracias a nwellnhof
Pruébalo en línea!
Devuelve un recibo vacío si todo es igual.
Explicación
fuente
EVAL
truco es bueno e incluso puedes guardar un byte cono&EVAL
.if +.Set
funcionaria?Jalea , 4 bytes
Un programa completo que acepta la entrada como un argumento de línea de comando (sin comillas) que imprime la salida requerida
(Tenga en cuenta que se trata de: entrada vacía como
, entrada de elemento único como
7
y entrada de elemento múltiple7,8,7
como la especificación parece requerir actualmente).Pruébalo en línea!
¿Cómo?
fuente
APL (Dyalog Classic) , 6 bytes
Pruébalo en línea!
un tren que calcula el máximo (
⌈/
) sin (~
) el mínimo (⌊/
) convertido en una matriz (⍪
)si la entrada contiene solo un elemento distinto,
⌈/~⌊/
estará vacía y⍪
devolverá una matriz 0 × 1 que se representa como nadade lo contrario,
⌈/~⌊/
será un vector de 1 elemento y⍪
será una matriz 1x1 (visualmente indistinguible de un escalar) que contiene el máximofuente
CJam ,
1613 bytesPruébalo en línea!
fuente
Python 2 , 37 bytes
salidas a stderr (depuración en tio).
Pruébalo en línea!
fuente
Python 2 ,
4241 bytesPruébalo en línea!
fuente
element, element, ...
. es decir, no tiene que estar entre corchetes.input
por defectoeval
s cualquier cadena que se ha pasado de la entrada estándar.,
embargo, no sé si una lista de un elemento puede tener un final , ya que su solución falla si la entrada es solo un número!=
a a>
ya que la entrada nunca estará vacía?Haskell ,
777561 bytesPruébalo en línea!
('[':).(++"]")
toma una cadena (p"1,2,1,3"
. ej. ) y la encierra en caracteres de paréntesis ("[1,2,1,3]"
). Luegoread
convierte la cadena en una lista de enteros ([1,2,1,3]
).La función
f
utiliza este consejo para un condicional más corto si uno de los resultados es la lista vacía.any(/=a!!0+0)a
comprueba si la listaa
contiene algún elemento que no sea igual a su primer elementoa!!0
. (Se+0
necesita tal queread
sepa que tiene que buscar una lista de números). Si todos los elementos son iguales, esta prueba da como resultadoFalse
y se devuelve la cadena vacía. De lo contrarioshow(maximum a)
, se devuelve el máximo de la lista convertida en una cadena.fuente
Rojo, 81 bytes
Al igual que la solución R, una gran parte del código está manejando la cadena de entrada "1,1,2,44,1". Si podemos tener eso como un bloque, por ejemplo:,
x: [1 1 2 44 1]
entonces podemos hacerlo en 41 bytes:fuente
sort x: unique load replace/all input","" "if 1 <>length? x[last x]
por 67 bytes. Lamentablementeinput
no funciona en TIO. Si lo convierte en una función, funciona bien en TIO: 73 bytesAPL (Dyalog Unicode) , 12 bytes
Programa completo Solicita una cadena desde stdin.
Pruébalo en línea!
⎕
solicitar y evaluar la expresión (las comas concatenan los números en una lista){
...}
aplique la siguiente lambda anónima (⍵
es el argumento; la lista de números):1≠
[si] 1 es diferente de ...≢
la cuenta de ...∪
los números únicos en ...⍵
la lista:
luego⌈/
devolver el máximo a través (lit. reducción máxima) ...⍵
la lista[más: no hacer nada]
fuente
⌈/~⌊/
JavaScript (Node.js) , 49/53 bytes
Mi versión original usando
.every()
, 53 bytes¿Una función que devuelve '' cuenta como sin salida? Claro que esto se puede mejorar ...
Pruébalo en línea!
Versión mejorada utilizando
Set()
por lanudo , 49 bytesPruébalo en línea!
fuente
Neim , 4 bytes
Explicación:
Pruébalo en línea!
fuente
Octava , 28 bytes
Devuelve el máximo (un número, que es una matriz 1x1) o una matriz vacía (1x0).
Pruébalo en línea!
fuente
Japt, 16 bytes
Esto sería 9 si no fuera por el formato de entrada innecesariamente estricto, 7 si arrojar un error cuenta como no generar nada.
Asume que la cadena contiene al menos 2 enteros.
Intentalo
fuente
Lisp común, 102 bytes
Pruébalo en línea!
El tamaño se debe principalmente a la entrada de datos; Con la entrada como una lista regular, la longitud se reduce a 46 bytes:
fuente
XPath 3.1, 54 bytes
con la cadena de entrada como elemento de contexto:
Podría reducirse en un carácter si permite que el contexto enlace un prefijo más corto que "xs" al espacio de nombres del esquema XML.
Explicación: toma la cadena de entrada, se tokeniza en el separador ",", se aplica
xs:int()
a cada token para convertirlo en un entero, calcula el máximo de la secuencia, emite el máximo siempre que el predicado$t!=$t
sea verdadero. Si A y B son secuencias, entoncesA!=B
es cierto si hay un par de elementos (a de A, b de B) tales quea!=b
.Si la entrada se puede suministrar como una secuencia de enteros $ s en lugar de una cadena separada por comas, la solución se reduce a
(15 bytes, que bien podría ser la solución más corta en un lenguaje que no está diseñado específicamente para ser breve)
NOTA : esto no satisface el requisito "representado como está en la entrada": si hay un número entero con ceros a la izquierda o un signo más en la entrada, se perderán. Sospecho que eso también es cierto para muchas otras soluciones.
fuente
K4 ,
3835 bytesCasos de prueba:
No soy muy fluido en ninguna de las k variantes disponibles en TiO, por lo que no hay ejemplos en línea disponibles, aunque intentaré encontrar uno
Explicación
Si se pregunta por qué ciertas operaciones se realizan antes que otras, K4 no tiene precedencia de operador, sino que interpreta de derecha a izquierda (aunque puede usar paréntesis para precedencia). Expresiones separadas por punto y coma.
Probablemente se pueda jugar más, no un fanático de tener que usar esa función improvisada al final.
EDITAR: Si las comas en la salida son un problema, se puede arreglar con dos bytes más:
Tomando el total a
4037, pero la coma antes del número simplemente significa que es una lista de elementos únicos en lugar de un átomo.fuente
PHP (<= 5.6)
6474 bytesEjecutar como tubería con
-nR
o probarlo líneasplit
fue eliminado en PHP7, pero como tuve que agregar 10 para solucionar algunos problemas, valió la pena usarlo, en lugar de loexplode
cual es más o menos equivalente en este caso.fuente
Also this doesn't work when there are more than one element with the max value
Me missread laIf they are all equal, return/output nothing
que seIf they are equal, return/output nothing
significa que si hay más de uno a la salida vacía. Agregar lo==count($a)
arregla. Debido a quearray_count_values
cuenta la cantidad de veces que aparece en la matriz, si eso es igual a la cantidad total de elementos en la matriz, entonces genera '' de lo contrario, genera el máximo$argn
la toma de stdin (esto se ha utilizado en múltiples respuestas de golf) Puedo dar ejemplos no solo míos sino de otros usuarios.Japt
-hF
, 8 bytesIntentalo
-3
bytes si la entrada podría tomarse como una matriz.fuente
05AB1E ,
98 bytes-1 byte gracias a @Cowabunghole .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
',¡ZsËiõ
, ahorrando 1 bytePython 2 , 44 bytes
Pruébalo en línea!
fuente
eval
en Python convierte una cadena delimitada por comas en una lista.k=input()
y obtener el mismo resultado.Ohm v2 , 9 bytes
Pruébalo en línea! Explicación:
fuente
Carbón de leña , 15 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Divida la entrada en comas y convierta cada valor a entero.
Pruebe si el valor máximo es mayor que el valor mínimo.
Si es así, emita el valor máximo a cadena e imprima.
fuente
Mathematica, 43 bytes
Pura función. Toma una cadena separada por comas como entrada y devuelve un número o
Null
. Creo que esto es válido, yaNull
que no se muestra gráficamente:fuente
C (gcc) , 91 bytes
Pruébalo en línea!
Degolf
fuente
M(char*s)
lugar deM(s)char*s;
y enindex()
lugar destrchr()
Pyth, 7 bytes
Pruébalo en línea!
Todos los casos de prueba (código ligeramente diferente para un mejor formato de salida)
Como Pyth se basa en Python, la entrada del usuario siempre se interpreta como una cadena, que luego se puede pasar
Explicación:eval()
. Todos los programas Pyth se ejecutan automáticamenteQ=eval(input())
como su primera instrucción.fuente
Java (JDK) , 101 bytes
Pruébalo en línea!
Explicado
¡Solución extra!
A pesar de mis mejores esfuerzos, no pude obtener esta solución utilizando expresiones regulares y flujos de menos de 105 bytes, pero realmente me gustó su elegancia, así que tuve que darle una mención honorífica;
fuente
?
) y un ciclo regular y retorno (en lugar de flujo).MATL ,
159 bytesPruébalo en línea!
Múltiples casos de prueba
¡Solo trato de evitar que mis chuletas MATL se oxiden demasiado!
Editar : oxidado después de todo; guardado 6 bytes, gracias a @LuisMendo.
Explicación
fuente
Pipa , 13 bytes
Pruébalo en línea!
Utiliza el enfoque de la solución APL ngn :
Los primeros 5 bytes
a^:',
dividen la cadena de entrada en comas.Soluciones alternativas de 13 bytes:
fuente