Desafio:
Você receberá uma imagem ASCII de uma pilha de pesos como entrada e deverá gerar o peso combinado da pilha.
Formato:
Existem 5 pesos diferentes, pesando 1, 2, 5, 10, 20 Passerees (ou alguma outra unidade arbitrária).
Os pesos são assim, em ordem crescente:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
As pesagens serão colocadas simetricamente (como na imagem de exemplo), não necessariamente em uma ordem classificada. As pesagens compartilharão limites, quando aplicável:
Casos de teste:
Você também pode usar todos os pesos únicos como casos de teste.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Regras adicionais:
- Você não pode assumir espaços iniciais adicionais. O maior peso estará todo o caminho para a esquerda.
- Você pode assumir espaços à direita e novas linhas.
- Você pode assumir que haverá no máximo 10 pesos
- Você pode colocar a entrada em um formato opcional, mas não pode substituir os caracteres usados por outra coisa
Isso é código-golfe, portanto o código mais curto em bytes que cada idioma ganha. As explicações são incentivadas como sempre.
Respostas:
Geléia ,
2423 bytesExperimente online!
Quão?
Os pesos podem ser identificados por suas larguras e alturas. As larguras podem ser medidas olhando a distância entre os
|
caracteres da linha . Se primeiro removermos todos os espaços, esses pesos de altura dois contribuirão com uma linha com uma largura medida de um.Os pesos diferentes têm larguras de
3, 7, 7, 15, 21
(para pesos1, 2, 5, 10, 20
respectivamente). Adicionando um trailing1
para aqueles de altura dois, achamos que[3],[7],[7,1],[15,1],[21,1]
convertendo de binários3,7,15,31,43
, o número inteiro dividido por três nos dá1,2,5,10,14
, quais são os pesos, exceto as14
necessidades de substituição por20
.Alternativamente, substitua as larguras medidas de
21
por30
antes da conversão usando“ßœ‘y
:fonte
Python 2 , 77 bytes
Experimente online!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
irá gerar os seguintes trigêmeos[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
que representam o peso, o comprimento e o caractere na base de cada peso, que serão usados para fazer uma representação única de linha única de cada peso.Como o 3º peso se sobrepõe ao 2º, substituo a base pelo corpo (
_
->) e reduzi o valor para
3
(ele contará a base como2
e o corpo como3
, resultando em5
)fonte
Retina 0.8.2 , 60 bytes
Experimente online! Explicação: Os
|
s são substituídos por!
s para facilitar a correspondência e, em seguida, os pesos são convertidos em unários e totalizados. A única parte interessante é que o5
peso é considerado a soma de um2
e um3
peso, enquanto os pesos10
e20
são apenas duas linhas da metade do peso.fonte
JavaScript (Node.js) , 73 bytes
Experimente online!
fonte
Python 3 , 76 bytes
Experimente online!
Quão?
fonte
Tenho certeza de que há algumas melhorias a serem feitas, mas é isso que tenho no momento:
Groovy, 131 bytes
def f(s){s.split('\n').sum{n=0;[2:1,6:2,14:5,20:10].each{k,v->if(it==~".*\\|[ _]{$k}\\|.*"){n=v+(!it.contains('_')&&k==6?1:0)}};n}}
Converte a entrada
String
em aCollection<String>
e soma os resultados para cada linha para obter o total. Usa umMap
onde a chave é o número de espaços ou sublinhados entre os caracteres do canal e o valor é a quantidade correspondente de Passerees. A chave é conectada ao regex para determinar se a linha corresponde a um padrão significativo. A única ressalva é o ternário para adicionar 1 no caso em que o comprimento da subcadeia entre os tubos é 6 e é composto por espaços (em oposição a sublinhados). Se nenhum padrão corresponder, a linha terá um valor 0.fonte
Perl 6 , 57 bytes
Experimente online!
fonte