Gere uma grade 7 por 7, preenchida com números aleatórios. No entanto, nas células com um número ímpar de linhas e colunas (começando em 0), você deve usar a soma das células circundantes. Aqui está um pequeno exemplo com uma grade 3 por 3 (soma quadrada em negrito):
2 2 2
2 16 2
2 2 2
E aqui está um exemplo de grade 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
Regras
Os números que não são somas devem sempre estar entre 1 e 9, inclusive.
A grade deve ser gerada aleatoriamente. Para cada não soma, cada dígito deve ter uma chance igual de aparecer, independentemente da célula em que está.
Os números devem estar alinhados. Isso significa que o primeiro ou o último dígito de cada número em uma coluna deve estar alinhado verticalmente. (Você pode assumir que os números do meio sempre terão dois dígitos.)
As células circundantes incluem diagonais. Portanto, cada quadrado de soma terá oito números ao seu redor, que você deve adicionar.
O código mais curto vence, pois esse é o código-golfe .
fonte
Respostas:
APL,
53 49 43 42 40 3936Consegui replicar J's
;.
no APL e usei a abordagem de Gareth , economizando 13 caracteres.Exemplo de execução:
Explicação:
∘.∨⍨9⍴0 1
gera uma máscara de bit.×∘?∘9¨
multiplica cada bit por um valor aleatório de 1 a 9 inclusive, gerando uma grade mascarada de números aleatórios.3,⌿3,/
usa o que só pode ser descrito como hackery para retornar todas as caixas sobrepostas de 3 por 3 na matriz mascarada. Eles também são achatados no processo.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
itera sobre a matriz, atribuindo cada elemento a⍵
. Para cada iteração, leva o quinto (meio, lembrando que a indexação APL é baseada em 1) e retorna seu sinal. Nesse caso, isso é equivalente a testar se o número é maior que 0. Se isso retornar 1 (para verdadeiro), retorne esse elemento. Caso contrário, retorne a soma dos elementos na caixa achatada 3 por 3. Ele usa o:⋄
operador ternário, que é equivalente?:
em muitos idiomas.fonte
J,
63615955525149473937 caracteresCom agradecimentos a Volatilidade por sua poupança de 10 caracteres.
Explicação (cada etapa terá diferentes números aleatórios ...):
Gere a máscara para gerar os números aleatórios (usa
$
:Agora temos um gancho . Este é realmente um acidente feliz de quando eu estava baixando uma versão anterior. Era para transpor
|:
e OU+.
com o original. Fazia sentido desde que eu estava usando uns e zeros na época, mas agora tenho nove e zeros. Acontece que funciona da mesma maneira com o significado de GCD+.
. Sorte minha. :-)Então, agora que temos uma grade de 9 e 0, queremos gerar alguns números aleatórios.
?
gera um número aleatório de 0 até (mas não incluindo) um determinado número. Dada uma lista, ela gerará um número aleatório dessa maneira para cada membro da lista. Portanto, nesse caso, ele gerará um número de 0 a 8 para cada 9 na tabela e um número de ponto flutuante de 0 a 1 para cada 0.Mas queremos números de 1 a 9 e não de 0 a 8. Portanto, adicionamos 1.
Isso é muito bom, mas perdemos os zeros que eu quero, então vamos multiplicá-lo pela máscara original depois de transformar todos os noves em um. I fazer isso verificando se o valor for maior que 1. Isso nos dá:
(1&<*1+?)
.Há algumas coisas acontecendo aqui:
&
) o 1 ao<
verbo.Então, tudo combinado
(1&<*1+?)
é gerar números aleatórios e zerar todos os números que foram gerados por zeros na grade original.A próxima parte é a (na minha opinião, de qualquer maneira :-) parte inteligente.
O
;.
verbo recortar possui um formuláriox u;._3 y
que corta a entrada nas caixas descritas porx
e, em seguida, aplica o verbou
a elas. Neste caso, temos3 3(4&{++/*0=4&{)@,;._3
.3 3
está descrevendo as caixas que queremos - 3x3.(4&{++/*0=4&{)@,
é um trem de verbos que descreve o que queremos fazer em cada caixa.Para demonstrar o
;.
verbo que vou usar<
para mostrar cada caixa:Algumas coisas a serem observadas:
0
no centro da caixa.Agora só precisamos passar o valor no centro das costas (se não for zero) ou somar os números na caixa 3x3 (se o centro for zero).
Para fazer isso, precisamos de fácil acesso ao número do centro.
,
ajuda aqui. Transforma a grade 3x3 em uma lista de 9 itens com o número do centro no número 4.4&{
usará{
para tirar o valor central e, em seguida, compará-lo com 0:0=4&{
. Isso retorna a0
ou1
para verdadeiro ou falso, que depois multiplicamos pela soma+/
. Se fosse zero no centro, agora temos nossa soma, conforme necessário. Se não fosse, não temos zero; portanto, para finalizar, basta adicionar o valor central4&{+
.Isso dá o trem verbal
(4&{++/*0=4&{)@,
fonte
?
. Vou mudar a explicação para refletir a versão mais recente.Ruby (135 caracteres)
Saída de amostra
Demolir
Não é muito óbvio como isso funciona, então aqui está um rápido resumo. NOTA: você provavelmente pode pular algumas dessas etapas e pular para versões mais curtas mais rapidamente, mas acho que é educativo o suficiente para ver as diferentes maneiras em que raspei os caracteres, principalmente identificando padrões em literais para transformar números de 2 dígitos em versões de 1 dígito .
Versão ingênua
Diferente das outras soluções Ruby que dependem de uma matriz bidimensional, você pode (eventualmente) obter uma versão mais curta iniciando com uma matriz unidimensional e trabalhando com valores de deslocamento, uma vez que os padrões se repetem.
O princípio chave aqui é que estamos trabalhando nas posições 8, 10, 12 do índice, apenas compensadas por múltiplos de 14. As posições 8, 10 e 12 são os centros das grades 3x3 que estamos resumindo. Na saída de amostra, 34 é a posição 8, 42 é a posição 8 + 14 * 1, etc. Substituímos a posição 8 por 34 por posições deslocadas da posição 8 por
[-8,-7,-6,-1,1,6,7,8]
- em outras palavras34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Esse mesmo princípio vale para todos os valores de[8 + 14*i, 10 + 14*i, 12 + 14*i]
, uma vez que o padrão se repete.Otimizando
Primeiro, algumas otimizações rápidas:
3.times { ... }
, e calcularj + 14*i
cada vez, "inline" as posições[8,10,12,22,24,26,36,38,40]
.offsets
matriz é usada uma vez, portanto substitua a variável pelo literal.do ... end
por{...}
e alterne a impressão para$> << foo
. (Há um truque aqui envolvendoputs nil
e() == nil
.)O código depois disso tem 177 caracteres:
Para a próxima redução, observe que
inject
não é necessário que a matriz de compensações esteja em ordem. Podemos ter[-8,-7,-6,-1,1,6,7,8]
ou alguma outra ordem, pois a adição é comutativa.Então, primeiro emparelhe os pontos positivos e negativos de obter
[1,-1,6,-6,7,-7,8,-8]
.Agora você pode encurtar
para
Isto resulta em
que tem 176 caracteres.
Mude para 8 e mude para diferenças
Os valores literais de dois caracteres parecem que podem ser reduzidos, então pegue
[8,10,12,22,24,26,36,38,40]
e mude tudo8
, atualizandoj
no início do loop. (Observe que+=8
evita a necessidade de atualizar os valores de deslocamento de1,6,7,8
.)Isso é 179, que é maior, mas
j+=8
pode realmente ser removido.Primeira mudança
para uma variedade de diferenças:
e adicione cumulativamente esses valores a uma inicial
j=8
. Isso acabará por cobrir os mesmos valores. (Nós provavelmente poderíamos pular direto para isso, em vez de mudar para 8 primeiro.)Note que nós também vamos adicionar um valor fictício de
9999
ao final da matriz diferenças, e adicionarj
no final , não o início do loop. A justificativa é que2,2,10,2,2,10,2,2
parece muito próximo de ser os mesmos 3 números repetidos 3 vezes e calculandoj+difference
no final do loop, o valor final de9999
realmente não afetará a saída, pois não há umaa[j]
chamada em que hajaj
algum valor. acabou10000
.Com esse conjunto de diferenças, o
j+=8
agora é apenasj=8
, é claro, pois caso contrário, adicionaríamos repetidamente8
muitos. Também alteramos a variável de bloco dej
paral
.Portanto, como o
9999
elemento não tem efeito na saída, podemos alterá-lo para10
e encurtar a matriz.São 170 caracteres.
Mas agora a
j=8
aparência é um pouco desajeitada e você pode salvar 2 caracteres deslocando[2,2,10]
a tecla 2 para baixo para obter convenientemente um que8
você pode usar para atribuição. Isso também precisaj+=l
se tornarj+=l+2
.São 169 caracteres. Uma maneira geral de espremer 7 caracteres, mas é legal.
Ajustes finais
A
values_at
chamada é realmente redundante e podemos incorporar umaArray#[]
chamada. entãotorna-se
Você também pode identificar que
flat_map
+j+e/j-e
+inject
pode ser reduzido a um somatório mais direto com uma inicial0
na matriz.Isso deixa você com 152 caracteres:
Finalmente:
map.with_index
pode se tornareach_slice
.135 :
fonte
each
commap
um byte.Python, 132
Tecnicamente, isso não satisfaz as regras, porque os últimos dígitos de cada número estão alinhados, e não o primeiro. Mas pensei em compartilhar de qualquer maneira:
Saída de amostra:
fonte
Mathematica, 108
Para uma saída mais bonita,
Column/@
pode ser substituída porTableForm@
um custo de 2 caracteres.fonte
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
fornece uma saída mais limpa e salva alguns caracteres se você contar Transpose como um único caractere, que é o Mathmatica. Aliás, o modelo OneLinerSubmission da Wolfram contava 106 caracteres, 105 com o caractere Transpose.:>
ser um símbolo, embora esteja na área de uso privado do unicode. Pode-se até remover a transposição, já que a regra de soma da validade se mantém mesmo após a transposição. Mas parece queGrid
não se alinha as entradas sem outras opções (V8)Grid
centraliza os números nas colunas. Tecnicamente, isso não satisfaria o desafio, mas parece melhor do que ter uma lista aparecendo na tabela exibida.Part
eTuples
. Postando em breve.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: contém uma guia literal, que Markdown pode muito bem quebrar.
O mais inteligente é devido a Gareth: veja sua solução em J.
Demonstração online
fonte
R: 114 caracteres
A primeira linha cria uma matriz 7 por 7 preenchida com números escolhidos aleatoriamente de 1 a 9 (distribuição uniforme com substituição, portanto,
r=T
significareplace=TRUE
). Segunda linha, calcule somas de 3 por 3 grades, subtraia o centro e substitua-o pelo resultado. A terceira linha imprime a grade resultante (por padrão, as colunas matriz e matriz estão alinhadas à direita).Exemplo de saída:
fonte
J,
6765 bytesUma solução ingênua e detalhada em J. É uma implementação direta da tarefa.
Primeiro, crio uma matriz 7 x 7 de números inteiros entre 1 e 9. De fato, os J's? verbo gera números até seu argumento, é por isso que precisamos incrementar cada elemento,>: em J
Eu preparo uma máscara para ser usada para zerar as células de linha / coluna ímpares, um par de índices de linha / coluna ímpares:
O verbo Catálogo {combina itens dos átomos dentro da lista em caixa
para formar um catálogo, a tabela 3x3 dos pares acima
Em seguida, preparo uma tabela de índices de linha / coluna a serem usados para a seleção de cada um dos sub-arranjos 3x3.
Para cada par na matriz m, faço um par de trigêmeos, centralizados em torno de cada número do par m:
Esses pares de trigêmeos são usados pelo verbo J From {, que pode selecionar várias linhas e colunas simultaneamente. 0 1 2/2 3 4 significa que seleciono as linhas 0, 1 e 2 juntamente com as colunas 2, 3 e 4, selecionando assim o segundo subarray 3x3 na parte superior.
Finalmente, posso usar a matriz 7x7 e as máscaras para realizar a tarefa: Primeiro, uso m como máscara para definir os elementos correspondentes como 0:
Então pego todas as sub-matrizes 3x3 usando s como seletor e encontro suas somas:
Então eu coloquei esses números de volta na matriz inicial.
Experimente online!
fonte
APL (Dyalog Unicode) ,
323130 bytes SBCS-1 byte graças a @jslip
Experimente online!
fonte
∧/¨~
->⍱/¨
Ruby, 207
Apresentarei minha solução primeiro (como sempre faço):
fonte
Ruby, 150 caracteres
se a justificação do requisito de justificativa à esquerda for justamente isso
ljust
teria que ser usado ... bem, não. Eu amo os recursos de formatação do Ruby.Não use
Array.new(7){...}
.(0..6).map{...}
é mais curto e mais legível e você obtém um intervalo atribuível gratuitamente.Linha 3 inspirada na solução da Maçaneta da porta .
fonte
GolfScript, 87 caracteres
Existem muitos zíperes lá ... (veja online )
fonte
J, 58/64/67 caracteres
Embora a especificação exija que os números sejam alinhados à esquerda, não há necessidade de usar a notação decimal, então acho que essa é uma saída válida:
Se o alinhamento à direita em vez de o alinhamento à esquerda for aceitável, estamos com 58 caracteres
J's
":
(formato) possui três modos de formatação:O mais detalhado, mas também o mais versátil, e o único capaz de produzir a saída conforme o exemplo é a
8!:2
formatação estrangeira, que usa uma sequência de formatação como argumento à esquerda. Também 67 caracteres :Aqui está o formato em caixa:
fonte
Perl, 117 caracteres
Este é um daqueles scripts Perl em que todos, exceto um dos loops for, foram recolhidos
map
chamadas para que tudo possa ser feito em uma única instrução. Variáveis globais também fazem algumas aparências importantes nesta. Acho que o que estou tentando dizer aqui é que este programa é um pouco grosseiro.Espere, fica pior: há um bug conhecido no script! Porém, ele tem menos de uma chance em um milhão de ser acionado, por isso ainda não resolvi.
fonte
Mathematica , 106/100
Eu vim com algo muito semelhante ao código do ssch, antes de vê-lo. Estou emprestando sua ideia de usar
Column
. Somente com ASCII, 106 :Com caracteres Unicode (conforme usado pelo ssch), 100 :
fonte
Excel VBA, 74 bytes
Função imediata VBE que gera saída para
[B2:H9]
.Saída de amostra
fonte
Powershell,
149148 bytes-1 byte graças a @AdmBorkBork. É legal!
Explicação:
fonte
$a
tarefa em parênteses e movendo a próxima linha para formar uma grande linha($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Então, aqui estão duas etapas. Eu tive várias tentativas de encapsular em um tubo. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
é totalmente preenchido antes da próxima instância do pipeline. Deve funcionar (pelo menos, funciona para mim).Mathematica
142 151 172179Código
Uso
fonte
0
s; as regras dizem 1-9Julia 0,6 , 127 (89) bytes
Experimente online!
89 bytes usando a exibição nativa, que pode ser admissível se linhas adicionais puderem ser impressas:
fonte
Java 10,
262260248239 bytes-12 bytes graças a @ceilingcat .
Explicação:
Experimente aqui.
fonte
var
em vez deString
e+=Math.random()*9+1;
em vez de=(int)(Math.random()*9+1);
. Na verdade, é muito útil você visitar todas as minhas respostas antigas, haha! : D