Mash Up Time!
Esta é a parte 5 da minha série Random Golf of the Day e ASCII Art of the Day da Optimizer . Seus envios neste desafio contarão para os dois placares de líderes (que você pode encontrar nas postagens vinculadas). Obviamente, você pode tratar isso como qualquer outro desafio de golfe com código e respondê-lo sem se preocupar com nenhuma das duas séries.
Buraco 5: Diamond Tilings
Um hexágono regular sempre pode ser revestido com diamantes da seguinte forma:
Usaremos uma representação artística ASCII dessas inclinações. Para um hexágono de comprimento lateral 2, existem 20 tais inclinações:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Dado um comprimento lateral N
, você deve gerar esse ladrilho para um hexágono de comprimento lateral N
aleatoriamente. A distribuição exata não importa, mas cada lado a lado deve ser retornado com probabilidade diferente de zero.
Pois N ≤ 4
, sua submissão deve produzir um ladrilho dentro de 1 minuto, pelo menos, 80% do tempo e pelo menos 80% das inclinações devem ser potencialmente gerados em 1 minuto. A maioria das abordagens não precisa se preocupar com essa regra (é muito branda) - isso é apenas para descartar algoritmos baseados em rejeição muito ingênuos que geram seqüências arbitrárias até que uma delas seja um ladrilho.
Talvez você queira saber que o número total de possíveis inclinações para um determinado N pode ser encontrado no OEIS A008793 .
Você pode escrever um programa completo ou uma função e obter entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e produzir saída via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você não deve gerar mais espaços iniciais do que o necessário para alinhar o hexágono (que é o canto esquerdo do hexágono não deve ter espaços na frente). Cada linha pode conter até N
espaços à direita (não necessariamente de forma consistente, para que você possa, por exemplo, ter uma saída retangular, imprimindo a caixa delimitadora do hexágono).
Isso é código de golfe, então a submissão mais curta (em bytes) vence. E, é claro, o menor envio por usuário também entrará na tabela geral de líderes da série.
Classificação
A primeira postagem de cada série gera uma tabela de classificação.
Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(O idioma não é exibido no momento, mas o snippet exige e o analisa, e posso adicionar um cabeçalho por idioma no futuro.)
For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.
muito fácil: 80% do tempo o mesmo, ladrilhos básico, caso contrário eu encontrar outro lado a lado em qualquer hora que eu quiserRespostas:
CJam, 105 bytes
Nova linha adicionada para evitar a rolagem. Experimente online
Explicação:
Essa solução inicia cada linha como um zigue-zague e, em seguida, coloca N sublinhados, com base em sua posição na linha anterior e em algumas regras. Eu obtive isso de uma série de observações enquanto olhava para a saída como uma matriz 2D simples de caracteres:
/\
em zigue-zague com repetição perfeita ( na metade superior,\/
na metade inferior)/_/
só pode mudar por -1 ou 0 e\_\
só pode mudar por 0 ou 1"_ "
padrão ou um" _"
padrão, ambos são bonsEntão, decidi implementá-lo mantendo as posições sublinhadas anteriores, modificando-as com um fator aleatório (2 opções para cada sublinhado) e repetindo até que as regras sejam satisfeitas. No processo de otimização, mudei para as posições sublinhadas em relação ao lado esquerdo do hexágono (sem incluir espaços).
Versão "3D" antiga, 189 bytes:
Experimente online
fonte
Python 2,
337335324318311300296 bytesA idéia é criar primeiro um hexágono de diamantes, assim:
E, em seguida, preencha-o com caminhos descendentes de sublinhados, assim:
O resultado final com todos os caminhos adicionados ficaria assim:
É necessário um pouco de código para garantir que esses caminhos não saiam dos limites ou se cruzem.
O código não destruído:
fonte
randint(0,1)*(p<n*3+i*2-j)
pararandint(0,p<n*3+i*2-j)
.Perl,
174 168 166161Experimente- me .
fonte
JavaScript ( ES6 ), 376
416494Só para estar lá ...
Isso cria todas as inclinações e depois escolhe uma aleatória. A hora das 232848 inclinações para N = 4 é de ~ 45 segundos no meu laptop. Eu não tentei N = 5.
Sendo o EcmaScript 6, ele roda apenas no Firefox.
fonte
dom.max_script_run_time
. É uma preferência global em about: config, a mina está definido para 30.SmileBASIC, 241 bytes
Fortemente baseado na resposta de Matty
fonte