Introdução
Eu quero construir uma escada. Para isso, peguei no ferro-velho duas tábuas compridas com buracos e quero colocar os degraus nesses buracos. No entanto, os furos não são colocados uniformemente, portanto os passos serão um pouco instáveis e acho difícil estimar a quantidade de haste necessária para eles. Seu trabalho é fazer os cálculos para mim.
Entrada
Sua entrada são vetores de dois bits, dados como matrizes de números inteiros, que representam as duas placas. A 0
representa um segmento de um aud ( unidade arbitrária de distância ) sem um orifício e a 1
representa um segmento de um aud com um único orifício. As matrizes podem ter diferentes comprimentos e conter um número diferente de 1
s, mas não estarão vazias.
Vou construir minha escada da seguinte maneira. Primeiro, coloco as duas pranchas exatamente a um aud e alinhe as extremidades esquerdas. Para cada índice i
, medo a distância entre o i
orifício da primeira prancha e o i
orifício da segunda prancha, corte um pedaço de haste e prenda-o entre os dois orifícios. Paro assim que ficar sem furos em uma das tábuas.
Saída
Sua saída é a quantidade total de haste necessária para as etapas, medidas em auditorias. A saída deve estar correta para pelo menos seis dígitos significativos.
Exemplo
Considere as entradas [0,1,1,0,1,1,1,1,0,0]
e [1,0,0,1,1,1,0,0,1]
. A escada resultante fica assim:
O comprimento total da haste nesta escada é 7.06449510224598
auds.
Regras
Você pode escrever 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
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Respostas:
J, 20 bytes
Ele usa o truque na resposta de MickyT em R .
(<0 1)|:
dá a diagonal de uma matriz. Para as explicações das outras partes, consulte a resposta do FUZxxl .fonte
J, 22 caracteres
Não é inspirado pela resposta da randomra. A
I.
peça é igual, pois é a maneira imediatamente óbvia de encontrar os orifícios.I. y
- todos os índices dey
repetidos tantas vezes quanto o item correspondente dey
. Aliás, sey
é um vetor de booleano,I. y
contém os índices em quey
está1
. Por exemplo,I. 1 0 0 1 1 1 0 0 1
produz0 3 4 5 8
.x u&v y
- o mesmo que(v x) u (v y)
. Aplicado comox u&I. y
chegamos(I. x) u (I. y)
. Vamos continuar com a entrada transformada.x <.&# y
- o menor dos comprimentos dex
ey
.x -/@,: y
- a diferença dos itens dex
ey
. Se um vetor for maior, será preenchido com zeros.x $ y
-y
remodelado para a forma especificada porx
. Especificamente, sex
for um escalar, osx
elementos serão retiradosy
. Neste uso,x (<.&# $ -/@,:) y
verifique se os orifícios à direita são ignorados.4 o. y
- a função%: 1 + *: y
, isto é, sqrt (1 + y² ). Aliás, essa função é mapeada da distância do furo ao comprimento das hastes.+/ y
- a soma dos elementos dey
.fonte
Python, 85
Isso ficou semelhante à solução do Mac . Converta as listas de 0 e 1 em listas ordenadas dos índices um e depois some a distância entre os respectivos elementos.
fonte
J,
3228 bytesO verbo
I.
retorna as posições de1
s em uma string binária, o que é uma grande ajuda.Para uma solução J melhor, verifique a resposta do FUZxxl .
fonte
R, 67
Usa externo para fazer a diferença para furos indexados. Diag retorna as diferenças necessárias. Soma então as distâncias calculadas
Teste executado no R Fiddle. Enrolei-o em uma impressão para mostrar que o retorno está em conformidade com as especificações.
fonte
a==1
pode sera>0
ou!!a
.Haskell,
7773 bytesUso:
[0,1,0,1] # [1,0,0,1]
quais saídas2.414213562373095
Como funciona: a função
r
retorna uma lista das posições dos furos de uma placa, por exemplor [0,1,0,1]
- ->[2,4]
.#
fecha duas dessas listas e a transforma em uma lista de distâncias entre os furos correspondentes e, finalmente, soma-as.fonte
CJam,
3633 bytesAbordagem muito ingênua ... espera a entrada como matrizes no estilo CJam no STDIN
Aqui está um chicote de teste para todas as entradas de exemplo. Os resultados no campo de entrada são usados antes que o código real seja chamado. Você pode removê-los se não confiar em mim. ;)
Explicação
fonte
Python, 86
Uma solução recursiva de baixo nível e ingênua sem nenhuma pesquisa na lista.
As listas de entrada são
a
eb
. Se um estiver vazio, retorne0
.Caso contrário, deixe
x
ey
sejam seus primeiros elementos (o código não os atribui de fato porque você não pode fazer atribuições em alambda
, mas facilitará a explicação). Se ambos são 1, ou seja, seu produto é 1, eles contribuem com a distância da haste. Nós registramos a distância no número complexoi
, de modo que a distância é o valor absoluto. Na verdade, nós o computamos independentemente e depois o multiplicamosx*y
.Então, nós recomendamos. A idéia é mudar as duas listas uma etapa, a menos que uma lista comece com 0 e a outra com uma, nesse caso, alteramos apenas a lista 0. Dessa forma, os 1s são sempre consumidos em pares. Poderíamos verificar essas condições com
x<y
ey<x
, mas é mais curto aproveitar a comparação de listas comoa[:1]<=b
. Finalmente, ajustamos o deslocamento complexo entre os elementos atuais porx-y
.fonte
a>[]<b
paraa>0<b
. Funciona desde os dois[]
e0
é falso, então eles são equivalentes.a:
?([] > []) != ([] > 0)
e em python3, é um erro (tipos desordenados).a:
faz parte da fatia[b[:1]<=a:]
.Python,
105102100 bytesBastante básico, apenas converte as listas de entrada em listas de índices de furos e calcula a distância entre cada par desses índices.
Caso de teste:
Os nossos agradecimentos a @FryAmTheEggman por algumas sugestões de economia de bytes. Acontece que isso pode ser melhorado, como demonstrado na resposta do xnor .
fonte
enumerate(l)
e o0.5
(que pode ser apenas 0,5).l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pitão, 30 bytes
Experimente online com a entrada
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Explicação:
Converter as listas em listas de índices
[2, 3, 5, 6, 7, 8]
e[1, 4, 5, 6, 9]
e zip-los juntos[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Subtraio os valores, quadramo-los, adicione 1 e somamos todas as raízes quadradas.Vergonha que
sum
não funciona para listas vazias.fonte
Python,
116115 bytesEsta é uma solução recursiva.
Tornou-se bastante irritante quando descobri que
index()
apenas gera um erro quando nenhum valor é encontrado, mas o fiz funcionar. Infelizmente, não posso usar uma lambda. Também me incomodou olist.remove()
fato de não retornar a lista, mas retornarNone
.Execute online aqui: http://repl.it/c5L/2
fonte
Clipe 3 ,
55 4738Para a lista com menos orifícios, o programa percorre a conexão e conecta cada orifício ao orifício correspondente da outra lista. Os tamanhos são calculados e somados.
Explicação
Se formos muito liberais sobre o formato de entrada, podemos reduzir isso para 36 bytes removendo cada um
k
. Isso requer que a entrada seja uma sequência de caracteres dos caracteres de controle\0
e\1
.fonte
ECMAScript 6, 86 bytes
Inicialmente, isso começou com o uso de reduzir (eu queria ver se isso poderia ser feito em um loop, em oposição à @ edc65 answer).
Mas, usando @ edc65 para
map
e&&t
para retornar o valor, pude reduzi-lo um pouco.fonte
reduce
faz mais sentido semanticamente, mas fora isso, é realmente meio complicado de usar. Claro, desde quando os jogadores de código se preocupavam com a semântica.Java, 151
Isso apenas caminha à
a
procura de uns, depois caminhab
quando encontra um. Se afloat
precisão for aceitável, eu poderia salvar alguns bytes, mas fui comdouble
a correspondência da saída do teste.Com espaço em branco:
fonte
JavaScript (ES6) 108
O ponto principal é a função f que mapeia as matrizes de entrada 0..1 em matrizes de posições de furos. Em seguida, as matrizes são digitalizadas computando um comprimento total de barras usando o teorema de Pitágoras. O
|0
próximo ao fim é necessário para converter NaNs que podem resultar quando a matriz do driver (o primeiro) é maior que o segundo.Teste no console Firefox / FireBug
fonte
Oitava,
605942fonte
Perl 98
Legível:
Teste:
fonte
APL,
3528 bytesUsa um algoritmo semelhante à solução J, mas o APL possui menos recursos internos.
Exemplo de entrada:
fonte