Lei de Equilíbrio
Uma gangorra (supostamente do francês 'ci-ça', que significa 'isso-aquilo') forma um terço da trindade sagrada dos equipamentos de playground, junto com o deslizamento e balanço igualmente onipresentes. Uma gangorra está em perfeito equilíbrio se, e somente se, a soma dos momentos de cada lado for equivalente. Uma gangorra pode, portanto, ser equilibrada adicionando uma quantidade específica de peso ao lado com a soma do momento mais baixo; alcançar este é o seu objetivo para este desafio.
Desafio
Seu desafio é fazer uma representação de uma gangorra como entrada e produzi-la novamente, com peso adicionado a uma extremidade da gangorra para equilibrá-la.
Entrada
Seu programa deve levar, em qualquer formato razoável, uma gangorra ASCII, como a seguinte:
100 100
-------------------
^
A primeira linha contém dois números, cada um representando pesos na gangorra. Exatamente um peso está presente em cada lado, cada um atuando no final do seu lado da prancha. Os pesos são garantidos como inteiros e sempre alinhados com a extremidade correspondente da prancha. Esses números nunca se sobrepõem ao ponto de apoio ( ^
).
A segunda linha representa a 'prancha' da gangorra. Cada traço ( -
) representa um comprimento igual ao outro traço, com a única exceção do traço diretamente sobre o ponto de apoio ( ^
), que não tem comprimento.
A terceira linha representa o ponto de apoio da gangorra. Esse ponto de apoio é marcado pelo único caractere que não é um espaço nesta linha, um circunflexo ('^'). O ponto de apoio pode ser posicionado em qualquer lugar ao longo do comprimento da prancha em uma entrada válida, desde que haja espaço suficiente para que os números que representam pesos não se sobreponham ao ponto de apoio na entrada ou na saída.
É garantido que a entrada tenha três linhas e não tenha espaço em branco antes ou depois dos caracteres que constituem a gangorra (exceto, é claro, a terceira linha, que exige isso).
Resultado
Para saída, a mesma representação da gangorra deve ser impressa em stdout, mas com um (e apenas um) dos pesos substituídos por um peso maior, para equilibrar a gangorra. As entradas são garantidas para tornar isso possível usando apenas números inteiros. Portanto, os pesos devem ser mostrados sem pontos decimais ou outras notações semelhantes. Se o seu idioma não usa stdout, você deve concordar com a comunidade / meta meta na saída. As novas linhas à direita são boas, mas qualquer outra alteração no formato da representação provavelmente não está correta.
Exemplificação
Entradas de teste e saídas correspondentes
Entrada 1
12 22
--------------------
^
Saída 1
12 26
--------------------
^
Entrada 2
42 42
-----------
^
Saída 2
42 42
-----------
^
Entrada 3
3 16
----------------
^
Saída 3
14 16
----------------
^
Entrada 4
1 56
-------------------
^
Saída 4
196 56
-------------------
^
Implementação de referência - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Regras
Isso é código-golfe , então o código mais curto vence contado em bytes. Verifique a meta se a contagem de bytes é estranha no seu idioma.
Regras / lacunas padrão se aplicam.
A entrada deve ser obtida em um formato razoável. Uma lista não exaustiva dos formatos apropriados é fornecida da seguinte maneira:
- Uma única sequência com linhas separadas por caracteres de nova linha
- Uma lista de cadeias, cada cadeia representava uma linha
- Uma matriz 2D ou matriz de caracteres
Desafios relacionados
- Equilibrar um conjunto de pesos em uma gangorra - Proposta em agosto de 2015 por samgak
Respostas:
05AB1E ,
605150.49.4745 bytesEconomizou 10 bytes graças a Emigna e 1 byte graças a Adnan.
Todas as linhas de entrada devem ter a mesma quantidade de caracteres.
Experimente online!
Deve haver uma regra geral, como "se o seu código 05AB1E tiver mais de 40 bytes, você provavelmente está fazendo errado". Parece tão fácil de jogar, qualquer idéia é bem-vinda!
fonte
¬s¤s\‚
pode serõK
.kD²g->(‚
pode ser¡€g
se você adicionar os espaços ausentes na linha inferior do caso de teste31SÍ
com1®‚
:)/ ï
por÷
.?JavaScript (ES6), 136
Provavelmente não está funcionando no Chrome, pois usa atribuição desestruturada e parâmetros padrão.Observe que o método de saída JS padrão
alert
é particularmente inadequado para a tarefa, devido à fonte proporcional usada.Menos golfe
Teste
fonte
Perl, 149 + 2 = 151 caracteres
Requer opções de linha de comando
-p0
(isso me dá uma penalidade de 2 bytes sobre os 149 bytes no próprio programa).Explicação:
-p0
switch lê toda a entrada até o primeiro byte NUL ou EOF. Como esse problema não permite NULs, obteremos toda a entrada na variável$_
usada para expressões regulares etc., por padrão..+?
), mas não posso obtê-lo abaixo de três caracteres, para que eu possa usar o óbvio\d+
. O segundo número está no final da linha para que possa ser analisado como.+
(2 caracteres). A linha central é usada para determinar a largura das escalas; é analisado como-+
(muitas outras representações funcionariam). Os espaços antes do cursor na última linha são+
. Depois que o sinal de intercalação (ou mesmo qualquer não-espaço) aparece, ignoramos o restante da entrada.$1
,$2
,$3
,$4
. Fornecer uma regex como argumento paramap
usar adicionalmente uma matriz desses grupos como a matriz a ser mapeada. Nós, portanto, nos esforçamos; Essa é uma maneira conveniente de armazenar os comprimentos$3
e$4
sem precisar escreverlength
duas vezes. Também substituímos$_
o comprimento de$1
; nós realmente não nos importamos com o valor disso (o número de dígitos na entrada esquerda é meio inútil), mas o fato de ser curto ($_
o comprimento agora é o número de dígitos no número de dígitos na primeiro peso, que é necessariamente muito pequeno comparado à largura das balanças).$r
na qual as escalas são divididas.$1*$r>$2
verifica para ver qual lado é mais pesado. Armazenamos os novos pesos em$x
e$y
; estes têm cálculos muito simples quando a relação de pesos é conhecida.$x
,$,
e$y
into$_
para produzir a linha superior, e continuamos adicionando espaços ($"
contém um único espaço por padrão e é mais curto do que um espaço literal' '
seria)$,
até que ele tenha o mesmo comprimento que a linha do meio (ou seja, tenha comprimento$c
). (Escolhi a variável$,
por ser uma variável interna que pode ser alterada com segurança nesse contexto e começa vazia por padrão.) Comolength
opera$_
por padrão, não precisamos fornecer um argumento explicitamente. Eu usei um condicional Yoda porque ele precisa de uma sintaxe consideravelmente menos desambiguação para analisar corretamente.$\
) para conter o restante do conjunto de escalas (que é o mesmo da entrada, para que eu possa simplesmente usar$3
e$4
diretamente para produzir a maior parte dela). Observe que isso significa que não há espaço em branco à direita na terceira linha; adicioná-lo tornaria o programa um pouco mais longo e não parece servir a nenhum propósito, então deixei de fora.-p
switch é acionado novamente; desta vez, ele sai$_
seguido por uma "nova linha" ($\
). Como redefini a nova linha de saída, essas duas impressões implícitas geram o novo conjunto de escalas entre elas (embora, como efeito colateral, não haja nova linha na saída).-p
switch agora tenta ler a entrada novamente, mas já descartamos o arquivo inteiro, então ele lê EOF e finaliza o programa.fonte
PHP,
212209205 bytesprovavelmente jogável
Recebe entrada do argumento da linha de comando; escapar de novas linhas. Corra com
-r
.A substituição por um espaço reservado não funcionou conforme o esperado; então eu tive que adicionar mais parênteses ao primeiro regex.
fonte
Befunge,
223217 bytesExperimente online!
fonte
>
Acho que o outro foi deixado por razões estéticas. Dito isso, parece que tenho uma solução de 215 bytes em minhas anotações, por isso é possível (também tenho bugs que explicariam por que nunca a enviei - não tenho tempo para testá-la agora).Python 2,
184183 bytesDefinitivamente jogável
Bem direto. Pegue os pesos ajustados para ajustar os dois lados, veja qual é maior que o original e troque-o e a saída.
EDIT Multiplicação e divisão comutada porque a divisão inteira é ruim (obrigado a @ Jonathanon Allan por perceber isso)
EDIT -1 byte Alterado
i().index('^')
parai().find('^')
(graças a @JonathanAllan [novamente!])fonte
a=[w[1]*R/I,w[0]*I/R]
(um exemplo simples que não funcionaria seria a1
e2
withI
eR
both3
). Atualmente 194 não 184 pelo caminho desde as novas linhas contam como um byte de cada um, masj
ek
estão custando mais bytes do que salvar.I=i().find('^')
, e a forma abreviada__repr__
, backticks para fazer a última linhaprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
e descer para 182 - repl.it/EW8fC ++ 14, 482 bytes
versão mais legível:
fonte
Python 3,
235230 bytes (referência minimizada)Acabei de minimizar a referência, já que sou muito novo no código de golfe.
Você o usa exatamente da mesma forma que no exemplo, mas a função é em
s
vez debalance_seesaw
.fonte
w[o>p]=[o//k,p//t][o>p]
. Além disso, a maioria das linhas pode ser unida para se livrar de algum espaço em branco extra.