Considere esta versão ASCII de um mecanismo semelhante a uma máquina de feijão ou a um jogo plinko / pachinko :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
A O
é uma bola que cai.
- Quando atinge um
^
, há uma chance de 50 a 50 de ir para a esquerda ou direita. - Quando atinge a
/
, sempre sai para a esquerda. - Quando atinge a
\
, sempre dá certo.
A bola eventualmente cai em uma das U
valas numeradas na parte inferior. A questão é: qual é a probabilidade de acabar em cada vale?
Para este caso particular, as probabilidades são 0.0
, 0.1875
, 0.5625
, 0.125
, e 0.125
, por calhas de 1 até 5 respectivamente.
Aqui está outro exemplo com 3 calhas em vez de 5. As probabilidades são 0.5
, 0.5
, e 0.0
:
O
/
^ ^
U U U
1 2 3
Neste desafio, generalizaremos esse problema para um mecanismo com qualquer número de camadas configuradas de qualquer maneira.
Desafio
Escreva um programa ou função que absorva a representação ASCII da estrutura em pirâmide do mecanismo. (Entrada via stdin / linha de comando / função arg.)
Você pode assumir que ele vem com espaços que o colocam na forma correta, por exemplo,
^
\ ^
^ ^ \
\ ^ / ^
Ou você pode assumir que ele não possui espaços, por exemplo,
^
\^
^^\
\^/^
(Se desejar, você pode assumir que há uma nova linha à direita e / ou algum padrão consistente de espaços à direita).
A estrutura da pirâmide de entrada pode ter qualquer número de níveis (também conhecido como linhas), incluindo zero. Cada nível tem mais um ^
, /
ou \
que a última, e há levels + 1
depressões na parte inferior (que não são parte da entrada).
Você programa / função deve imprimir / retornar a lista de probabilidades de que a bola caia em cada uma das valas (na ordem da esquerda para a direita). Devem ser valores de ponto flutuante que, quando impressos, têm pelo menos três casas decimais (zeros supérfluos ou pontos decimais não são necessários; 1
é bom para 1.000
, .5
é bom para 0.500
etc.). Se você escreveu uma função, pode imprimir os valores ou retornar uma lista / matriz dos carros alegóricos.
Qualquer formato razoável de lista impressa é bom. por exemplo 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
, ou 0.5\n0.5\n0.0
tudo seria bem.
Exemplos
0 Níveis: (resume-se a um trivial U
)
Entrada: [no input/empty string given]
Saída:1.0
1 Nível:
Entrada: ^
Saída:0.5 0.5
Entrada: /
Saída:1.0 0.0
Entrada: \
Saída:0.0 1.0
2 níveis: (segundo exemplo acima)
Entrada:
/
^ ^
Saída: 0.5 0.5 0.0
3 Níveis:
Entrada:
^
^ ^
^ ^ ^
Saída: 0.125 0.375 0.375 0.125
Entrada:
\
/ \
/ / \
Saída: 0.0 0.0 0.0 1.0
4 níveis: (primeiro exemplo acima)
Entrada:
^
\ ^
^ ^ \
\ ^ / ^
Saída: 0.0 0.1875 0.5625 0.125 0.125
7 níveis:
Entrada:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Saída: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Pontuação
A resposta mais curta em bytes vence. O desempatador é uma publicação anterior.
fonte
Respostas:
CJam,
50 48 45 44 4240 bytesIsso espera que a entrada fique sem espaço e tenha uma nova linha à direita. Por exemplo:
Algoritmo
A idéia básica é que você continue analisando cada caractere (existem apenas 4 caracteres diferentes) e execute operações diferentes na distribuição de probabilidade (inicialmente uma matriz contendo 1 elemento do valor 1). Para cada linha de caracteres de entrada (começando com o primeiro caractere na primeira linha), mantemos uma matriz de probabilidade do mesmo tamanho. Cada caractere age com a primeira probabilidade da lista e empurra o par resultante para o final da lista. Após cada linha, somamos pares da lista para obter o número exato de itens como os itens da próxima linha.
Aqui estão os quatro caracteres e as ações necessárias correspondentes a cada um:
^
: Quando esse caractere ocorre, você divide a probabilidade atual em duas partes. Por exemplo, se temos isso na primeira linha, temos que converter o[1]
para[0.5 0.5]
/
: Quando esses caracteres ocorrem, precisamos colocar<current probability> 0
a probabilidade atual no array.\
: Quando esses caracteres ocorrem, precisamos colocar0 <current probability>
a probabilidade atual no array.\n
: Quando esse personagem ocorre, temos uma nova linha. Assim, agrupamos todos os pares acima de 3 caracteres e os somamos para obter a probabilidade de cada item para a próxima linha. Por ex.[0 0.5 0.25 0.25]
é convertido em[0 0.75 0.25]
. Observe que o primeiro e o último item têm um par implícito (com valor 0) antes e depois deles.Agora só precisamos identificar o personagem certo e executar a ação correta. Vamos usar a matemática usual aqui para fazer isso. Os códigos ASCII para
^
,\
,/
e\n
são94
,92
,47
, e10
. Após algumas tentativas, obtemos esta equação simples para converter esses números em 0, 1, 2 e 3:dá:
Em uma matriz de comprimento 4, o último
4f%
seria implícito. Então, simplesmente fazemos%13
o código ASCII do personagem e escolhemos a ação correta em uma matriz de ações.Explicação do código :
Experimente online aqui
fonte
Ruby 140
Função que recebe como entrada a string (pode ser bem formatada como uma pirâmide) e retorna uma matriz de flutuadores.
Teste on-line: http://ideone.com/kmsZMe
Implementação bastante direta. Aqui está não destruído:
fonte
Ruby, 140
158bytesNão continue votando isso quando houver uma versão ruby melhor .Aqui estão mais truques para você.Função sem nome com um argumento. Não deve conter espaços. Pode ou não conter uma nova linha à direita.
Desperdiça 9 bytes por ter que lidarTodos os casos de teste funcionam corretamente, veja aqui em ideone .0 levels
(string vazia).fonte
split
, por exemplo.Pitão,
434241 bytesIsso espera que a entrada fique sem espaços. Experimente on-line: Compilador / Executor Pyth
Pitão, 40 bytes (questionável)
Obrigado a @isaacg, por salvar um byte. Observe que essa versão não funcionou na versão do Pyth, quando a pergunta foi feita. Houve um pequeno erro no compilador. Apesar desse código não usar novos recursos do Pyth (apenas coisas que estavam nos documentos do Pyth por um longo tempo e deveriam ter funcionado), isso pode não ser uma resposta válida. Decida por si mesmo.
Experimente on-line: Compilador / Executor Pyth
Explicação:
Por exemplo, se atualmente tenho as probabilidades de entrada
G = [0.5, 0.5, 0.0]
e a linhaH = "^/^"
acontece o seguinte:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
fonte
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 bytesNada sofisticado, programa completo que lê linhas (com ou sem espaços, apenas as retira) do STDIN e imprime resultados separados por espaço no STDOUT.
Código mais ordenado com comentários:
fonte
Python 3, 113
Atualiza repetidamente o vetor de probabilidade
P
em resposta a cada linha. Esse novo vetor de probabilidadeQ
é criado uma entrada por vez. Percorre os novos slots, e calcula a contribuição do peg para o seu direito comor
, ao mesmo tempo, o cálculo da contribuição restante para o próximo slot, comop-r
.Espera que cada linha termine em pelo menos um espaço para evitar um problema em que as linhas terminam em uma barra invertida.
fonte
input()
possa lidar com isso.Python 3, 138 bytes
Funciona com todos os espaços em branco, pois todos são filtrados (por
if'!'<e
).Método:
r
das probabilidades de alcançar qualquer obstáculo e as valas implícitas abaixo deles. Começamos a partir da lista[1]
.0
à lista da calha principal. Decidimos se é o primeiro obstáculo comparando seu índicep
com o próximo número triangulart*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Usamos o seguinte método:v = ord(char) mod 7 + 1
rendimento^:4 /:6 \:2
v div 3 / 2
produz a primeira fração (^:0.5 /:1 \:0
)v mod 3 / 2
produz a segunda fração (^:0.5 /:0 \:1
)t + 1
elementos da lista finalr
.2 bytes graças ao conselho do @ Sp3000.
fonte
Perl, 78
Recebe entrada sem espaços.
Experimente- me .
fonte
TI-BASIC,
7376Recebe uma linha de cada vez e termina quando um espaço é inserido por conta própria, porque nem quebras de linha nem vazias são válidas no TI-BASIC.
Tenho certeza de que consegui o tamanho certo (TI-BASIC é tokenizado, portanto, cada comando leva um ou dois bytes - seq () leva um, inString () leva dois, dim () leva um e assim por diante. contado o tamanho manualmente.)
Embora o caractere de barra invertida seja válido em uma string, observe que não há como inserir um de dentro do programa, a menos que você tenha modificado sua calculadora.
fonte
Javascript - 117
Tentei usar recursão, mas isso foi muito longo ...
Dica para xnor para a idéia de subtração, que raspou uma dúzia ou mais de caracteres.
Ungolfed:
fonte