Alice es pasante en una empresa que utiliza Brainfuck como idioma principal para el desarrollo tanto del lado del cliente como del lado del servidor. Alice acaba de escribir su primer código y está un poco nerviosa mientras se prepara para su primera revisión de código.
Alice quiere que su código tenga el formato correcto y se vea bien, pero no tiene tiempo para leer la guía de estilo de código de la compañía de 328 páginas, por lo que decidió formatearlo como un cuadrado perfecto . Por desgracia, la longitud del código puede ser insuficiente para formar un cuadrado, por lo que decidió dejar un espacio rectangular en el medio. Los espacios deben estar perfectamente centrados y tan cerca del cuadrado como sea posible.
Ejemplos
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Escribe un programa o una función para ayudar a Alice. Dado el código de Alice como una cadena de entrada, emite un código formateado correctamente como se describe a continuación si es posible. Si el formateo es imposible, muestra emoji llorando :~(
.
Este es el código de golf, por lo que las respuestas se puntúan en bytes con menos bytes como objetivo.
Restricciones
- Su programa o función debe tomar una sola cadena como entrada y generar una o más líneas de texto (o devolver una cadena de varias líneas o una matriz de cadenas, si implementa una función).
- La cadena de entrada puede contener caracteres ASCII, incluidos espacios en blanco.
- Todos los espacios en blanco en la entrada deben ignorarse. No deben contar para la longitud del código y no deben usarse en la salida.
- La cadena de entrada contiene al menos un carácter que no es un espacio en blanco.
- El código formateado debe tener los mismos caracteres que no sean espacios en blanco en el mismo orden que en el código de entrada.
- El código formateado debe ser un cuadrado perfecto, es decir, todas las líneas deben tener la misma longitud, y el número de líneas debe ser igual a la longitud de las líneas.
- El código formateado puede contener un espacio en el medio.
- Solo se pueden usar caracteres de espacio (código ASCII 32) en el espacio.
- La brecha (si está presente) debe ser rectangular.
- Cada línea de código formateado debe contener al menos un carácter que no sea un espacio en blanco, es decir, el ancho del espacio debe ser estrictamente menor que el ancho cuadrado (el espacio 5x1 es inaceptable para el cuadrado 5x5).
- El espacio debe ser horizontal, es decir, el ancho del espacio debe ser mayor o igual que la altura del espacio.
- La brecha debe estar perfectamente centrada.
- En consecuencia, la paridad del ancho y la altura del espacio debe ser igual a la paridad del ancho cuadrado (por ejemplo, para un espacio cuadrado de 5x5 puede ser 1x1, 3x1 o 3x3).
- Si es posible, salida cuadrada sin espacio en absoluto.
- En el caso de múltiples soluciones, elija una con el espacio más cercano al cuadrado, es decir, la diferencia entre el ancho del espacio y la altura del espacio es mínima (por ejemplo: el espacio 10x10 es más preferible que 8x6, y 8x6 es más preferible que 6x2).
- Si todavía hay un empate, elija una solución con un área de separación mínima (por ejemplo, la separación 2x2 es más preferible que 4x4).
- Si es imposible formatear el código, salida
:~(
. - Nueva línea después de la última línea es opcional.
- [Nuevo] Puede suponer con seguridad que cualquier personaje con código inferior a 33 es un espacio en blanco. Espero que te ayude a jugar golf.
Pruebas
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Pruebas difíciles
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Recursos
Para ahorrar espacio, puede encontrar código de muestra y casos de prueba adicionales en tio.run
[Nuevo] Puede echar un vistazo a la tabla de soluciones aceptadas para entradas de hasta 100 caracteres . Cambié ancho y alto porque parece parecer más intuitivo.
Inspirado en: un cuadrado de texto
Cambios
Se agregaron 2 pruebas, se corrigió el error en el código de muestra.
Se agregó una tabla de soluciones hasta 100, se agregó una aclaración de espacios en blanco.
Respuestas:
C (gcc) , 354 bytes
Pruébalo en línea!
fuente
isspace(x)
conx<33
.JavaScript (ES6),
284 ... 274270 bytesGuardado 4 bytes gracias a @Shaggy
Devuelve una matriz de cadenas.
Pruébalo en línea!
fuente
This must be 5x5 with 1x1 gap.
(24 caracteres)[\s\n]
ser solo\s
?++w>x-2
w++>=x-2
w++>=x
\s
Stax , 80 bytes
Ejecutar y depurarlo
¿Como funciona?
Desempaquetado, sin golf, y comentó que se ve así.
Ejecute este
fuente
Carbón , 120 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Elimine los espacios de la entrada, luego inviértalo y divídalo en caracteres, para que podamos recorrer los caracteres más fácilmente más adelante.
Comience con un tamaño de cero, lo que indica que no se encontró ningún resultado (todavía).
Verifique todas las longitudes laterales hasta la longitud de la cuerda. (Lanzar una división en, por supuesto, haría que el código sea más rápido).
Si el resultado resulta ser un cuadrado perfecto, guarde el tamaño del cuadrado y también configúrelo como el tamaño del borde.
Pase sobre las posibles alturas y anchos del borde (el ancho del borde no es mayor que la altura del borde, lo que hace que la altura del espacio no sea mayor que el ancho del espacio).
Si el tamaño del borde es la longitud deseada y todavía no tenemos una solución o no es tan cuadrada como esta solución, actualice la solución con este tamaño de cuadrado y borde.
Si tenemos una solución ...
Dibuja un rectángulo de un carácter arbitrario del tamaño cuadrado dado.
Si el borde es lo suficientemente pequeño como para dejar un espacio, borre el espacio. (El comando de dibujo dibujará hacia arriba y hacia la izquierda para valores negativos y no le gustan los valores cero).
Reemplace todos los caracteres (restantes) con caracteres de la entrada.
De lo contrario salida
:~(
.fuente
Jalea ,
9185 bytesPruébalo en línea!
Un enlace monádico que toma la cadena de entrada como argumento y devuelve una cadena con la salida formateada o
:~(
.fuente
Python 2,
287281279 bytesPruébalo en línea!
Utiliza la comparación de listas lexicográficas de Python utilizando los mismos valores para elegir una solución e imprimirla. Estoy bastante seguro
deque1042 o menos bytes aún se pueden eliminar.Explicación
Elimine los espacios en blanco dividiéndolos con espacios en blanco y uniéndolos
""
, luego convierta la entrada en una lista para más adelante. Inicialice también lal
longitud del código real y lap
lista de posibilidades válidas.Recorre todas las posibilidades de tamaños de espacio desde
0*0
hastal*l
. Calcule la longitud del borde del cuadrado conl
caracteres de código yx*y
espacios comos
.Compruebe si las siguientes condiciones coinciden:
s % 1 == 0
, es decir, se formaría un cuadrado perfectox < s-1 > y
, es decir,x
yy
están como máximos-2
y caben dentro del cuadrados % 2 == x % 2 == y % 2
, es decir, ambosx
yy
que coincida con la paridad del borde y puede ser centradax < 1
, es decirx == 0
, ignora todo menos el requisito de cuadrado perfectoSi las condiciones coinciden, agregue los siguientes elementos en una tupla
p
para encontrar el óptimo:abs(x-y)/2
; Primero encuentre la diferencia mínima dex
yy
para obtener la mayor brecha cuadrada. Esto siempre es así, así que dividimos por 2.int(s)
; luego encuentre la longitud lateral mínima. Comos
es un número entero y aumenta a medida que el área de separaciónx*y
, esto se ordena por área de separación.-x
; luego encuentre el ancho máximo para preferir espacios horizontales. Esto viene después del área debido a cómo se desarrolló, pero el área es la mismax*y
yy*x
funciona.Si encontramos diseños válidos, encuentre el óptimo como se describió anteriormente. Calcule el borde horizontal
b
e inicialice el número de líneaY
a 0.Si el número de línea
Y
está dentro del espacio (el borde vertical esb+d
, cond
la tupla), agregue el espacio de ancho del espacio después del borde horizontalc
. (La modificación dec
es por qué necesitamos que sea una lista.) Luego imprima una línea del cuadrado y quítelac
. Repita loss
tiempos, incrementando el número de línea.Si no se encontraron diseños, falle.
fuente
"some\ntext"
como delimitadores. (input()
evalúa una línea de entrada como código Python). Si esto no es aceptable, hágamelo saber. La longitud 22 también funciona para mí.Pyth ,
9998 bytesPruébalo en línea!
Esto usa el mismo algoritmo que mi respuesta de Python, pero muchos detalles se cambian significativamente para ser más cortos en Pyth.
Pyth muestra su antigüedad aquí, ya que no se ha actualizado en edades y solo usa los caracteres ASCII imprimibles (para código, no datos), desperdiciando mucho espacio.
Curiosamente, si Pyth usara el mismo tipo de empaque de base 256 que Stax, este programa podría ser ⌈98 log 256 95⌉ = 81 bytes de largo, justo al lado de Stax (80 bytes) y Jelly (85 bytes). Creo que esto muestra muy bien cuán cercanos están los lenguajes de golf incluso con sus paradigmas drásticamente diferentes.
Explicación (solo un poco menos ilegible que el código)
#
envuelve todo en unwhile True:
que suprime el mensaje y se cierra por error.JscQ)
c
salta input (Q
) en el espacio en blanco,s
une las partes y guarda el resultado enJ
.^UJ2
hace la lista de índices (U
) deJ
y toma su2
poder cartesiano nd (^
), dando como resultado todos los pares[h,w]
con0<=h<len(J)
y0<=w<len(J)
.+L@+lJ*Fd
: para todos (L
) tales paresd
, agrega (+
) la raíz cuadrada (@
...2
) de (lal
profundidad deJ
más (+
) el producto (*F
) del pard
) al lado izquierdo del par, creando un triplete[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
ilter para trillizosT
donde!|
):hT
) módulo 1 (%
...1
) no es cero&
):eT
) no es cero|
):R
) módulo 2 (%
...2
), con duplicados ({
) y el primer único (t
) eliminado, no está vacíoeS
) de la altura del espacio y el ancho del espacio (tT
) esg
más o menos igual que la longitud del lado (hT
)S
clasifica los trillizos lexicográficamente (por la longitud del lado, luego por la altura del espacio).oaFtN
luegoo
clasifica los tripletes por laa
diferencia de solutos entre la altura del espacio y el ancho del espacio (tN
).En este punto, si no tenemos soluciones válidas,
|
evalúa su segundo argumento\n":~("
, que imprime y devuelve:~(
.h
toma la solución óptima (o":"
si no hay ninguna) y se guarda enK
. Luegoh
toma su longitud lateral (o":"
si no hay ninguno), los
convierte en entero (o falla y se cierra si no hay ninguno) y se guarda (=
) enQ
.Cada uno de (
m
)[gap height, gap width]
(tK
) se resta (-
) de la longitud del lado (Q
) y el resultado se divide por 2 (/
...2
). Los resultados seA
asignan aG
yH
.Finalmente, entramos en un
W
bucle hile.Z
comienza en 0 y cada iteración lo incrementamos pero usamos el valor anterior (~hZ
, pienseZ++
en C).W
) el valor anterior está en ({
) elr
ánguloG
a (longitud lateral -G
) (-QG
), asigne (=
) aJ
lo siguiente:c
salteJ
a la posición (]
)H
yj
alinee las mitades con el ancho del espacioeK
multiplicado por (*
) un espacio (d
). Si el valor no estaba en el rango, solo regreseJ
. Si este resultado está vacío, detenga el ciclo.>
) los primerosQ
caracteres deJ
y asigne (~
) el resultado aJ
. Del valor anterior deJ
, tome (<
) los primerosQ
caracteres e imprímalos.Finalmente, el
#
ciclo comienza de nuevo, errores y se cierra porquecQ)
alQ
contener un número no es válido.fuente
05AB1E ,
9589 bytesUnos pocos bytes aquí y allá definitivamente se pueden jugar al golf.
Los primeros tres pasos del programa están inspirados en la respuesta Stax de @recursive , ¡así que asegúrese de votarlo!
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Paso 1: elimine todos los espacios en blanco:
Paso 2: crea todos los trillizos posibles[ a , b , c ] , dónde un es la dimensión del resultado a × a cuadrado y b × c es el tamaño de la brecha Hacemos esto creando todos los tripletes posibles usando enteros en el rango[ 0 , a ] . Y luego filtramos estos donde todo lo siguiente es verdadero para el triplete:
Por ejemplo:L = 28 resultará en los trillizos
[[6,2,4],[6,4,2],[8,6,6]]
.Paso 3: Comprueba si todavía nos quedan tresillos. Si no, salida( a b s ( b - c ) , b × c ) .
":~("
; si lo hacemos, determine cuál usar clasificando y dejando solo el primero. Hacemos esto clasificando las tuplasPor ejemplo: los trillizos
[[6,2,4],[6,4,2],[8,6,6]]
se ordenarán[[8,6,6],[6,2,4],[6,4,2]]
, después de lo cual solo[8,6,6]
permanecerá.Paso 4: crea una lista sobre cómo debemos dividir la cadena para insertar los espacios. Esto se hace así:
Dado[ a , b , c ] , cree una lista con:
Por ejemplo: triplete
[7,3,5]
dará como resultado la lista[15,2,2,35]
.Paso 5: Y finalmente dividimos la cadena en función de esta lista, únala nuevamente conC cantidad de espacios, dividirlo en partes de tamaño C , y únete a ellos por nuevas líneas. Por ejemplo:
Cadenac = 5 cantidad de espacios para a = 7 a esto:
"Alongtesttoseeifitworksasintended."
dividido de acuerdo a la lista[15,2,2,35]
resultará en:["Alongtesttoseei","fi","tw","orksasintended."]
. Esto luego se une por"Alongtesttoseei fi tw orksasintended."
. Y luego dividir en partes de tamaño["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
. Que luego se une con nuevas líneas a la salida.fuente