O jogo de tabuleiro
No jogo de tabuleiro " Carcassonne ", os jogadores colocam peças combinando suas bordas e obtêm as pontuações mais altas criando grandes áreas contíguas do terreno. A seguir, são (aproximadamente) os tipos e quantidades de peças incluídas no jogo:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
A tarefa
Você deve colocar um ladrilho combinando com as arestas, enquanto tenta manter as maiores áreas contíguas possíveis do terreno.
Canal
- As peças podem ser colocadas apenas em um dos (até 4) espaços em branco adjacentes a qualquer peça (ou peça) existente na área de recreação.
- Os ladrilhos podem ser girados 90, 180 ou 270 graus.
Correspondência de arestas
- As arestas de um ladrilho colocado devem corresponder às arestas tocantes dos (até 4) ladrilhos vizinhos, ou seja, os pixels tocantes são da mesma cor.
Terreno contíguo
- "Fechar uma área do terreno" refere-se à colocação de um ladrilho de forma que qualquer área contígua de cor não possa ser continuada com mais posicionamentos de ladrilho.
- Se um posicionamento alternativo for possível, ele deverá ser escolhido sobre qualquer posicionamento de ladrilho que feche uma área do terreno.
- Se você precisar escolher entre vários canais de fechamento, escolha um. Se você precisar escolher entre vários canais sem fechamento, escolha qualquer.
- Desconsidere # ff00ff (os pixels de canto) ao calcular áreas contíguas. Também desconsidere edifícios, ou seja, áreas de cores já totalmente fechadas dentro de um ladrilho.
Entrada
A entrada possui duas imagens:
A área de recreação.
- A área de reprodução inicial consiste em bloco
#11
(um bloco único). - A área de reprodução aumentada criada como saída também deve ser suportada como entrada.
- A área de reprodução inicial consiste em bloco
O ladrilho a ser colocado.
- Todos os blocos de exemplo devem ser suportados como entrada.
Determine arestas correspondentes / terreno contíguo usando apenas esses dados de imagem. Sem codificação.
Saída
- Saída é uma imagem que mostra a área de reprodução resultante após a colocação do ladrilho.
- A imagem deve ser compatível com o seu próprio programa, ou seja, pode ser usada como entrada na área de reprodução.
- Se for impossível colocar um bloco, retorne um erro.
Você pode assumir que
- As peças são sempre 55 px por 55 px
- Os ladrilhos apenas apresentam as cores usadas atualmente nos ladrilhos de exemplo.
Notas
- Sua resposta deve apresentar exemplo de saída após pelo menos 2 passagens (mais é incentivado).
- Esta é uma renderização parcial e imprecisa do jogo de tabuleiro original. Você não precisa aplicar nenhuma das regras ou táticas não mencionadas aqui.
Ponto
- Sua pontuação é a contagem de bytes do seu envio.
- Os dados da imagem não estão incluídos na sua pontuação.
- Menor pontuação ganha.
Jogando um jogo completo
Você pode escrever um script que use sua submissão para jogar um jogo completo, que pode consistir em:
- Colocando um bloco escolhido pseudo-aleatoriamente do conjunto completo de 85.
- Retornando o bloco ao conjunto, se não puder ser colocado.
- Repetindo até que cada peça tenha sido colocada - ou até que duas peças seguidas não possam ser colocadas.
Ele não será incluído na sua contagem de bytes ou melhorará sua pontuação, mas provavelmente vou oferecer uma recompensa para esse tipo de resposta.
Respostas:
Perl 5 com PerlMagick:
875 789763Não contei a linha inicial
sub w
, que é usada para classificar as posições à distância do centro para preferir soluções compactas (agora funcionando corretamente). Nesta versão, o fechamento é evitado como solicitado, mas acho o oposto mais interessante e fiel ao jogo. Para conseguir isso, mude a linha$s=$t if!grep...
para$s=$t if grep...
.Uso:
perl car.pl board.png tile.png
. Resultado armazenado emcar.png
. O status de saída é 1 se o bloco não puder ser colocado.Script para executar um jogo completo. Ele assume que o código acima está no arquivo
car.pl
e os blocos são armazenados notiles
diretório denominado01.png
para25.png
.Isso corre bem devagar agora. 8-12 minutos na minha máquina. Com fechamento preferido: Com fechamento evitado (observe que nada está fechado).
fonte
Common Lisp,
26502221199211861111 bytesAtualização: O golfe "fácil" agora está pronto, mais ganhos exigirão mudanças maiores.Atualização 2: Com a competição cada vez mais acirrada, a nova versão não favorece mais as posições dentro do atual retângulo do campo de jogo (isso seria 57 bytes extra). Essa opção, além de uma simples otimização de velocidade, é ativada por padrão na versão para download com o simulador, mas não na resposta oficial abaixo.Atualização 3: Pequenas alterações na interface para maiores ganhos na contagem de bytes.
Também criei uma interface da Web simples. O pacote completo (um único arquivo LISP e as imagens em bloco) pode ser baixado aqui . Para experimentá-lo, instale e
hunchentoot
, com o quiclisp, carregue e conecte-se a . O código foi testado no CCL / Windows e SBCL / Linux. As bibliotecas mencionadas acima são necessárias apenas para a parte da interface do usuário / simulador; a solução em si é simples ANSI Common Lisp.zpng
png-read
carcassonne.lisp
localhost:8080
Todos os feeds de linha e espaçamento inicial são apenas para cosméticos, para garantir a legibilidade e não são contabilizados na soma total.
Você deve chamar a função
c
com dois argumentos: o campo de jogo atual e o bloco a ser colocado. Ambos devem ser matrizes 2D; o bloco 55x55 e o campo um múltiplo disso. Além disso, a matriz de campos deve ser ajustável. A função retorna uma lista de dois elementos com o novo campo como seu primeiro argumento. O segundo elemento éNIL
se o bloco não puder ser colocado ou uma lista contendo as coordenadas no canto superior esquerdo e a rotação do bloco mais recente nessa matriz e a pontuação desse bloco. Esta informação pode ser usada para fins de visualização.Observe que em outras chamadas, você deve usar o novo campo retornado,
c
mesmo que o segundo elemento da lista sejaNIL
(a matriz original pode ter sidoadjust-array
ed e, portanto, invalidada).O código agora está um pouco lento, otimizando a contagem de bytes, resultando em cálculos redundantes. O exemplo abaixo foi concluído em cerca de três minutos no meu sistema.
Exemplo de execução para todos os 85 blocos:
Captura de tela da interface do usuário da Web:
fonte
DarkBASIC Pro:
207819321744 bytesATUALIZAÇÃO: Apenas mais esforço no golfe
ATUALIZAÇÃO: agora atende plenamente às especificações, incluindo a escolha de opções sem fechamento.
Eu escolhi o DarkBASIC porque, embora seja bastante detalhado, fornece um conjunto de comandos extremamente direto e simples para manipular imagens.
Fiz upload de um EXE para pessoas que não possuem o compilador DarkBASIC ( Windows ).
fonte