Por que um simulador?
Hoje em dia, as crianças não têm tempo nem ambição de realmente empilhar caixas na gangorra ou brincar com objetos físicos equilibrados. Isso deixa muito espaço no mercado de software para um Lever Simulator que, de acordo com meus modelos, venderá como louco!
Procura-se ajuda de programação
Eu registrei a patente para esse jogo (pendente), mas preciso de um programador especializado para escrever a lógica do jogo para mim. Pelo meu entendimento, é prática padrão compensar os programadores com base no tamanho em bytes do programa final. Como tal, estarei concedendo este contrato lucrativo ao menor lance.
Especificação
Uma alavanca é uma série de caixas ou espaços vazios equilibrados por um ponto de apoio. Cada caixa tem um peso específico de um a nove e os espaços não têm peso. Como você sabe, o peso de uma caixa na alavanca é diretamente proporcional à distância da caixa do ponto de apoio. Uma caixa de peso 4
que fica no terceiro espaço a partir do ponto de apoio contribuirá com 12
unidades de força efetivas para esse lado da alavanca.
Preciso de um programa que, dada uma alavanca de entrada, produza se a alavanca se inclina para a esquerda, a direita ou se está perfeitamente equilibrada.
Diretrizes de E / S
- Você vai escrever para mim um programa.
- A entrada conterá uma linha de texto.
- A entrada virá de
stdin
ou como uma sequência de linha de comando. - As caixas serão representadas pelos caracteres '
1
' a '9
'. Esses caracteres representam seus respectivos pesos. Um espaço vazio será representado por um espaço ''. O ponto de apoio será representado por um sinal de intercalação '
^
'.
Uma alavanca de entrada de amostra pode se parecer com: 8 2^ 941
Esta alavanca está perfeitamente equilibrada: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Não haverá espaços à esquerda nem à direita. Não haverá nova linha final.
- Não há necessidade de lidar com entrada malformada, a entrada sempre terá exatamente um ponto de apoio e apenas números e espaços.
- A saída indicará se a alavanca está pesada para a esquerda, pesada para a direita ou equilibrada.
- Seu programa deve ter exatamente 3 saídas possíveis que podem resultar de uma entrada bem formada. Você pode escolher o que é isso.
- A saída deve ser impressa
stdout
ou ser o código de retorno do programa.
Casos de teste
Aqui eu uso L
, R
, B
para significar deixou-pesado, pesado direita, equilibrada:
Entrada:
11 ^9
Saída:B
Entrada:
321^ 12
Saída:L
Entrada:
9^ 1
Saída:R
(Se alguém tiver alguns casos de teste "mais complicados", fique à vontade para editá-los).
Bibliografia
Não necessariamente inspirado, mas relacionado a Equilibrar um conjunto de pesos em uma gangorra
fonte
The output must either be print to stdout or be the return code of the program.
Bem, agora você está me pedindo para fazer uma distribuição do Linux que usa notação de gangorra para códigos de saída.^16
,16^
ou^
? (Suponha que seja possível) #Respostas:
Python 2, 69 bytes
O módulo
ord(c)%16
extrai o valor de um caractere de dígito enquanto obtém 0 para espaço. Para cada caractere, sua contribuição de torque é calculada como seu peso multiplicado pela distância sinalizada ao pivôi-s.find('^')
, e estes são somados e comparados a 0, produzindo um de-1,0,1
. O personagem^
é calculado para ter peso 14, mas isso não importa, porque está no pivô.Uma porta Pyth de 18 bytes de Maltysen:
Para o código Python, se um programa completo for necessário, aqui estão 79 bytes. A idéia é iniciar o índice
i
alterados.find('^')
e fazer a contagem regressiva.fonte
Javascript ES6, 62 bytes
-1
se a esquerda for mais pesada0
se equilibrado1
se certo é mais pesadoUngolfed:
Execuções de teste (atribuindo função anônima a
f
):R B L
para-1 0 1
e.split``
para[...e]
(obrigado @ Vɪʜᴀɴ)~~'^'
avalia como0
...)fonte
f=
e dizer que ela gera uma função anônima. (-2 bytes FYI)Japonês , 22 bytes
Japt é uma versão abreviada do Ja vaScri pt . Intérprete
Retorna
-1
paraL
,0
paraB
e1
paraR
.Como funciona
fonte
APL,
3930 bytesDepois de reler as regras, mudei para saída, em
-1
0
1
vez deL
B
R
salvar nove bytes.Experimente aqui .
fonte
Pitão, 20 bytes
Suíte de teste
-1
para tendencioso à esquerda,0
equilibrado,1
para tendencioso à direita.Como funciona:
fonte
Haskell,
116968276 bytesA saída é
0
para balanceado,-1
pesado para a esquerda e pesado1
para a direita.Exemplo de uso:
f "321^ 12"
->-1
Como funciona: encontre a peça antes da
^
. Multiplique a sequência de entrada e a lista de pesos que começa em- length-of-first-part
. O valor^
é 0 e não é adicionado à soma. Estou usando o truque de mod 16 do @ xnor para converter dígitos / espaços em valores inteiros. Se a soma for negativa (positiva), a alavanca é pesada para a esquerda (pesada para a direita) e equilibrada se a soma for 0.fonte
TeaScript , 23 bytes
25Tentei escrever uma resposta Pyth, mas isso foi horrivelmente: \
Que
²
parece tão fora do lugar, mas ele salva 1 byte, então eu vou ser mantê-lo.Experimente online!
Teste todos os casos
Para o esquema de saída que escolhi:
-1
se Esquerda for mais pesada que Direita (L
)0
se Esquerda for tão pesada quanto Direita (B
)1
Esquerda é menos pesada que Direita (R
)Ungolfed && Explicação
Isso usa mapas e reduz para fazer o trabalho.
fonte
pb ,
349329 bytesEste foi um assunto complicado. O pb não foi projetado para ser bom nesse tipo de coisa.
Nem sequer tem multiplicação .Mas ei, isso funciona.A parte mais difícil foi, depois de obter as somas de (peso * distância) de cada lado, determinar realmente qual letra imprimir. pb não tem
>
ou<
operadores, apenas==
e!=
. Não há uma maneira fácil de saber qual valor é maior. Eu não posso nem subtrair e comparar com 0 ... a menos que eu faça algo realmente bobo.Então, você simplesmente vai para X = (lado esquerdo - lado direito), e aí está a sua resposta! Exclua tudo nessa linha para limpar e, em seguida, imprima o valor encontrado em (0, 0).
... Mas há uma maneira um pouco mais curta. Em vez de usar 'L', 'B' e 'R', use esses valores - 'B' e adicione 'B' novamente ao imprimir. Dessa forma, você nunca precisa colocar 'B' em X = 0, basta deixá-lo como o 0 já era. O único problema é que, depois de fazer isso, o programa se torna muito pateta no modo de exibição.
'L'-'B'==76-66==10=='\n'
. Tudo parece estar funcionando bem, até que de repente um grande número de novas linhas é impresso e é impossível acompanhar o que está acontecendo: D No modo de execução regular do pbi, tudo funciona bem porque as novas linhas são excluídas antes que qualquer coisa seja impressa no console.fonte
Perl 5, 72 bytes
fonte
MATLAB 91, 57, 55oitava, 50 bytesEu não esperava mais jogar golfe, mas a mudança para o Octave tornou possível salvar 5 bytes adicionais! Uau, este levou tempo ...
Ele gera
-Inf, NaN, Inf
paraL, B, R
respectivamente.Suíte de teste!
Explicação:
Definitivamente, esse é um código difícil de ler, mas tentarei explicar o melhor que puder. Vou alternar entre a explicação do bloco de código e o texto.
Vejamos o que está acontecendo dentro dos colchetes:
Este é um pouco complicado:
Os números de cada lado da escada devem ser multiplicados pela distância do sinal de intercalação. Se usarmos números negativos no lado esquerdo e números positivos no lado direito, podemos simplesmente somar o vetor para ver qual lado é mais pesado.
Suponha que a seqüência de entrada é:
'321^ 12'
. Queremos o seguinte:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. O vetor que criamos dentro dos colchetes começa em1-i
, que neste caso é-3
, já que o cursor está na 4ª posição. Aumentannz(x)-i
em incrementos de um. Podemos usar emnnz(x)
vez denumel(s)
, porquex
é uma string que não contém zeros.Portanto:
Agora, poderíamos fazer a multiplicação por elementos
s.*[...]
e pegar a soma disso. Mas, como temos dois vetores, também podemos mutliplicars
pela transposição[...]
e calcular a soma usando a multiplicação de matrizes:Isso nos dá um número negativo, ou seja, o lado esquerdo é mais pesado, um zero, significa que é equilibrado ou um número positivo, o que significa que o lado direito é mais pesado. Em vez de usar a abordagem ingênua de
sign(...)
, nós a multiplicamos porinf
, o que nos dará uma-Inf
ou outraInf
para esquerda e direita, respectivamente. RecebemosNaN
para0*inf
, uma vez que está indefinido.Isso nos dá três valores distintos para os três resultados possíveis.
fonte
, 22 caracteres / 38 bytes
Try it here (Firefox only).
fonte
JavaScript, 146 bytes
Bastante enorme.
Demo .
fonte
function t(s){
pode se tornart=>{
esplit('^')
poderia se tornarsplit`^`
Ruby,
111108 bytesExplicação
Resume o valor ponderado de cada número de cada lado. Em seguida, ele usa o operador de nave espacial ruby para fornecer 1,0, -1 de igualdade / desigualdade dos dois lados, que é o índice de uma matriz com a saída correta.
fonte
PowerShell,
8373 bytesAgradecimentos a TessellatingHeckler pelo golfe.
Usa essencialmente o mesmo algoritmo que o código antigo abaixo, mas aqui iteramos os caracteres na string de entrada, um de cada vez, em vez de iterar pelo índice, o que economiza um punhado de bytes. Ainda lança a mesma mensagem de erro espetacular quando o algoritmo chega
^
- não afeta STDOUT.Anterior
Usa o mesmo algoritmo impressionante da excelente resposta do Dendrobium e, portanto, usa a mesma saída
-1 / 0 / 1
se a entrada forleft-heavy / balanced / right-heavy
.Ugh. Muito tempo por causa de um recurso
peculiar deelenco que o PowerShell possui. O mais pertinente aqui é o quãochar
multiplicado porint
funções. Obter um índice de matriz de umstring
resultado em umchar
objeto. O PowerShell converte ochar
valor correspondente em ASCII (em vez do valor literal) antes da multiplicação. Então, algo como$a='012'[0];[int]$a*2
resulta em96
.Isso significa que precisamos refazê-lo novamente como uma string. No entanto, simplesmente fazer os
string
temposint
nos dá umastring
repetição disso muitas vezes. Por exemplo,$a='0';$a*2
resultaria em00
.Isto significa que precisamos para lançar a
char
volta comostring
antes re -Fundição comoint
, então multiplicação pode acontecer, antes de adicioná-lo ao nosso acumulador$x
.Junte isso à maneira longa de iterar por meio de uma string, e o .NET chama a saída do sinal, e obtemos um longo pedaço de código.
NB - Isso gera um erro espetacular quando atinge
^
a string, declarando que não pode convertê-lo em umint
. Não afeta STDOUT.fonte
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
74 bytes. Isso levou muito tempo e várias tentativas de abordagem. math :: sign parece tão longo, mas não vejo nenhuma maneira de melhorar isso.$i++*+"$_"
é equivalente a$i++*"$_"
if$i
é um int.CJam, 29 bytes
Experimente online
O resultado é
-1
para pesado à esquerda,0
para equilibrado,1
para pesado à direita.Isso pareceu um pouco demorado, mas tentei várias alternativas e todas elas terminaram entre 29 e 33 bytes. Um problema é que não consegui encontrar uma maneira de converter a string em valores que resultariam automaticamente em 0 para os espaços. Então, acabei substituindo explicitamente os espaços por '0 caracteres, o que obviamente aumenta o comprimento do código.
Alternativas tentadas:
ee
operador para adicionar o índice à lista de valores.Explicação:
fonte
Python 3,
196114 bytesCódigo regular:
Explicação:
stdin
.Muito obrigado a @ThomasKwa por cortar 82 bytes (mais de 40%)!
fonte
print('LBR'[(B>D)-(B<D)])
para o fim eB=D=0
no início.^
. Isso poupa vocêabs()
também.C,
140139138134100 bytesRetorna:
Corre:
Como temos ASCII:
Nós temos:
Em seguida, some por fator de distância até
^
.fonte
SpecBAS - 140 bytes
t
é um total corrente, os valores são negativos quando a posição do caractere é maior que a posição do quilate. No final, ele vê se o total é negativo, zero ou positivo e imprime o caractere correspondente de R, B ou L.Eu poderia economizar alguns bytes apenas produzindo -1, 0 ou 1 como algumas das outras respostas.
fonte
Java, 83 bytes
fonte