Existem dois pedaços de madeira. Ambos consistem em um corpo reto e alguns blocos extras abaixo do corpo. Uma peça de exemplo com blocos extras nas posições (indexadas em 0) 0,4,7,9,10:
XXXXXXXXXXX
X X X XX
A peça pode ser representada como uma 01
sequência binária com o i
caractere th mostrando se existe um bloco na i
posição th. O exemplo superior pode ser representado como 10001001011
.
Podemos montar duas peças girando verticalmente a segunda (e talvez também horizontalmente). Após o flip (s), podemos encontrar um alinhamento no qual as duas peças podem ser montadas para ter uma altura de 3.
Two example pieces:
XXXXXXXXXXX XXXXXXXX
X X X XX XXX
Second piece flipped vertically and horizontally:
XXXXXXXXXXX
X X X XX
XXX
XXXXXXXX
Pieces put together:
XXXXXXXXXXX
XXXXX X XX
XXXXXXXX
O exemplo resultou em uma largura total de 12 blocos.
Você deve escrever um programa ou função que receba duas seqüências como entrada, representando as duas partes e produza um número inteiro com a largura mínima possível com uma altura de 3.
Entrada
- Duas strings consistindo nos caracteres
0
e1
. - Ambas as cadeias contêm pelo menos um caractere.
- Você pode optar por receber as duas seqüências como uma unida por um único espaço.
Resultado
- Um único número inteiro positivo, a largura total mínima alcançável.
Exemplos
0 0 => 1
1 0 => 1
1 1 => 2
11 111 => 5
010 0110 => 5
0010 111 => 5
00010 11011 => 6
01010 10101 => 5
1001 100001 => 6
1110001100001 1100100101 => 14
001101010000101 100010110000 => 16
0010110111100 001011010101001000000 => 21
0010110111100 001011010101001001100 => 28
100010100100111101 11100101100010100100000001 => 27
0010 10111 => 5
0100 10111 => 5
0010 11101 => 5
0100 11101 => 5
10111 0010 => 5
10111 0100 => 5
11101 0010 => 5
11101 0100 => 5
Este é o código de golfe, portanto a entrada mais curta vence.
Respostas:
Pitão,
3735343231 bytesSepara a nova linha de entrada.
Demonstração , Arnês de Teste .
Explicação:
No nível alto, para cada combinação de cadeias normais e reversas, deslocamos a segunda corda para a esquerda por um determinado número de posições e verificamos sobreposições com a primeira. Isso é repetido até que um valor de turno sem sobreposições seja encontrado. Essa quantidade de turno é adicionada ao comprimento da primeira string e o resultado é comparado com o comprimento da segunda string. O valor mais alto é impresso.
fonte
Pip ,
727048 bytesToma as duas seqüências como argumentos de linha de comando. Formatado, com comentários:
Estamos apenas calculando as sobreposições em que a peça de baixo fica à esquerda, portanto, precisamos tentar com as peças de cima e de baixo invertidas. Cada vez que passa pelo loop interno, se não houver 2 na soma, é um ajuste; Em seguida, colocamos outro zero no final da peça de baixo e tentamos novamente.
Para encontrar a largura total, dividimos os elementos de
p
em listas de caracteres e soma. As operações por item em listas de comprimento desigual preservam o comprimento da mais longa, portanto, o comprimento dessa soma é exatamente o que precisamos. (A divisão é necessária porque somar como números eliminará zeros à esquerda:,$+[0101 10] = 111
mas$+^[0101 10] = [0 1 1 1]
.)fonte
Ruby 127
130Isso acabou sendo tão longo ... :(
Testes: http://ideone.com/te8XWk
Ruby legível:
fonte
[[m,n],[m,n.reverse],[n,m],[n,m.reverse]]
peça pode estar incorreta. (Eu não tenho certeza, mas eu cometi um erro similar.)[n.reverse,m]
vez de,[n,m.reverse]
mas eu não conheço Ruby.'0010110111100', '001011010101001001100'
dizendo Esperado: 28, Real: 30 . Todos os outros testes são aprovados. Então você fez um bom trabalho testando casos de canto. :)JavaScript ( ES6 ) 160
Não foi possível diminuir ...
fonte