visão global
Dada uma sequência de 3 linhas, descubra se a estrutura cai para a esquerda, se equilibra ou cai para a direita.
Estrutura de entrada
Você pode imaginar a estrutura como uma haste de metal com coisas por cima, todas equilibradas em cima de uma haste vertical.
1 7 4 a
===============
|
A primeira linha são os itens. O peso de cada item é calculado como o valor ascii do personagem menos 32. (Caracteres abaixo de 32 não são considerados e espaços pesam 0). Lembre-se de que a força de um item na haste é seu peso vezes a distância do ponto de articulação.
A segunda linha é a haste. Cada comprimento da haste pesa 1 unidade por si só. Esta linha é exclusivamente igual a sinais ( =
).
A terceira linha é o ponto de articulação. Isso pode ser colocado em qualquer lugar e é representado por vários espaços seguidos por um único |
caractere pipe ( ).
Exemplos
Entrada:
===== |
Saída: Equilíbrio
Entrada:
===== |
Saída: cai para a esquerda
Entrada:
% ===== |
Saída: Equilíbrio (porque %
pesa o suficiente para neutralizar o peso do lado esquerdo da haste)
Entrada:
aa ======= |
Saída: cai à direita (porque a
a direita está mais distante do ponto de articulação)
Entrada:
1 7 4 A
===============
|
Saída: cai para a esquerda
Entrada:
1 7 4 a
===============
|
Saída: cai à direita (letras minúsculas são pesadas!)
Entrada:
$ ~
===============
|
Saída: Equilíbrio
Notas
- O espaço em branco à direita é permitido, o espaço em branco à esquerda não é.
- Seu programa pode produzir no formato que você quiser, desde que existam 3 saídas distintas para esquerda, balança e direita.
- Seu programa deve aceitar o formato mostrado como entrada.
Respostas:
JavaScript (ES6),
116111108106 bytes-5 bytes somando via em
eval(array.join`+`)
vez dearray.reduce()
.-3 bytes por padrão, em
1
vez de32 - 31
, permitindo que os parênteses sejam removidos.-2 bytes, já que o ponto de pivô é o comprimento da última linha - 1
Saídas
-1
,0
ou1
, para a esquerda, equilibrada, ou direita, respectivamente. Acabou semelhante à resposta python de Chas Brown , então o crédito vai para lá.Pode salvar 4 bytes se a primeira linha for preenchida para corresponder ao comprimento da haste usando
(31-t.charCodeAt(i))*(b.length+~i)
.Snippet de teste
Inclui saída adicional (
Left
/Balanced
/Right
) junto com o número.Outro método de 106 bytes
Em vez de
join
inserir uma matriz em+
s, criamos uma sequência de números, cada um prefixado por+
. A liderança+
é ignorada.fonte
(b.length+~i)
pode ajudar a salvar um byte. (Eu também não entendo por que você tem a||1
.)b.length+~i
retorna o negativo dei-b.length+1
; isso poderia ajudar se eu pudesse negar a outra parte. Quanto ao||1
, isso foi porque eu estava assumindo que a primeira linha não estava preenchida para coincidir com o comprimento da haste, entãot.charCodeAt(i)
retornariaNaN
além do final da primeira linha.Python 2 ,
112110 bytesExperimente online!
EDIT: Finalmente conseguiu eliminar o
enumerate
erjust
por um mísero 2 bytes ... meh!Toma em uma corda; saídas -1,0 ou 1 para quedas à esquerda, saldos, quedas à direita, respectivamente.
A primeira passagem em 112 bytes foi:
fonte
(ord(c)-31)
Demorei um pouco para perceber que isso realmente está incorporando o peso da própria haste junto com os itens. Muito esperto!return
comprint
a -1 byte (embora ele realmente não jogar bem com o código TIO atual).Haskell,
212171 bytes (188 se receber entrada como uma sequência)Variante de 171 bytes
Variante de 188 bytes
Explicação
fonte
fromEnum
vez deord
e soltar oimport
.c
pode ser simplificado parac p=max(ord p-32)0
(ou comfromEnum
) e, como você o está usando apenas uma vez, coloque-o em linha.c
pode até ser simplificada (caracteres menores de 32 anos não são considerados) além dec p=ord p-32
. Tambémp
é basicamentelength
(menos 1), entãop x=length x-1
também funcionaria (e você pode incorporá-lo também). Também dê uma olhada na minha solução, como eu usosignum
- você pode fazerr o l s = signum $ 2 * z ...
quais retornos0,1,-1
para B, L, R.[3,4,7]
e usa 3 Strings em vez de uma. (vejalines
).Gelatina , 30 bytes
Suíte de teste
Saídas 0 para balanceado, 1 para direita e -1 para esquerda.
Como funciona
fonte
Gelatina , 24 bytes
Experimente online!
-1
por cair à esquerda,0
por equilibrar,1
por cair à direita (programa completo).[-1]
por cair à esquerda,[0]
por equilibrar,[1]
por cair à direita (função).A primeira linha deve ter espaços à direita, a última linha não.
Explicação (começamos com a linha inferior):
Primeiro de tudo, estamos trabalhando com linhas individuais, por isso precisamos obtê-las de alguma forma. Isso é um trabalho para
Ỵ
. Então, precisamos tratar a\n
versão -split da entrada como se fosse a entrada original; portanto, usamosµ
para fazer uma cadeia monádica aplicada ao valor atual.Agora começamos o trabalho real, e nosso primeiro trabalho seria calcular os fatores dos pesos. Essencialmente, esse é um intervalo [distância da extrema esquerda ao pivô..0..distância do pivô à extrema direita]. Primeiro, precisamos encontrar o índice baseado em 1 do pivô, que é essencialmente o comprimento da última linha sem espaços à direita. Então, exibimos a última linha (linha dinâmica) da nossa lista original com
Ṫ
, já que não precisamos mais dela e, em seguida, aumentamos seu comprimentoL
. Precisamos, então, tomar o comprimento da haste, para o qual fazemos a mesma coisa na última linha (linha da haste) comṪL$
. Finalmente, para obter o alcance, mapeamos | x - y | para [1..rod length], onde x é o índice dinâmico e yé cada elemento da lista em que mapeamos. Fazemos isso usandoạЀ
, ondeạ
calcula | x - y | eЀ
varia de 1 até e incluindo o comprimento da haste. Agora teremos o alcance que queremos.Depois disso, temos que multiplicar cada número inteiro, representando um pedaço da barra, com seu peso correspondente. Para calcular os pesos, usamos
Ç
, indo para a linha superior do nosso código. Pegamos a linha restante comṪ
, seus códigos comO
e, em seguida, calculamos x - 31 usando_31
, x sendo cada código. Em seguida, atribuímos espaço ao peso 1 (0 + peça da haste = 1),!
ao peso 2 (1 + 1) etc. Concluímos a linha superior, portanto, agoraÇ
retornaria a lista de pesos, que multiplicamos pela correspondente inteiros representando as peças da haste com×
.Depois disso, dividimos com
ṣ0
no ponto de pivô, representado por um 0 (já que qualquer peso não afeta o resultado), resultando em uma lista da forma [[1º peso, segundo peso ... peso imediatamente antes do pivô] , [peso logo após o pivô, peso após o peso anterior ... último peso]]. Essas listas representam os lados da haste, esquerda e direita. Agora somamos cada uma das listas usandoS€
para obter os pesos totais de cada lado e usamosI
o delta, que será negativo se o lado esquerdo for mais pesado, zero se for do mesmo peso e positivo se o lado direito for mais pesado . Portanto, para retornar o resultado final usando-o adequadamente para nossa vantagem, levamos o sinal comṠ
.fonte
APL (Dyalog) , 43 bytes *
Experimente online!
⊆⊢
particione o argumento em execuções de caracteres que são⎕TC[2]∘≠
diferente do 2 nd t erminal C ontrolo de caracteres (Linefeed) **{
…}
Aplique a seguinte função anônima na lista de strings:⊃⌽⍵
na primeira sequência da lista invertida (ou seja, a última)'|'⍳⍨
encontre o índice do ponto de articulação(
…)-
Subtraia isso da seguinte lista:⊃⍵
a primeira corda≢
seu comprimento⍳
todos os indicadores disso(
…)+.×
Soma ponderada com esses pesos e com os seguintes valores:⊃⍵
a primeira corda⎕UCS
Os pontos de código no L niversal C haracter S et¯31+
adicione trinta e um negativo (32 para o deslocamento necessário menos um para a haste)×
sinal disso* Para 1 byte por caractere, use
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
com⎕ML←3
. Experimente online!**
⎕TC
foi descontinuado e usado aqui apenas para fins de golfe. No código de produção, deve-se usar⎕UCS 10
.fonte
Haskell (Lambdabot), 142 bytes
Experimente online!
Versão não destruída:
fonte
Python 2 , 90 bytes
Espera que as linhas de entrada sejam preenchidas (com espaços) no comprimento correto. Saídas
-1
para quedas à esquerda ,0
para equilibradas e1
para quedas à direita .Experimente online!
94 bytes
Para +4 bytes, podemos ter uma versão que, usando um
while
loop, requer linhas separadas , em vez de linhas preenchidas :Experimente online!
fonte
Ruby, 543 bytes
fonte
C (gcc) , 106
107121123124129131bytesRetorne 0 para cair à esquerda, 1 para equilibrar e 2 para cair à direita.
Exija que as três linhas tenham o mesmo comprimento e finalize
\n
para determinar o comprimento da sequência.Experimente online!
fonte
Mathematica, 91
92bytesA primeira linha deve ter o mesmo comprimento com a haste. A terceira linha não deve conter espaços à direita.
Retorne -1, 0, 1 para cair à esquerda, equilibrar e cair à direita.
fonte
C # (.NET Core) ,
1279590 + 18 = 108 bytesPara esta função, a primeira linha deve ser preenchida à direita, com espaços com o mesmo comprimento que a haste e a terceira linha não deve ter espaços de teste. Essas condições são permitidas (ver comentários da pergunta).
Experimente online!
Saídas:
-1 para a ponta esquerda
0 para o equilíbrio
1 para a ponta direita
fonte
Python 3, 217 bytes
Também funciona no Python 2.7
Retorna 1 para o lado esquerdo, -1 para o lado direito ou zero se equilibrado.
Versão legível:
fonte
sum([...])
, você pode simplesmente tersum(...)
i[c:].find(e)
pode seri.find(e,c)
, usei,m,n=s.split('\n')
e evite a necessidades
,return 2*(r>l) or l>r
reduza drasticamente o custo do teste no final (o valor de retorno é numericamente equivalente, mas é emTrue
vez de1
e emFalse
vez de0
) ou, na verdade, use um conjunto diferente de retorno valores e façareturn (l>r)-(r>l)
para retornar 1, 0 ou -1 da maneira que acmp
função antiga fazia.i[c:]
porque o caminho mais curto causou um problema estranho de um por um para entrada de canto (tente colocar um|
exatamente no meio - acima da barra).PHP, 105 bytes
imprime
-1
/0
/1
para a esquerda / balanço / direita. Execute como pipe-nR
ou experimente online .demolir
fonte
Carvão , 31 bytes
Experimente online! Link é a versão detalhada do código. Saídas 0 para balanço ou -1 ou 1 para cair para a esquerda ou direita. Edit: Alterações no carvão vegetal agora significam que
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
funciona por 24 bytes: Experimente online! Link é a versão detalhada do código. Nota: As duas respostas requerem entrada acolchoada, mas podem ser adaptadas para aceitar entrada não acolchoada a um custo de 3 bytes:≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
Experimente online!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Experimente online! Os links são para a versão detalhada do código.fonte