Aqui está um quebra-cabeça de programação para você:
Dada uma lista de pares de cadeias e números correspondentes, por exemplo [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
, produza outra lista que terá apenas as cadeias da seguinte maneira:
A contagem total de qualquer sequência deve ser exatamente igual ao seu número correspondente nos dados de entrada.
Nenhuma sequência deve ser repetida adjacentemente na sequência e cada sequência deve aparecer na lista de saída.
A seleção da próxima string deve ser feita aleatoriamente, desde que não quebrem acima de duas regras. Cada solução deve ter uma probabilidade diferente de zero de ser escolhida.
Se nenhuma combinação for possível, a saída deve ser justa
0
.
A lista de entrada pode ser fornecida em qualquer ordem (classificada ou não) e as seqüências de caracteres na lista podem ter qualquer comprimento.
Saída de amostra para a entrada de amostra acima 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Amostra de entrada 2:
[[A,6],[B,1],[C,1]]
Saída para segunda entrada:
0
pois nenhuma lista é possível com base em regras.
Entrada de amostra 3:
[[AC,3],[BD,2]]
saída válida: [AC,BD,AC,BD,AC]
saída inválida: [AC,BD,AC,AC,BD]
Se mais esclarecimentos forem necessários, não hesite em me informar nos comentários e eu agirei prontamente.
Isso é código-golfe , então o código mais curto em bytes para cada idioma vence!
Respostas:
Gelatina , 11 bytes
Experimente online!
fonte
Œṙ
não vetorizá-lo, funcionaria sem'
Gelatina , 17 bytes
Experimente online!
fonte
["A", 100], ["B", 3]
, não gera nada que esteja preso, eu acho.Œ!
terá 99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000000000.O(n!)
curta, mas a velocidade não importa. Não tente com nada em que os númerosŒṙ
ajudar?["AT", 3], ["B", 3]
e temTBATATBAB
como saída o que é erradoPython 2 ,
114189185174 bytesExperimente online!
Ai! Muito mais difícil com a regra 3 ... :). Ainda tentando evitar a
O(n!)
abordagem, ele pode lidar com todos os casos de teste algum tempo antes da morte pelo calor do universo ...Algoritmo: suponha que a soma total da contagem de cadeias seja
t
. Se qualquer cadeia tem uma contagemn
com2*n>t+1
, então não é possível satisfazer as restrições. Portanto, se qualquer cadeia (excluindo o previamente escolhido) tem contagemn
com2*n=t+1
, então devemos escolher essa seqüência seguinte. Caso contrário, podemos escolher aleatoriamente qualquer string que não seja a string escolhida anteriormente.fonte
R ,
148141 bytesExperimente online! (Eu copiei
combinat::permn
e chameicombinatXXpermn
lá.)Solução de força bruta O (n!).
Usa
permn
docombinat
pacote para gerar todos os pedidos possíveis. Em seguida, verifica se alguma delas segue as regras e escolhe uma delas aleatoriamente.fonte
n<-sum(n|1)
é um byte mais curto, acredito. Mas a peculiaridade desample
uma entrada de comprimento um é bastante frustrante aqui.JavaScript, 112 bytes
Primeiro passe para isso, mais golfe para (espero) a seguir.
Experimente online
fonte
J,
6053 bytes-7 graças a FrownyFrog
original
destroçado
Sugestões para melhorias são bem-vindas.
Experimente online!
fonte
[:*/2~:/\|:
é dois mais curtoJavaScript (ES6), 160 bytes
Experimente online!
fonte
Carvão , 38 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Repita enquanto houver pelo menos uma contagem diferente de zero.
Encontre qualquer contagem que compõe mais da metade do restante.
Se não houver, faça as contagens diferentes de zero filtradas anteriormente.
Filtre a string que foi exibida na última vez.
Atribua um elemento aleatório do primeiro não vazio das duas listas acima à última cadeia de saída. Observe que, se uma combinação impossível for inserida, o programa falhará neste momento.
Imprima a sequência.
Reduza sua contagem.
fonte
["h4x0r", 1337]
incluído como uma sequência.Rubi , 85 bytes
A abordagem da força bruta (obrigado Jonah pela ideia).
Experimente online!
Ruby ,
108 10096 bytesAnteriormente, a abordagem Bogosort
Experimente online!
fonte
Ferrugem 633 bytes
O que torna isso um pouco diferente dos outros é que ele começou com a idéia de reorganizar as strings simulando um sistema físico. Cada sequência é duplicada primeiro o número apropriado de vezes. Cada sequência individual é tratada como uma partícula em um espaço. Duas partículas com o mesmo valor de cadeia "se repelem", enquanto duas partículas com valores diferentes se atraem. Por exemplo, se começarmos com AAAAAAABBBBCC, o As se revogará, afastando-se um do outro, permitindo que os Bs se movam entre eles. Com o tempo, isso atinge uma boa mistura de partículas. Após cada iteração de 'movimento de partículas', o programa verifica se nenhuma mesma partícula é adjacente, para e imprime o estado do sistema, que é simplesmente a lista de seqüências de caracteres em ordem, como elas aparecem no espaço unidimensional.
Agora, quando se trata de realmente implementar esse sistema físico, ele começou a usar a antiga técnica de jogo / demo para PC, para armazenar cada posição e velocidade de partículas como números, e depois passar por iterações para atualizar a posição e a velocidade. Em cada iteração, estamos adicionando velocidade à posição (movimento) e adicionando aceleração à velocidade (mudança na taxa de movimento) e calculando a aceleração (encontrando a força na partícula). Para simplificar, o sistema não calcula a força em cada partícula com base em todas as outras partículas - apenas verifica as partículas imediatamente adjacentes. Havia também um efeito de 'amortecimento' para que as partículas não acelerassem demais e voassem até o infinito (a velocidade é reduzida em x porcentagem a cada passo, por exemplo).
Através do processo de golfe, no entanto, tudo isso foi reduzido e simplificado drasticamente. Agora, em vez de duas partículas iguais se repelirem, elas simplesmente 'se teletransportam'. Partículas diferentes simplesmente "escorregam" um pouquinho para evitar estagnação no sistema. Por exemplo, se A estiver próximo a A, ele será teleportado. Se A estiver ao lado de B, ele mudará apenas ligeiramente. Em seguida, verifica se as condições são atendidas (sem partículas adjacentes) e imprime as seqüências de caracteres em ordem, com base em sua posição no espaço 1-d. É quase mais um algoritmo de classificação do que uma simulação - então, novamente, é possível ver os algoritmos de classificação como uma forma de 'desvio' simulado com base na 'massa'. Eu discordo.
De qualquer forma, este é um dos meus primeiros programas de ferrugem, então desisti após várias horas de golfe, embora ainda haja oportunidades lá. A parte de análise é difícil para mim. Ele lê a sequência de entrada da entrada padrão. Se desejado, isso poderia ser substituído por "let mut s =" [[A, 3], [B, 2]] ". Mas agora eu echo [[A, 3], [B, 2]] | carga executada 'na linha de comando.
O cálculo da parada é um pouco problemático. Como detectar se um estado válido do sistema nunca será alcançado? O primeiro plano era detectar se o estado 'atual' repetiu um estado antigo, por exemplo, se o ACCC mudar para CACC, mas depois voltar para o ACCC, sabemos que o programa nunca será encerrado, pois é apenas pseudo-aleatório. Ele deve desistir e imprimir 0, se isso aconteceu. No entanto, isso parecia uma quantidade enorme de código Rust, então, em vez disso, decidi que, se passar por um grande número de iterações, provavelmente ficará travado e nunca chegará a um estado estável; portanto, imprime 0 e para. Quantos? O número de partículas ao quadrado.
Código:
fonte
regex
JavaScript (Node.js) , 249 bytes
Experimente online!
fonte
Java (JDK 10) , 191 bytes
Experimente online!
Isso nunca retorna se não houver soluções.
fonte