Introducción
Más complejo que un cuadrado de texto ya que esto requiere relleno y la entrada tiene un tipo de datos desconocido.
Cada año, Dyalog Ltd. celebra una competencia estudiantil. El desafío es escribir un buen código APL. Esta es una edición de código de golf agnóstico del lenguaje del décimo problema de este año.
Tengo permiso explícito para publicar este desafío aquí del autor original de la competencia. No dude en verificar siguiendo el enlace proporcionado y contactando al autor.
Problema
Escriba un programa / función que cambie la forma de una cadena o lista numérica dada en el cuadrado más pequeño que contendrá todos los elementos de la entrada, rellenando con elementos adicionales si es necesario. El elemento de relleno debe ser el elemento de relleno predeterminado para el tipo de datos dado, o cualquier elemento que elija. Los elementos del cuadrado deben estar en un orden tal que al aplanarlo se obtenga el orden original de los datos de entrada (con elementos de relleno finales, si los hay).
Casos de prueba
[1,2,3,4]
→
[[1,2],
[3,4]]
[1,2,3,4,5]
→
[[1,2,3],
[4,5,0],
[0,0,0]]
"Dyalog APL"
→
[["Dyal"], [["D","y","a","l"],
["og A"], or ["o","g"," ","A"],
["PL "], ["P","L"," "," "],
[" "]] [" "," "," "," "]]
[100]
→
[[100]]
[]
→
el equivalente más cercano de su idioma a una matriz vacía, por ejemplo []
o[[]]
[1,2,3,4,'O']
, o se garantiza que no ocurra? 3. ¿El orden requerido después del requisito de aplanamiento ignora los elementos de la almohadilla (por ejemplo, ¿podría una entrada de[1,2,3,4,5]
rendimiento[[0,0,0],[0,1,2],[3,4,5]]
o incluso[[0,1,0],[2,0,3],[0,4,5]]
)?Respuestas:
MATL ,
129 bytesGuardado tres bytes gracias a Luis.
he
en lugar deUGwewe
, pero agregando unt
al principio.Pruébalo en línea!
Esto devuelve los resultados, pero se transpone en comparación con el resultado en la publicación de OP (que está bien).
Explicación:
Esto funciona de la misma manera para entradas numéricas y de cadena, ya que MATL las trata de la misma manera.
Suponga que la entrada es
'Dyalog APL'
Esto no genera nada para la entrada vacía, que resulta ser que MATL genera matrices / cadenas vacías.
fuente
tnX^Xkt3$e
hace el trabajotnX^Xkthe
reshape
y no se dio cuenta de la muy obvia:$: Specified inputs
. Y no sabía que podías pasar las dimensiones como un vector. Yo sabía que tenía que haber una manera sin tener que pasar por dos remodelamientos. ¡Gracias! :)JavaScript (ES7), 70 bytes
Devuelve
[]
para una matriz / cadena vacía. Usosundefined
como el valor de relleno. Para ES6, reemplace(...)**.5
conMath.sqrt(...)
(+5 bytes).fuente
Brachylog , 10 bytes
Pruébalo en línea!
Toma cadenas como listas de caracteres (el autor de la pregunta ha confirmado que esto está bien).
Esto es muy ineficiente en entradas más largas, ya que fuerza de forma bruta todas las posibles remodelaciones de la entrada, intentando progresivamente más relleno, hasta que encuentra una que resulta ser cuadrada.
Explicación
Los elementos de relleno utilizados son el valor "cualquier valor" de Prolog
_
, que normalmente se representa como_G
más algunos dígitos aleatorios en la salida (para que el motor Prolog pueda expresar relaciones entre esos valores de propósito general).Por cierto, hubo una corrección de errores en SWI-Prolog hace solo unos días que hace posible este programa (aunque todavía parece funcionar en versiones anteriores con errores); la restricción "es rectangular" implicada
\
anteriormente se rompió, pero se solucionó a tiempo para el desafío.fuente
Python 2 , 105 bytes
Pruébalo en línea!
fuente
PHP, 139 bytes
Cadena de salida como matriz de caracteres 2D
funciona con una
[]
matriz vacíaPruébalo en línea!
PHP, 143 bytes
necesita
[[]]
como matriz vacíaCadena de salida como matriz de cadena 1D
Pruébalo en línea!
fuente
Jalea , 13 bytes
Un enlace monádico que toma una lista plana y devuelve una lista de listas.
Test suite en Pruébelo en línea!
¿Cómo?
Agrega tantos ceros (el elemento de relleno) como elementos hay en la entrada y luego cambia la forma a un cuadrado, eliminando cualquier exceso de ceros a los requisitos en el proceso.
fuente
R, 91 bytes
Por defecto, R rellena las matrices reciclando elementos del vector de entrada y codifica las matrices en el orden de columnas principales. Devolverá una
0x0
matriz para una entrada dedouble(0)
(una matriz doble vacía) o''
.La primera línea (la
if
declaración) divide una cadena en un vector de sus caracteres constituyentes; si puedo tomar ese vector, esa línea se puede eliminar.Pruébalo en línea!
fuente
Bash ,
91776967 bytesPruébalo en línea!
Formatos de texto, pads con espacios. No emite nada para stdout en la entrada vacía.
Actualización : robó algunos trucos de las respuestas aquí .
fuente
Haskell, 87 bytes
Pruébalo en línea!
El elemento de relleno es
error[]
, el valor más corto que es de cualquier tipo (undefined
es un poco más largo).Notas sobre el enlace TIO:
no puede imprimir
error
, así que concateno matrices con elementos de relleno de nuevo en una lista e imprimo su longitudTIO no tiene
Data.Lists
, soloData.List.Split
que muestra 5 bytes más.Cómo funciona: calcule la longitud
c
de la matriz c-por-c. Tome los primerosc
elementos de la lista de fragmentos de longitudc
de la lista de entrada seguido de una lista de elementos de relleno que tiene la misma longitud que la lista de entrada. P.ej :fuente
Dyalog APL,
2019 bytes-1 Byte gracias a @ Adám!
Pruébalo en línea!
fuente
{(,⍨⍴⍵↑⍨×⍨)⌈.5*⍨≢⍵}