Nos parece que no conseguir cansados de desafíos relacionados con el alfabeto ...
La receta
Dado
- una cadena de letras
S
y - dos números enteros positivos
M
,N
,
produzca una sopa de letras con las letras de S
ocupar posiciones aleatorias en un recipiente rectangular de tamaño M
× N
, enmarcado por un carácter no alfabético y sin espacio para representar el borde del recipiente.
Las posiciones no utilizadas por las letras deben mostrarse como espacios. Vea los ejemplos a continuación .
Reglas adicionales
- El tamaño
M
× seN
refiere al interior del cuenco. El tamaño que incluye el borde esM+2
×N+2
. - Cada personaje
S
debe aparecer una vez en el tazón, en una posición diferente ; es decir, un personaje no puede sobrescribir a otro. S
puede contener duplicados . Por ejemplo, siS
es la cadena'abcc'
, la sopa debe contener unoa
, unob
y dosc
(todos en diferentes posiciones).- Las entradas estarán satisfacer las restricciones
M >= 1
,N >= 1
,1 <= length(S) <= M*N
. - El borde del cuenco puede ser cualquier carácter no alfabético, no espacial , coherente en las ejecuciones del programa y los valores de entrada.
- Las posiciones de las letras en el bol son aleatorias, por lo que el resultado puede diferir cada vez que el programa se ejecuta con las mismas entradas.
- Dada la entrada, cada posible conjunto de posiciones de letras debe tener una probabilidad distinta de cero . Como esto no puede verificarse desde algunas realizaciones del programa, explique cómo su código cumple con esto.
- Se permiten espacios en blanco iniciales o finales alrededor del borde.
S
contendrá son solo letras mayúsculas . Si lo desea, puede elegir tomar solo letras minúsculas .- La entrada y la salida son flexibles como de costumbre. Por ejemplo, la salida puede ser una cadena con nuevas líneas, una matriz de caracteres 2D o una lista de líneas.
- Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
- El código más corto en bytes gana.
Ejemplos
Las entradas se muestran como S, [M N]
, donde M
es el número de filas y el N
número de columnas. El personaje #
se usa para el borde.
'O', [1 1]:
###
#O#
###
'HEY', [1 3]:
#####
#YHE#
#####
'HELLO', [4 11]:
#############
# O #
# H #
# LE #
# L #
#############
'ADVNJSGHETILMVXERTYIOJKCVNCSF', [8 12]:
##############
#K V L S #
# A V X H #
#T M C #
# I O N#
# YC #
# G I R SE#
# J F #
#JT D V EN #
##############
'OOOOOOOOOOXXXXX', [13 31]:
#################################
# X #
# O #
# #
# X #
# O #
# X O #
# O #
# X #
# O #
# X #
# O #
# O O O #
# O #
#################################
'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ', [11 41]
###########################################
# JU#
# Q C M G R T U Y H #
# KI E H M YO #
# V BW I JC #
# SV D P B U #
# A F RF J KP E #
# E N TH Z #
# N BM O Q I AS N WX #
# S O K G L P Q #
#Z L T R L A F DD#
# V Y WX C G XZ #
###########################################
|+-
?Respuestas:
05AB1E ,
2018161514 bytesToma tres entradas en el orden: altura, ancho, cadena. Salida como una lista 2D de caracteres.
Se usa
8
como borde, pero podría ser cualquier dígito.-1 byte gracias a @Grimy .
Pruébelo en línea o verifique todos los casos de prueba . (TIO contiene
}}J»
en el pie de página para imprimir el resultado; no dude en eliminarlo para ver la lista de caracteres 2D de salida real en su lugar).Explicación:
fuente
*j
! Aquí hay 13 para legado , o un feo 14 para moderno (genera una matriz de caracteres 2D).1,1,"O"
, por lo que creo que también tiene que ser el 14-byter para el legado. Gracias por -1 sin embargo.APL (Dyalog Unicode) , SBCS de 25 bytes
Pruébalo en línea!
-22 gracias a @ngn, -7 gracias a @ngn y @ Adám
Explicación:
APL (Dyalog Extended) , SBCS de 21 bytesLos ángulos de la llanta son caracteres diferentes.
Pruébalo en línea!
Usando el dfn para mostrar el cuadro.
fuente
'#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/)
Pruébalo en línea!{'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
(o en≥
lugar de>
if⎕io=1
)'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
Python 3 , 110 bytes
Pruébalo en línea!
Aleatoriza utilizando una
set
comprensión y devuelve una matriz de caracteres 2D.fuente
f'{s:{m*n}}'
parte? Porque esa es la sintaxis de una cadena formateada, que casualmente también comienza con unf
.Bash + coreutils,
139125 caracteresEjecución de muestra:
Pruébalo en línea!
Bash + coreutils + boxes, 97 caracteres
Ejecución de muestra:
Pruébalo en línea! (Parcialmente, ya
boxes
que no está instalado en TIO).fuente
J ,
3029 bytes-1 byte gracias a Jonás
Pruébalo en línea!
fuente
9!:1]6!:9''
arregla eso{.
. Ligero ajuste para 29'#'|.@|:@,^:4[$*/@[(?~@[{{.)]
: ¡ Pruébelo en línea!PowerShell ,
16311193 bytesPruébalo en línea!
Toma la entrada como
$w
idth,$h
ocho,$s
tring.Construye una cadena de
#
la$w
idth apropiada , une la cadena con algunos cálculos, y luego esa misma#
cadena nuevamente. El cálculo comienza con la toma de la entrada de$s
Tring, y haciendo un .padRight
hasta el$w
idth por$h
ocho longitud (es decir, hacen una cadena de tiempo suficiente para tomar por completo el espacio rectangular. Entonces convertimos esa cadenat
oCharArray
, ysort
seRandom
Ly. Eso le da nosotros la parte media mezclada. Finalmente, la dividimos-replace
en trozos de igual$w
idth y rodeamos esos trozos con#
s.-52 gracias a la inspiración de AZTECCO
-18 bytes gracias a mazzy
fuente
-replace
lugar de dividir y unir.JavaScript (ES7), 125 bytes
Devuelve una cadena. Usos
0
como el carácter del marco.Pruébalo en línea!
Comentado
fuente
APL (Dyalog Extended) , 23 bytes SBCS de
Función de infijo tácito anónimo. Toma
[M,N]
como argumento izquierdo yS
como argumento derecho.Pruébalo en línea!
×/⍛(
...)
aplique la siguiente función entre los argumentos, reemplazando el argumento izquierdo con su producto:↑
tomarM
×N
personajes deS
, relleno con espacios a la derecha⊇
reordena eso al siguiente orden:?⍨⍤
los índices barajados 1 a ...⊣
el argumento izquierdo (M
×N
)⍴
r dale forma a la siguiente forma:⊣
el argumento izquierdo (es decir,M
filas yN
columnas)'#'
…⍣4
Aplique la siguiente función cuatro veces, cada vez con el carácter hash como argumento izquierdo:∘⍉
transponga el argumento derecho∘⌽
refleje el argumento derecho,
concatene una columna de hashes al lado izquierdo de esefuente
PHP 7.4,
1079994 caracteresGracias a:
join()
(-8 caracteres)chunk_split()
el$end
parámetro (-5 caracteres)Pruébalo en línea!
PHP 7.3,
117112108 caracteresGracias a:
join()
(-5 caracteres)chunk_split()
el$end
parámetro (-4 caracteres)Ejecución de muestra:
Pruébalo en línea!
fuente
fn($s,$r,$c)=>($b=str_repeat(9,$c+2))."\n9".join("9\n9".str_split(str_shuffle(str_pad($s,$r*$c)),$c))."9\n$b";
debería funcionar en PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ), y se lanzó un canditate de lanzamiento ( wiki.php.net/todo/php74 ), por lo que es un "compilador" disponible que vino antes de este desafío, y cualquiera puede usarlo.join()
, pero no pude reducir el tamaño. ☹chunk_split
: 94 bytes obtuve . También eliminé el último punto y coma, ya que creo que no es necesario, ha escrito una función, por lo que el código que la asignará a una variable no debe contar.MATL ,
2219 bytesPruébalo en línea!
Gracias @LuisMendo por guardar 3 bytes, por lo que ahora tiene el mismo bytecount que la respuesta de @ flawr , pero lo suficientemente diferente como para publicar de todos modos. Descripción general del agoritmo de alto nivel:
fuente
Z}&O
porZ"
, y eso también te permite eliminar la finalc
1$O
.Ruby , 121 bytes
Crea el cuenco, consulta los índices de todos los espacios dentro del cuenco, muestrea un número de espacios igual al tamaño de la cadena y los completa.
sample
No devuelve una lista ordenada, por lo que no es necesario barajarlos. La búsqueda de índices hasta9*m*n
(que casi con seguridad se sale de rango) seguirá obteniendo todos los espacios y es 1 byte más corto quer.size
.Pruébalo en línea!
fuente
rojo ,
120116114112 bytes-2 bytes gracias a @Kevin Cruijssen!
Pruébalo en línea!
fuente
+ 1
y usar en suto"""00"0 n
lugar.copy
por el mismo número de bytes.t
línea como elemento inicial / final antes de hacer un bucle para guardar en los dos elementos sueltosprint t
? Lo dudo, pero como no sé cómo agregar elementos a una lista, no estoy seguro.Perl 6 ,
7467 bytes-5 bytes gracias a Jo King
Pruébalo en línea!
Explicación
fuente
Perl 5
-lF
,9997 bytes-2 bytes cortesía de @NahuelFouilleul
Pruébalo en línea!
fuente
($i++%$n==0)
podría ser cambiado por!($i++%$n)
k4,
3228 byteseditar: -4 gracias a Galen Ivanov!
llamado como
explicación:
fuente
#
al final de cada línea y transpone / invierte 4 veces, algo como esto .Java (JDK) ,
180178 bytesNi una sola importación extra:
Pruébalo en línea!
Fue toda una lucha conseguir que esto se redujera. En particular, las importaciones relacionadas con los métodos Collections.shuffle () / Arrays eran demasiado para aceptar, por lo que tuve que crear mi propio algoritmo de barajado de cadenas (probablemente ni eficiente ni distribuido uniformemente). Enormes gracias a Steven por demostrar que se puede generar cualquier conjunto de posiciones partir del algoritmo.
Formateado (con explicación):
fuente
.replaceAll("(.{"+n+"})","\n#$1#")
puede convertirse.replaceAll(".{"+n+"}","\n#$0#")
Carbón , 27 bytes
Pruébalo en línea!El enlace es a la versión detallada del código. Toma entrada en el orden ancho, alto, cadena. Explicación:
Ingrese el ancho y la altura.
Enmarca el tazón.
Recorre los caracteres de la cadena.
Salta a una posición aleatoria en el tazón hasta encontrar un lugar vacío.
Imprime el carácter actual sin mover el cursor.
fuente
Move(:UpLeft)
necesario? Funciona bien sin él, pero ¿tal vez lo has agregado por una razón en la que no pienso?Japt
-R
,2118 bytesIntentalo
fuente
MATL ,
29 2719 bytesPruébalo en línea!
¡Gracias @LuisMendo por -8 bytes!
Explicación:
p
calcula el número de píxeles de sopa. LuegoZ@
produce una permutación aleatoria del tamaño del número de píxeles de sopa. Usaremos esto como índices a losiy~h
cuales se encuentra la cadena de entrada con suficientes espacios agregados.w)
intercambia los dos e indexa uno con el otro. Luego volvemos a dar1Ge
forma a la forma en el rectángulo deseado y lo#
rellenamos conTT35&Ya
.fuente
T-SQL 2017, 232 bytes
Probar esto en línea es una versión anterior de sql-server que cuesta otro personaje. Publiqué la versión más corta.
Golfizado:
Pruébalo en línea
Sin golf:
fuente
C (sonido metálico) ,
169164162160 bytesPruébalo en línea!
-2 poniendo a = o en time () call // for (srand (time (a = o)); ...
Se guardó la sugerencia de 7 @ceilingcat para usar: ~ almacenamiento variable y automático para la cadena o más muchas mejoras.
Degolf:
fuente
*a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;
lugar de--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
Icono ,
136133131118 bytesPruébalo en línea!
fuente
Jalea , 16 bytes
Un enlace diádico que acepta una lista de enteros,
[M, N]
a la izquierda y una lista de caracteresS
, a la derecha que produce una lista de listas de caracteres, las líneas. Utiliza el carácter tilde~
, como borde.Pruébalo en línea!
Todas las salidas posibles tienen una probabilidad distinta de cero de ser producidas ya que barajamos (
Ẋ
) una lista de los caracteresS
junto con el número apropiado de espacios.El código
Ṿ€«”~ZƊ⁺
guarda el byte que imagino que se necesitaría para unirse a las nuevas líneas que los programas completos que usan un número entero como cero necesitarían emplear (por ejemplo,P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Y
oP⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y
). Tal vez hay una manera de ahorrar más ...?fuente