Genere una cuadrícula de 7 por 7, llena de números aleatorios. Sin embargo, en celdas con un número impar de fila y columna (comenzando en 0), debe usar la suma de las celdas circundantes. Aquí hay un pequeño ejemplo con una cuadrícula de 3 por 3 (suma cuadrada en negrita):
2 2 2
2 16 2
2 2 2
Y aquí hay un ejemplo de cuadrícula de 7 por 7:
6 5 4 3 7 2 5
6 43 3 50 8 43 8
4 7 8 8 9 3 1
4 36 1 43 6 40 5
3 3 6 1 4 7 5
4 35 3 45 9 42 1
2 6 8 6 8 5 3
Reglas
Los números que no son sumas deben estar siempre entre 1 y 9 inclusive.
La cuadrícula se debe generar aleatoriamente. Para cada no suma, cada dígito debe tener la misma posibilidad de aparecer, independientemente de la celda en la que se encuentre.
Los números deben estar alineados. Esto significa que el primer o el último dígito de cada número en una columna debe alinearse verticalmente. (Puede suponer que los números del medio siempre serán dos dígitos).
Las células circundantes incluyen diagonales. Por lo tanto, cada cuadrado de suma tendrá ocho números que lo rodean, que debes sumar.
El código más corto gana, ya que este es el código de golf .
fuente
Respuestas:
APL,
53 49 43 42 40 3936Logré replicar J's
;.
en APL, y usé el enfoque de Gareth , ahorrando 13 caracteres.Ejecución de muestra:
Explicación:
∘.∨⍨9⍴0 1
genera una máscara de bits.×∘?∘9¨
multiplica cada bit por un valor aleatorio de 1 a 9 inclusive, generando una cuadrícula enmascarada de números aleatorios.3,⌿3,/
usa lo que solo se puede describir como piratería para devolver los cuadros superpuestos de 3 en 3 en la matriz enmascarada. Estos también se aplanan en el proceso.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
itera sobre la matriz, asignando cada elemento a⍵
. Para cada iteración, toma la quinta (en el medio, recordando que la indexación APL se basa en 1) y devuelve su signo. En este caso, esto es equivalente a probar si el número es mayor que 0. Si esto devuelve 1 (para verdadero), entonces devuelve ese elemento. De lo contrario, devuelva la suma de los elementos en el cuadro aplanado 3 por 3. Utiliza el:⋄
operador ternario, que es el equivalente?:
en muchos idiomas.fuente
J,
63615955525149473937 caracteresCon gracias a Volatility por su ahorro de 10 personajes.
Explicación (cada paso tendrá diferentes números aleatorios ...):
Genere la máscara para generar los números aleatorios (utiliza
$
:Ahora tenemos un gancho . Esto es realmente un feliz accidente de cuando estaba reduciendo una versión anterior. Estaba destinado a ser transpuesta
|:
y OR+.
con el original. Tenía sentido ya que estaba usando unos y ceros en ese momento, pero ahora tengo nueves y ceros. Sucede que funciona de la misma manera con el significado de GCD de+.
. Por suerte para mi. :-)Entonces, ahora que tenemos una cuadrícula de 9 y 0 queremos generar algunos números aleatorios.
?
genera un número aleatorio desde 0 hasta (pero sin incluir) un número dado. Dada una lista, generará un número aleatorio de esta manera para cada miembro de la lista. Entonces, en este caso, generará un número de 0 a 8 por cada 9 en la tabla y un número de coma flotante de 0 a 1 por cada 0.Pero queremos números del 1 al 9, no del 0 al 8. Así que sumamos 1.
Esto es muy bueno, pero hemos perdido los ceros que quiero, así que lo multiplicaremos por la máscara original después de convertir todos los nueves en unos. Hago esto comprobando si el valor es mayor que 1. Esto nos da:
(1&<*1+?)
.Aquí hay un par de cosas:
&
) el 1 al<
verbo.Entonces, todo combinado
(1&<*1+?)
genera números aleatorios y pone a cero todos los números que fueron generados por ceros en la cuadrícula original.El siguiente bit es el (en mi opinión, de todos modos :-) bit inteligente.
El
;.
verbo cortado tiene una formax u;._3 y
que corta la entrada en cuadros descritos porx
, y luego les aplica el verbou
. En este caso tenemos3 3(4&{++/*0=4&{)@,;._3
.3 3
describe los cuadros que queremos - 3x3.(4&{++/*0=4&{)@,
es un tren de verbos que describe lo que queremos hacer con cada cuadro.Para demostrar el
;.
verbo que usaré<
para mostrar cada cuadro:Algunas cosas para notar:
0
en el centro de la caja.Ahora solo tenemos que pasar el valor en el centro hacia atrás (si no es cero) o sumar los números en el cuadro 3x3 (si el centro es cero).
Para hacer esto, necesitamos un fácil acceso al número del centro.
,
Ayuda aquí. Convierte el cuadrícula de 3x3 en una lista de 9 elementos con el número del centro en el número 4.4&{
utilizará{
para sacar el valor central y luego compararlo con 0:0=4&{
. Esto devuelve un0
o1
para verdadero o falso, que luego multiplicamos por la suma+/
. Si era cero en el centro, ahora tenemos nuestra suma según sea necesario. Si no fuera así, tenemos cero, así que para terminar simplemente agregamos el valor central4&{+
.Esto le da al verbo train
(4&{++/*0=4&{)@,
fuente
?
. Cambiaré la explicación para reflejar la versión más nueva.Ruby (135 caracteres)
Salida de muestra
Descompostura
No es demasiado obvio cómo funciona esto, así que aquí hay un desglose rápido. NOTA: Probablemente pueda omitir algunos de estos pasos y pasar a versiones más cortas más rápidamente, pero creo que es lo suficientemente educativo como para ver las diferentes formas en que eliminé los caracteres, especialmente al detectar patrones en literales para convertir números de 2 dígitos en versiones de 1 dígito .
Versión ingenua
A diferencia de las otras soluciones de Ruby que dependen de una matriz bidimensional, puede (eventualmente) obtener una versión más corta comenzando con una matriz unidimensional y trabajando con valores de desplazamiento, ya que los patrones se repiten.
El principio clave aquí es que estamos trabajando en las posiciones de índice 8, 10, 12, solo compensadas por múltiplos de 14. Las posiciones 8, 10 y 12 son los centros de las cuadrículas de 3x3 que estamos resumiendo. En la salida de muestra, 34 es la posición 8, 42 es la posición 8 + 14 * 1, etc. Reemplazamos la posición 8 con 34 por las posiciones desplazadas de la posición 8 por
[-8,-7,-6,-1,1,6,7,8]
- en otras palabras34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Este mismo principio es válido para todos los valores de[8 + 14*i, 10 + 14*i, 12 + 14*i]
, ya que el patrón se repite.Optimizándolo
Primero, algunas optimizaciones rápidas:
3.times { ... }
, y calculandoj + 14*i
cada vez, "en línea" las posiciones[8,10,12,22,24,26,36,38,40]
.offsets
matriz se usa una vez, así que reemplace la variable con el literal.do ... end
con{...}
y cambie la impresión a$> << foo
. (Aquí hay un truco que involucraputs nil
y() == nil
).El código después de esto es 177 caracteres:
Para la próxima reducción, tenga en cuenta que
inject
no necesita que la matriz de compensaciones esté en orden. Podemos tener[-8,-7,-6,-1,1,6,7,8]
u otro orden, ya que la suma es conmutativa.Así que primero empareje los aspectos positivos y negativos para obtener
[1,-1,6,-6,7,-7,8,-8]
.Ahora puedes acortar
a
Esto resulta en
que tiene 176 caracteres.
Cambia por 8 y pasa a las diferencias
Parece que los valores literales de dos caracteres se pueden acortar, así que tome
[8,10,12,22,24,26,36,38,40]
y cambie todo hacia abajo8
, actualizandoj
al comienzo del ciclo. (Tenga en cuenta que+=8
evita tener que actualizar los valores de desplazamiento de1,6,7,8
).Esto es 179, que es más grande, pero en
j+=8
realidad se puede eliminar.Primer cambio
a una serie de diferencias:
y acumulativamente agregue estos valores a una inicial
j=8
. Esto eventualmente cubrirá los mismos valores. (Probablemente podríamos pasar directamente a esto en lugar de cambiar por 8 primero).Tenga en cuenta que vamos a añadir un valor ficticio de
9999
la final de la matriz diferencias, y añadimos aj
la final , no el inicio del bucle. La justificación es que se2,2,10,2,2,10,2,2
ve muy cerca de ser los mismos 3 números repetidos 3 veces, y al calcularj+difference
al final del ciclo, el valor final de9999
no afectará realmente la salida, ya que no hay unaa[j]
llamada dondej
hay algún valor terminado10000
.Con esta matriz de diferencias,
j+=8
ahora es justaj=8
, por supuesto, ya que de lo contrario agregaríamos8
demasiadas veces . También hemos cambiado la variable de bloque dej
al
.Entonces, dado que el
9999
elemento no tiene ningún efecto en la salida, podemos cambiarlo10
y acortar la matriz.Esto es 170 caracteres.
Pero ahora se
j=8
ve un poco torpe, y puede guardar 2 caracteres al cambiar[2,2,10]
hacia abajo por 2 para obtener convenientemente un8
que pueda usar para la asignación. Esto también necesitaj+=l
serj+=l+2
.Esto es 169 caracteres. Una forma redonda de exprimir 7 caracteres, pero es genial.
Ajustes finales
La
values_at
llamada es en realidad algo redundante, y podemos hacer unaArray#[]
llamada en línea . Entoncesse convierte
También puede detectar que
flat_map
+j+e/j-e
+inject
se puede reducir a una suma más directa con una inicial0
en la matriz.Esto te deja con 152 caracteres:
Finalmente:
map.with_index
puede llegar a sereach_slice
.135 :
fuente
each
conmap
un byte.Python, 132
Esto técnicamente no satisface las reglas, porque los últimos dígitos de cada número están alineados en lugar del primero. Pero pensé en compartir de todos modos:
Salida de muestra:
fuente
Mathematica, 108
Para una salida más bonita
Column/@
se puede reemplazar conTableForm@
un costo de 2 caracteres.fuente
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
da una salida más limpia y guarda un par de caracteres si cuenta Transponer como un solo carácter, que está en Mathmatica. Por cierto, la plantilla OneLinerSubmission de Wolfram contó 106 caracteres, 105 con el carácter Transposición.:>
ser un símbolo, aunque está en el área de uso privado de Unicode. Incluso se podría eliminar la transposición, ya que la regla de suma de validez se mantiene incluso después de la transposición. Pero pareceGrid
que no alinea las entradas sin más opciones (v8)Grid
centra los números dentro de columnas. Técnicamente, eso no satisfaría el desafío, pero se ve mejor que tener una lista en la tabla mostrada.Part
yTuples
. Publicando pronto.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 caracteres)Nota: contiene una pestaña literal que Markdown puede romper.
La parte inteligente se debe a Gareth: vea su solución J.
Demostración en línea
fuente
R: 114 caracteres
La primera línea crea una matriz de 7 por 7 llena de números elegidos al azar del 1 al 9 (distribución uniforme con reemplazo, por
r=T
lo tanto, lo que significareplace=TRUE
). Segunda línea, calcule sumas de 3 por 3 cuadrículas, reste el centro y reemplácelo con el resultado. La tercera línea imprime la cuadrícula resultante (por defecto, las columnas de matriz y matriz están alineadas a la derecha).Salida de ejemplo:
fuente
J,
6765 bytesUna solución ingenua y detallada en J. Es una implementación sencilla de la tarea.
Primero creo una matriz de 7 x 7 de enteros entre 1 y 9. ¿De hecho J's? el verbo genera números hasta su argumento, es por eso que necesitamos incrementar cada elemento,>: en J
Preparo una máscara para usar para poner a cero las celdas impares de fila / columna, un par de índices de fila / columna impares:
El verbo Catálogo {combina elementos de los átomos dentro de la lista en recuadro
para formar un catálogo, la tabla 3x3 de los pares de arriba
Luego preparo una tabla de índices de fila / columna para usar en la selección de cada una de las submatrices de 3x3.
Para cada par en la matriz m hago un par de tripletes, centrados alrededor de cada número del par m:
Estos pares de tripletes son utilizados por el verbo J From {, que puede seleccionar múltiples filas y columnas simultáneamente. 0 1 2/2 3 4 significa que selecciono las filas 0, 1 y 2 junto con las columnas 2, 3 y 4, seleccionando así el segundo subconjunto 3x3 en la parte superior.
Finalmente, puedo usar la matriz 7x7 y las máscaras para lograr la tarea: Primero uso m como máscara para establecer los elementos correspondientes en 0:
Luego tomo todas las submatrices 3x3 usando s como selector y encuentro sus sumas:
Luego puse estos números nuevamente en la matriz inicial.
Pruébalo en línea!
fuente
APL (Dyalog Unicode) ,
323130 bytes SBCS-1 byte gracias a @jslip
Pruébalo en línea!
fuente
∧/¨~
->⍱/¨
Rubí, 207
Presentaré mi solución primero (como siempre lo hago):
fuente
Ruby, 150 caracteres.
si el requisito de justificación de la izquierda es solo eso
ljust
tendría que ser usado ... bueno, no. Me encantan las capacidades de formateo de Ruby.No utilice
Array.new(7){...}
.(0..6).map{...}
es más corto y más legible y obtienes un rango asignable de forma gratuita.Línea # 3 inspirada en la solución de Doorknob .
fuente
GolfScript, 87 caracteres
Hay demasiadas cremalleras allí ... (ver en línea )
fuente
J, 58/64/67 caracteres
Si bien la especificación requiere que los números estén alineados a la izquierda, no es necesario usar la notación decimal, por lo que supongo que esta es una salida válida:
Si la alineación derecha en lugar de la alineación izquierda es aceptable, estamos en 58 caracteres
J
":
(formato) tiene tres modos de formato:El más detallado pero también más versátil y el único capaz de producir la salida según el ejemplo es el
8!:2
formato extranjero, que toma una cadena de formato como argumento izquierdo. También 67 caracteres :Aquí está el formato en caja:
fuente
Perl, 117 caracteres
Este es uno de esos scripts de Perl donde todos menos uno de los bucles for se han colapsado en
map
llamadas para que todo se pueda hacer en una sola declaración. Las variables globales también hacen algunas apariciones importantes en este caso. Supongo que lo que estoy tratando de decir aquí es que este programa es un poco asqueroso.Espera, empeora: ¡Hay un error conocido en el script! Sin embargo, tiene menos de una probabilidad en un millón de ser disparado, por lo que aún no he podido solucionarlo.
fuente
Mathematica , 106/100
Se me ocurrió algo muy similar al código de ssch, antes de verlo. Estoy tomando prestada su idea de usar
Column
. Solo con ASCII, 106 :Con caracteres Unicode (como los utilizados por ssch), 100 :
fuente
Excel VBA, 74 bytes
VBE función inmediata que da salida a
[B2:H9]
.Salida de muestra
fuente
Powershell,
149148 bytes-1 byte gracias a @AdmBorkBork. ¡Es genial!
Explicación:
fuente
$a
asignación en parens y moviendo la siguiente línea hacia arriba para formar una línea grande($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Así que aquí hay dos pasos. Tuve varios intentos de encapsular en una tubería. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
se llena completamente antes de la siguiente instancia de canalización. Debería funcionar (al menos, lo hace para mí).Mathematica
142 151 172179Código
Uso
fuente
0
s; las reglas dicen 1-9Julia 0.6 , 127 (89) bytes
Pruébalo en línea!
89 bytes con pantalla nativa, que podría ser admisible si se pueden imprimir líneas adicionales:
fuente
Java 10,
262260248239 bytes-12 bytes gracias a @ceilingcat .
Explicación:
Pruébalo aquí.
fuente
var
lugar deString
y en+=Math.random()*9+1;
lugar de=(int)(Math.random()*9+1);
. En realidad, es bastante útil para ti visitar todas mis viejas respuestas, ¡jaja! : D