fundo
Esta é uma continuação do meu desafio anterior , em que a tarefa era calcular a forma de uma escultura obtida pela queda de ímãs em uma pilha enorme.
Boas notícias: o artista excêntrico gostou do seu trabalho e tem outro projeto para você. Ele ainda trabalha com esculturas magnéticas, mas decidiu expandir seu estúdio de arte - para o espaço ! Seu método atual é lançar um único ímã em forma de cubo na órbita e disparar outros ímãs para criar um enorme satélite magnético.
Entrada
Sua entrada é uma lista finita de 0
s e1
s, fornecida no formato de lista nativa do seu idioma ou em uma string. É interpretado como um "modelo" de uma obra de arte e é processado da esquerda para a direita, da seguinte maneira.
Você começa com um único ímã flutuando em alguma coordenada inteira do plano 2D e continua adicionando mais ímãs conforme as diretivas. A diretiva 0
gira a escultura inteira 90 graus no sentido anti-horário. No caso da diretiva 1
, o artista encontra a coluna mais à esquerda da escultura e lança um novo ímã por baixo. O novo ímã adere ao ímã mais baixo existente na coluna e se torna parte da escultura. Observe que o ímã não adere a outros ímãs na coluna vizinha, ao contrário do desafio anterior; sua velocidade agora é astronômica!
Resultado
O artista quer saber se a escultura completa caberá em sua garagem (como ele será retirado da órbita ainda não está claro). Assim, sua saída é a largura e a altura da escultura, ordenadas de menor para maior. Eles podem ser fornecidos como uma lista de dois elementos, um par ou como uma sequência separada por vírgula.
Exemplo
Considere a sequência de entrada
[1,0,1,1,0,1,0,0,1,1]
Para processá-lo, começamos com um ímã flutuando no espaço:
#
A primeira diretiva é 1
, então filmamos um novo ímã a partir de baixo:
#
#
A próxima diretiva é 0
, então giramos a escultura:
##
As próximas duas diretrizes são 1,1
, o que significa que atiraremos dois ímãs na coluna mais à esquerda:
##
#
#
Em seguida, giramos novamente e disparamos uma vez, conforme indicado por 0,1
:
#
###
#
Finalmente, giramos duas vezes e filmamos duas vezes:
#
###
# #
#
A escultura resultante tem largura 3
e altura 4
, então produzimos [3,4]
.
Regras
Você pode atribuir uma função ou um programa completo. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
[1,0,1] -> [2,2]
[1,0,1,1,0,1,0,0,1,1] -> [3,4]
[1,1,0,1,1,0,1,0,1,1] -> [4,5]
[1,1,0,1,1,0,1,0,1,1,0] -> [4,5]
[1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1] -> [3,3]
[0,1,0,1,1,1,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1] -> [5,7]
[1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0] -> [11,12]
[1,1,0,1,1,0,1,0,1,1,0]
voltar[5,4]
e não[4,5]
? A escultura é girada no final.Respostas:
Pitão :
3433 bytesEntrada é uma lista de uns e zeros, como na pergunta. Experimente online: Pyth Compiler / Executor
Explicação:
É uma tradução individual dos seguintes código Python 2 ( 126 bytes ).
Eu crio uma lista de coordenadas dos ímãs únicos. Isso é inicializado com o ímã
[0,0]
. Então, para cada um dos números inteiros do blueprint, manipulo a lista da seguinte maneira. Se o próximo número inteiro for0
, eu giro a escultura alterando as coordenadas de cada ímã[a,b]
para[-b,a]
(basicamente multiplicando por uma matriz de rotação). Se o próximo número inteiro for a1
, procuro a peça mínima[a,b]
(que é automaticamente o ímã mais baixo da coluna mais à esquerda) e anexo o ímã[a,b-1]
à lista.Depois que toda a entrada é processada, crio 2 conjuntos (para remover duplicatas), um para os valores x e outro para os valores y, e imprimo os tamanhos deles na ordem de classificação.
Uma idéia para aperfeiçoar : Usar números complexos como cordas para os ímãs. Uma rotação é apenas uma multiplicação
j
e subtraçãoj
do ímã mais baixo na coluna mais à esquerda. Infelizmente, encontrar esse ímã mais baixo à esquerda exige muitos caracteres em Python, nem mesmo falar em encontrar o retângulo.fonte
CJam, 48 bytes
Teste aqui.
Espera entrada como uma matriz no estilo CJam (ou seja, espaços em vez de vírgulas) e apresentará a saída da mesma forma. Se você deseja usar os casos de teste da pergunta diretamente, copie-os diretamente para o campo de entrada (inclua os
->
resultados e) e use este equipamento de teste, que converte as linhas no formato de entrada correto (e descarta os resultados):Explicação
Estou apenas implementando as regras literalmente. Estou mantendo uma grade com a escultura atual (como uma matriz de seqüências de caracteres) e, em seguida, para cada instrução eu giro a grade ou adiciono um novo bloco. Os principais truques para salvar bytes são:
S
eN
eu tenho acesso a strings contendo o espaço e o caractere de nova linha (ou seja, o caractere envolvido em uma matriz), em vez de ter que usar, digamos,1a
e0a
obter uma matriz contendo um número.Vamos analisar o código:
fonte
Matlab (92)
Entrada padrão é usada. Os dados devem ser introduzidos no formulário
[1,0,1,1,0,1,0,0,1,1]
.Ungolfed:
Exemplo de execução:
fonte
Python - 211
fonte
[1]
.CJam, 47 bytes
Isso recebe a entrada de matriz com estilo CJam (espaço separado em vez de vírgula) de STDIN e imprime o resultado em STDOUT.
Exemplo:
dá
resultado.
Explicações a seguir depois que estou convencido de que isso não pode ser jogado mais.
Experimente online aqui
fonte