Introdução
A Aritmética Gaol é uma instalação especial que aprisiona números inteiros positivos. No entanto, recentemente, os números inteiros positivos têm tentado escapar. Portanto, os guardas decidiram, um, eliminar alguns dos números inteiros positivos para enviar uma mensagem para os outros números inteiros. Eles contrataram um engenheiro de software para escrever um programa para descobrir quais números inteiros eliminar para obter o máximo efeito.
Descrição da entrada
A entrada é fornecida via STDIN, argumentos de linha de comando ou uma função de entrada do usuário (como raw_input
). Você não pode tê-lo como argumento de função ou variável pré-inicializada (por exemplo, este programa espera entrada em uma variável x
).
A primeira linha de entrada contém um único número inteiro positivo em n
que 8 >= n >= 3
. A seguir, são n
linhas que contêm n
caracteres do conjunto [1,2,3,4,5,6,7,8,9]
. Aqui está um exemplo de entrada:
5
22332
46351
65455
24463
65652
Descrição da saída
Os guardas gostariam de eliminar números para que as seguintes condições sejam atendidas:
- Em cada linha e coluna da grade resultante, nenhum número aparecerá duas vezes;
- Dois números eliminados não podem ser adjacentes na horizontal ou na vertical;
- Os números sobreviventes devem formar um grupo ortogonalmente contíguo - será possível viajar de qualquer número sobrevivente para qualquer outro número sobrevivente, movendo-se apenas horizontal e verticalmente e nunca cruzando nenhum número eliminado.
Saída de entrada (menos a primeira linha), com os números eliminados substituídos por #
.
Pode haver mais de uma solução. Se for esse o caso, você pode gerar qualquer solução.
Também pode não haver solução. Se for esse o caso, produza a string no answer
.
Aqui está uma saída possível para a entrada de exemplo:
#2#3#
46351
6#4#5
24#63
#56#2
Exemplo de entradas e saídas
Existem várias saídas para cada entrada, portanto, essas saídas são apenas exemplos.
Entrada:
5
46551
51565
32654
14423
43244
Saída:
46#51
#156#
326#4
1#423
#324#
Entrada:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Saída:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Entrada:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Saída:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Entrada:
4
2222
2331
3112
1322
Saída:
no answer
prompt
não permite a entrada de várias linhas.Respostas:
Ruby,
346344329316 bytes, númeroIsso é código-golfe, não código-rápido, então ...
Use-o como:
A sinalização
-W0
não é necessária, mas sugiro que você a adicione para desativar os avisos ou redirecionarstderr
...Diga-me se você teve paciência suficiente para executá-lo nos exemplos de n = 6,7,8
Changelog
each
⇨map
, graças a @NotThatCharlesregexp
s, semelhante ao que o @NotThatCharles sugeriufonte
\d
é mais curto que[^#]
na penúltima linha;M.times.to_a
é maior que(0..M-1).to_a
M.times.to_a
é 1 byte menor que(0..M-1).to_a
;)(0...M).to_a
também funciona e tem o mesmo comprimento.Rubi -
541 ...,394O algoritmo básico é uma pesquisa recursiva aprofundada de duplicatas para selecionar afirmativamente, examinando a linha 1, a coluna 1, a linha 2, etc., e verificando se dois vizinhos não foram mortos e a grade está conectada (essa é a
break if
cláusula em lá, e o pouco que vem antes).Alguns truques legais:
if w[1]
é muito menor do queif !w.one?
e, se você sabe que há pelo menos um membro, é o mesmo resultado.Da mesma forma,
[0]
é mais curto do queany?
se não houver bloco es[j]
é um atalho bonito paraj<s.size
(tecnicamente, é mais comoj.abs<s.size
)E
y%N+(y/N).i
é muito mais curto queComplex(y%N,y/N)
Além disso, quando há duas condicionais complicadas para gerar strings, pode ser mais curto do
[cond1?str1a:str1b,cond2?str2a:str2b]*''
que adicionar todas as parênteses ou#{}
s.Ungolfing e explicação:
(Esta é a versão de 531 bytes. Fiz alterações. Mais notavelmente, já eliminei a chamada para o produto - resolva apenas um dígito por linha / coluna de cada vez, e J agora é apenas uma matriz, indexada por Todas as coordenadas são apenas números inteiros.)
H
calcula vizinhosN
é o tamanho da gradeK
são as chaves do mapa (números complexos)J
é o mapa de entrada (prisão)k
são as chaves não mortasQ
é o principal método recursivoO código é executado com:
Changelog
394 adicionou a sugestão de @ blutorange abaixo e cortou muito mais manipulação
408 produção revisada mais uma vez. Também use em
.min
vez de.inject(:+)
já que estou apenas ocupando uma linha.417 menor cálculo de saída
421 deixaram cair números complexos. Basta usar números inteiros. Salvar um pacote
450 mais melhorias de entrada
456 melhorias de entrada
462 melhorias incrementais - esp.
find
, nãoselect
475 caiu
u
e esmagou o construtor row / col dupe503 resolve apenas um dígito duplicado por linha / coluna por vez.
530 use em
map &:pop
vez devalues
531 retire o lambda que faz a matriz dupes
552 oops! perdeu um requisito
536 população marginalmente melhorada de matriz de burros (o que era anteriormente
d
)541 inicial
fonte
break
podem ser usados em vez dereturn
, podem economizar mais um byte. Eu realmente gosto deste, muitos truques e muito mais rápido.a
é usada apenas uma vez, você pode fazer issoJ=gets(p).split*''
. Você já tentou argumentos cli, veja minha resposta?HTML + JavaScript ( ES6 ) 459
Usando uma área de texto HTML para obter entrada de várias linhas.
Para testar, execute o snippet no Firefox. Aumente a área de texto, se desejar, cole a entrada dentro da área de texto (cuidado: entrada exata, sem espaços extras em qualquer linha) e depois tabule. O resultado é anexado.
Método: um primeiro serarote recursivo de profundidade. Ele encontra soluções não ideais para todos os casos de teste em segundos (é gode golf, mas uma resposta válida deve terminar para casos de teste comuns)
Primeira tentativa
Método: um profundidade serar primeiro, não recursivo, usando uma pilha de usuários.
A função pode ser facilmente transformada em uma pesquisa de largura em primeiro lugar, passando
l.pop
paral.shift
, portanto, usando uma fila em vez de uma pilha, mas é muito lenta e não tenho certeza de que possa encontrar uma solução ideal de qualquer maneira.Mostrar snippet de código
fonte