Objetivo
Tenho uma bela foto que quero pendurar na parede. E eu quero que ele fique pendurado lá de uma maneira espetacular, então eu escolhi pendurá-lo nas n
unhas onde n
houver um número inteiro positivo.
Mas também sou indeciso, por isso, se mudar de idéia, não quero muitos problemas para tirar a foto. Portanto, remover qualquer uma das n
unhas deve fazer a imagem cair. Eu mencionei que não há atrito na minha casa?
Pode me ajudar?
Regras
- Seu programa deve ler o número
n
de stdin e imprimir em stdout (ou equivalentes do seu idioma). - A saída deve ser a solução de acordo com a especificação de saída sem nenhum outro caractere inicial ou final. No entanto, espaços em branco à direita e / ou novas linhas são aceitáveis.
- Você deve usar exatamente as
n
unhas. - Assumindo um mundo sem atritos, sua solução deve atender às seguintes condições:
- Pendurando a imagem conforme descrito pela sua solução, a imagem não deve cair.
- Se qualquer uma das unhas for removida, a imagem deverá cair.
- Aplicam-se brechas padrão. Em particular, você não pode fazer solicitações, por exemplo, ao programa de verificação para soluções de força bruta.
Observe que 4.2 já implica que todas as n
unhas devem estar envolvidas.
Especificação de saída
- Todas as unhas são nomeadas da esquerda para a direita com a posição em que estão, começando em
1
. - Existem duas maneiras fundamentais de colocar a corda em torno de um prego: no sentido horário e anti-horário. Denotamos um passo no sentido horário com
>
e um passo no sentido anti-horário com<
. - Toda vez que a corda é colocada em torno de uma unha, ela sai por cima das unhas; portanto, pular as unhas significa que ela passará pela parte superior das unhas intermediárias.
- Toda solução deve começar na unha
1
e terminar na unhan
. - A saída deve consistir em uma sequência de etapas em que uma etapa é uma combinação do nome da unha e a direção na qual colocar a corda em torno dela.
Saída de exemplo
Aqui está um exemplo de saída para n=5
e n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
E aqui está uma representação visual da solução incorreta para n=5
(awsumz gimp skillz)
A solução correta para n=1
é simplesmente 1>
ou 1<
. Para unhas múltiplas, pode haver soluções diferentes. Você só deve produzir um, pois isso faz parte da sua pontuação.
Verificação
Você pode verificar se uma solução está correta aqui: www.airblader.de/verify.php .
Ele usa uma solicitação GET, para que você possa chamá-la diretamente, se desejar. Por exemplo, se foo
é um arquivo que contém uma solução em cada linha, você pode usar
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Se você acredita que uma solução está correta, mas o verificador a marcar como incorreta, informe-me!
Edit: E se a sua saída for tão longa que uma solicitação GET não for cortada, avise-me e eu farei uma versão da solicitação POST. :)
Pontuação
Isso é código-golfe. A pontuação é o número de bytes do seu código-fonte na codificação UTF-8, por exemplo, use esta ferramenta . No entanto, há um bônus potencial para cada envio:
Execute seu programa para todos n
no intervalo [1..20]
e adicione o comprimento de todas as saídas para determinar sua pontuação de saída . Subtraia sua pontuação de saída 6291370
para obter o número de pontos de bônus que você pode deduzir da sua contagem de bytes para obter sua pontuação geral . Não há penalidade se sua pontuação de saída for maior que esse número.
A finalização com a menor pontuação geral vence. No caso improvável de empate, os desempates estão nesta ordem: pontos de bônus mais altos, menor contagem de bytes, data de envio anterior.
Por favor, publique as partes individuais (contagem de bytes, pontos de bônus) da pontuação e a pontuação final, por exemplo, " LOLCODE (44 - 5 = 39)
".
1>
é desenhado na figura). E não hán
onde nenhuma solução seja possível. Uma solução válida paran=2
é1>2<1<2>
.Respostas:
GolfScript (
5167 bytes + (73107150 - 6.291.370) = -6.284.153)Isso se baseia na construção do comutador recursivo de Chris Lusby Taylor , mais bem explicada em Picture-Hanging Puzzles , Demaine et al., Theory of Computing Systems 54 (4): 531-550 (2014).
Saídas para as primeiras 20 entradas:
NB: Eu acho que as respostas mais longas falharão no teste on-line porque ele usa
GET
e nãoPOST
URLs que não garantem que sejam manipulados corretamente se tiverem mais de 255 caracteres.Existem dois ajustes na construção padrão:
[x_1, x_2^-1]
vez de[x_1, x_2]
.* Nenhuma relação, até onde eu saiba.
** Bem, dentro da mesma abordagem de comutador recursivo. Não estou afirmando ter resolvido o problema aberto de provar que é o ideal.
fonte
Python 2 (208 bytes + (7230 - 6.291.370) = -6.283.932)
A função
f
responde recursivamente combinando meias soluções, pois A ^ {- 1} * B ^ {- 1} * A * B representa inversos por negação.f(a,b)
é uma solução para os números no intervalo semiaberto[a,b)
.Editar: para cumprir o requisito de começar
1
e terminarn
, eu inverti a ordem para sempre terminarn
usando intervalos invertidos e simplesmente anexá"1<1>"
-la ao início.Editar : salvou 136 símbolos na saída, arredondando o caminho inverso nos intervalos de separação, fazendo com que os intervalos com números maiores (e com mais probabilidade de ter dois dígitos) sejam mais curtos.
Editar : salvou 100 símbolos dividindo os intervalos de maneira desigual, para que aquele com números maiores seja menor. Isso não aumenta o número de operações usadas, desde que os comprimentos nunca cruzem potências de 2.
Editar : Arredondamento favorável reintroduzido, -50 símbolos, 2 + caracteres de código.
Saídas de 1 a 20:
fonte
n>n<
então.n=1
solução agora. Trabalhando nela)C - (199 bytes - 0) = 199
Com quebras de linha:
Provavelmente um algoritmo bastante ingênuo, já que eu não sei muito sobre teoria dos nós. Basicamente, apenas adiciona o próximo número mais alto e depois inverte todo o conjunto de instruções para desenrolá-lo. Isso provavelmente seria muito mais conciso em uma linguagem que lida com conjuntos melhor ...
O comprimento total da saída
n
no intervalo[1..20]
foi de 6.291.370 bytes de saída (3.145.685 instruções). Este foi grande o suficiente que eu só postou saídas de exemplo paran
na faixa[1..10]
.fonte
6,291,370
é exatamente o número correto que eu queria postar. Eu acidentalmente publiquei apenas o número den=20
, e não a soma de todos. Vou ter que pôr em marcha[1..10]
.199 + 0 = 199
.