Você recebe vários tubos de ensaio ASCII, sua tarefa é reduzir o número de tubos de ensaio usados.
Cada tubo de ensaio é assim:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Obviamente, ~~
é o nível da água. O tubo de ensaio também pode estar vazio; nesse caso, não há ~~
caracteres dentro. O tubo único pode conter até 8 unidades de nível de água.
Você recebe um número finito de tubos de ensaio com diferentes níveis de água no interior. Você precisa derramar a água na menor quantidade possível de tubos de ensaio e produzir o resultado.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Como você pode ver, os tubos de ensaio são separados com espaço único. Tubos vazios não devem ser mostrados na saída. Este é o código golf, então o código com o menor número de bytes vence.
Casos de teste: http://pastebin.com/BC0C0uii
Feliz golfe!
Respostas:
Pitão,
484544 bytesExperimente online.
Imprime um único espaço à direita em cada linha.
fonte
JavaScript (ES6),
159148 bytesProduz um avanço de linha à direita. Editar: salvou 11 bytes com alguma ajuda do @Arnauld.
fonte
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
deve salvar 4 bytes. Você pode querer inicializar n para -1 e usarn>>3
e~n&7^i
salvar mais um byte.-1
ideia, mas pude aprimorá -lareplace
.1/"\n"
era verdade.Perl, 150 bytes
149 bytes de código +
-n
sinalizador.Não vou explicar todo o código, apenas algumas coisas:
$l+=9-$.for/~~/g
conta quanta água há na entrada.A segunda parte do código imprime a saída. A idéia é colocar o maior número possível de tubos totalmente cheios e um último que contenha a água que resta (se houver). Assim, o algoritmo está em 4 partes: imprime a primeira linha de água (o topo de tubos):
say"|~~| "x$v.($@="| | ")x$r
. Em seguida, imprima partes vazias de tubos até chegar ao nível de água do último tubo:say$:=$@x$%for$l%8..6
. Em seguida, imprima o nível onde a água último tubo é:say$@x$v."|~~|"x$r
. Em seguida, imprima todos os restantes níveis de "vazio":say$:for 2..$l%8;
. E, finalmente, imprimir a linha de fundo:say"|__| "x$%
.Os nomes de variáveis tornam difícil de ler (
$%
,$@
,$:
), mas permite a palavras-chave comox
efor
para ser escrito após a variável sem espaço.Para executá-lo:
Não estou muito satisfeito com a duração dessa resposta. Tentei tirar o melhor proveito do meu algoritmo, mas uma abordagem diferente provavelmente poderia ser mais curta. Vou tentar trabalhar em breve.
fonte
Befunge,
144138 bytesExperimente online!
As duas primeiras linhas processam a entrada, basicamente ignorando tudo, exceto o primeiro caractere em cada tubo que pode ser um marcador de nível. Pegamos o valor ASCII desse caractere, dividimos por 2 e mod 2 (fornecendo 1 ou 0, dependendo de estarmos em um marcador de nível ou não), multiplicamos pelo número da linha (contagem decrescente de 8, fornecendo-nos o valor do nível para esse tubo) e adicione-o a um total em execução.
A saída é tratada nas duas segundas linhas, começando essencialmente na extremidade direita da terceira linha. Primeiro calculamos o número de tubos tomando o nível total de água mais 7 dividido por 8. Em seguida, ao iterar sobre as linhas de todos os tubos, calculamos o caractere a ser exibido dentro de um tubo específico ( t , contando até 0) por um dada linha ( r , contagem decrescente de 8 a 0) da seguinte forma:
O char_type calculado é -1 para a linha mais baixa (a base do tubo), 0 para qualquer outra área que não esteja no nível da água e 1 para o nível da água. Portanto, ele pode ser usado como uma simples pesquisa de tabela para o caractere apropriado a ser produzido (você pode ver esta tabela no início da linha 4).
fonte
Haskell, 186 bytes
Exemplo de uso:
Coloca um espaço à direita em cada linha. Como funciona:
A principal dor foi a falta de uma função que conta com que frequência uma substring ocorre em uma string. Há
count
noData.Text
, mas importá-lo leva a um monte de conflitos de nomes que são muito caros para resolver.fonte
Python, 261 bytes
Sinto que sinto falta de algo. Além disso, se várias linhas novas forem aceitáveis para a saída em branco, eu poderia perder alguns bytes. Toma entrada como
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.fonte
Ruby , 139 bytes
(138 bytes de código mais um byte para o
-n
)Experimente online!
Algumas explicações:
Atualização 1: Adicionados detalhes sobre variáveis,
gsub
truques eEND{
…}
fase.Atualização 2: (± 0 bytes no total)
n||=0
vez den=n||0
(-1 byte)-n
(+1 byte)fonte
Python 3, 404 bytes
Este programa cria a saída total pretendida com os níveis de água nos formatos ASCII e numérico.
fonte