Essa tarefa faz parte do Primeiro envio periódico de quebra-cabeça de programação Premier .
Você obtém uma hierarquia de itens no seguinte formato:
2
Hat
1
Gloves
que precisam ser colocados em caixas, assim:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
No formato de entrada, os números iniciam uma caixa com tantos itens quanto o número especificado. A primeira caixa contém dois itens (o chapéu e a caixa que contém as luvas); a segunda contém apenas um único item - as luvas.
Como pode ser visto, as caixas também podem viver dentro de caixas. E eles são sempre arredondados ... mais ou menos (cantos pontiagudos são um risco de ferimento e não queremos isso).
Abaixo estão os detalhes desagradáveis para aqueles que desejam utilizar cada minúsculo espaço de manobra que a especificação fornece. Lembre-se, não ler as especificações não é desculpa para enviar soluções erradas. Há um script de teste e alguns casos de teste no final.
Especificação
As caixas são construídas com os seguintes caracteres:
|
(U + 007C) é usado para construir as arestas verticais.-
(U + 002D) é usado para construir as arestas horizontais.'
(U + 0027) são os cantos inferiores arredondados..
(U + 002E) são os cantos superiores redondos.
Uma caixa, portanto, fica assim:
.--. | | '--'
Observe que, embora o Unicode também tenha cantos arredondados e caracteres de desenho de caixa adequados, essa tarefa é apenas em ASCII. Por mais que eu goste do Unicode, percebo que existem idiomas e ambientes por aí que ainda não chegaram na segunda à última década.
As caixas podem conter uma sequência de itens que são texto ou outros itens. Itens individuais em uma caixa são renderizados de cima para baixo. A sequência A, B, C é processada da seguinte maneira:
.---. | A | | B | | C | '---'
É claro que isso também se aplica às caixas aninhadas, que são um item como o texto. Portanto, a sequência A, B, Caixa (C, Caixa (D, E)), F renderizará da seguinte maneira:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
As caixas ajustam seu tamanho ao conteúdo e as caixas aninhadas sempre se estendem ao tamanho de seus pais. Sempre existe um espaço antes e depois do conteúdo, para que nem o texto nem as caixas aninhadas fiquem muito perto da borda da caixa externa. Em resumo, o seguinte está errado:
.---. |Box| '---'
E o seguinte está correto:
.-----. | Box | '-----'
Parece muito melhor também :-)
Os itens de texto (consulte Entrada abaixo) devem ser reproduzidos exatamente.
Sempre há uma única caixa de nível superior (cf. XML). No entanto, uma caixa pode conter várias outras caixas.
Entrada
A entrada é dada na entrada padrão; para um teste mais fácil, provavelmente redirecionado de um arquivo.
A entrada é fornecida em linha, com cada linha representando um item de texto para colocar na caixa atual ou abrindo uma nova caixa.
Cada linha é terminada por uma quebra de linha.
Os itens de texto são marcados por uma linha que não consiste em um número (veja abaixo). O texto usa caracteres alfabéticos, o espaço e a pontuação (
.,-'"?!()
). O texto não inicia nem termina com um espaço e sempre terá pelo menos um caractere.Uma caixa começa com uma única linha com um número. O número indica o tamanho da caixa, ou seja, o número dos seguintes itens que são colocados nela:
2 A B
gera uma caixa com dois itens de texto:
.---. | A | | B | '---'
Uma caixa sempre conterá pelo menos um item.
O final das caixas não é explicitamente marcado com uma linha; em vez disso, as caixas são fechadas implicitamente após o número especificado de itens ser colocado nelas.
Uma caixa é sempre apenas um item, independentemente de quantos itens contenham. Por exemplo
3 A 4 a b c d B
produzirá uma caixa com três itens, o segundo dos quais é outra caixa com quatro itens.
O aninhamento também não afeta o fato de uma caixa ser apenas um item.
Limites
O nível máximo de aninhamento é cinco . Ou seja, existem no máximo cinco caixas uma dentro da outra. Isso inclui o mais externo.
Há um máximo de dez itens por caixa.
Os itens de texto têm um comprimento máximo de 100 caracteres.
Resultado
- Saída é a caixa renderizada, incluindo todos os itens contendo e aninhados de acordo com as regras descritas acima.
- A saída deve ser fornecida na saída padrão e deve corresponder exatamente. Nenhum espaço em branco à esquerda ou à direita é permitido.
- Cada linha deve ser finalizada com uma quebra de linha, incluindo a última.
Condição vencedora
- O código mais curto vence (ou seja, obtém a resposta aceita).
Entrada de amostra 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Saída de amostra 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Entrada de amostra 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Saída de amostra 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Entrada de amostra 3
1
1
1
1
1
Extreme nesting Part Two
Saída de amostra 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Entrada de amostra 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Saída de amostra 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Script de teste
Como acertar os detalhes pode ser difícil às vezes nós ( Ventero e eu) preparamos um script de teste com o qual você pode executar sua solução para verificar se está correto. Está disponível como um script do PowerShell e um script do bash . A invocação é: <test-script> <program invocation>
.
UPDATE: Os scripts de teste foram atualizados; houve vários casos de teste que não respeitavam os limites que eu defini. O script de teste do PowerShell não usou comparação com distinção entre maiúsculas e minúsculas para verificar o resultado. Espero que esteja tudo bem agora. O número de casos de teste foi reduzido para 156, embora o último agora seja bastante ... grande.
ATUALIZAÇÃO 2: Carreguei meu gerador de casos de teste . Escrito em C # , visando o tempo de execução do .NET 2. Funciona em mono. Isso pode ajudar as pessoas a testar sua implementação. Como pior caso definitivo, considerando os limites da tarefa, você pode tentar:
nb.exe 1 10 10 5 100 100 | my invocation
que gerará apenas caixas até o nível mais interno e utilizará o número máximo de itens por caixa e o comprimento máximo de itens de texto. Porém, não incluí este caso de teste no script de teste, pois é muito grande e a saída ainda maior.
ATUALIZAÇÃO 3: Atualizei o script de teste do PowerShell, que estava propenso a gerar erros, dependendo de como as terminações de linha estavam no script e de que termina a linha impressa. Agora deve ser agnóstico para ambos. Desculpe novamente pela confusão.
Respostas:
GolfScript, 125 caracteres
Usando uma abordagem semelhante à solução de Keith .
fonte
Python, 204 caracteres
P
retorna uma lista de triplos, cada um dos quais é um prefixo / sufixo de linha (o sufixo é o reverso do prefixo), algum texto de linha e um caractere de preenchimento de linha. Depois de calcular todos os triplos, eles são impressos usando o número certo de caracteres de preenchimento para tornar todas as linhas do mesmo comprimento.Versão não destruída:
fonte
P
lá.Ruby 1.9, 174 caracteres
Um pouco semelhante à solução de Keith .
fonte
APL (78)
fonte
Python -
355314259 caracteresfonte
Ruby 1.9,
229228226223222fonte
C,
390366363 caracteresAjuntar com
gcc -std=gnu99 -w file.c
Nem mesmo perto da versão de Keith, mas ei, é bom ol 'C
fonte
160/160 passed
(eu quis dizer uma seqüência de 100 caracteres, que não está presente de qualquer maneira)FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011
comgcc version 4.2.1 20070719 [FreeBSD]
x64 aqui. Aceito sua palavra pelos 160, então :-). E deve haver um caso de teste com 100 caracteres, na verdade (Testes 143-147).python muito funcional, 460 caracteres
fonte
|
caracteres não estão espaçados corretamente. É muito semelhante à minha solução pythonHaskell, 297 caracteres
Enquanto golfe, o método é bastante simples. Somente limites estão disponíveis na memória.
fonte
C # -
1005 859 852782 caracteresPreciso dar uma nova olhada nisso, pois tenho certeza de que ela pode ser melhorada, mas esta é minha terceira passagem
inicial.Ungolf'd:
fonte
var a = 1, b = 2, c = 3;
. Você não pode fazer a mesma coisa em C?var
instruções implícitas como essa. Você só pode combinar se eles tiverem um tipo explícito como o Joey mencionado usandostring b="",e=""
.PHP,
403388306 caracteresUngolfed:
Peguei emprestada a ideia do prefixo de Keith (isso é permitido?), Caso contrário, isso é muito parecido com o original. Ainda não conseguia ficar abaixo de 300. Preso com isso. Em diante.
fonte
PHP,
806769721653619 caracteresVersão não destruída:
fonte
<?
no início para ser executado. Aparentemente, você está usando o comprimento máximo de todos os itens de texto em um caso de teste como a largura da caixa mais interna. Esse código passa apenas em 118 dos casos de teste (testados no Linux e FreeBSD). Eu não tenho idéia o que você fez para o script PowerShell que não iria funcionar, embora :-( Invocando-lo como.powershell -noprofile -file test.ps1 php boxes.php
Deve funcionar, na verdade Mas eu não tenho PHP na minha máquina Windows para teste..Java -
681668 caracteresessencialmente o mesmo método que o código Python de Keith Randall
Versão não destruída:
fonte
throws
.break;
)char
comparações, olhando para códigos ASCII para mais ... mas eu tenho que ir prepare-se para fériasPerl -
200199 caracteresMesmo algoritmo que o Python de Keith Randall (design agradável, Keith), mas um pouco mais compacto neste Perl.
fonte
$_@_@_
parece alguém perseguindo o sinal de cifrãoF # - 341 caracteres
Uma versão em F # da solução de Keith. Como as listas são imutáveis por padrão, essa versão reúne toda a função recursiva em uma lista e retorna a lista, da qual os itens são extraídos usando o
for..do
loop e ayield!
. Não consegui encontrar uma maneira de reverter o prefixo de forma concisa, então apenas coloquei o sufixo nos triplos.Para sua informação, o método TryParse retorna um duplo
(bool,int)
.fonte
Clojure - 480 caracteres
Este é o meu primeiro programa Clojure e a minha primeira tentativa de golfe Clojure; portanto, nem é preciso dizer que isso não deve ser considerado um representante das soluções Clojure em geral. Tenho certeza de que poderia ser reduzido significativamente, especialmente se o método de Keith Randall de analisar e construir as caixas de uma só vez fosse implementado.
fonte
C # -
472 470 426 422398 caracteresfonte
goto
! By the way, você pode omitir os parênteses em torno dos argumentos lambdaz
ev
, trazendo este para baixo a 421.Scala - 475 caracteres
fonte
C #
1198 1156 1142 689 671634 caracteresfonte
\n
parece ser suficiente no final.Pip , 89 bytes (não concorrente)
(A linguagem é mais nova que o desafio. Além disso, eu não conseguia superar o APL.)
O código é 87 bytes, +2 para
-rn
sinalizadores.Experimente online!
A função
z
processa o primeiro item da lista de entrada (g
copiado para a variável globali
para estar disponível nas chamadas de função). Se esse for um número n , ele se chama recursivamente n vezes, coloca a lista de linhas resultante em um retângulo completo, agrupa cada linha"| " " |"
e adiciona.---.
e'---'
linhas antes de retornar a nova lista. Se for uma string, simplesmente a converte em uma lista de um item e a retorna. O resultado final é impresso com nova linha separada (-n
sinalizador). Mais detalhes disponíveis mediante solicitação.fonte
Java (1369 caracteres, incluindo EOLs)
Não foi possível deixar isso sem uma implementação Java. Supõe-se que Java seja mais detalhado que os truques de Python e Ruby, por isso optei por uma solução elegante e recursiva.
A idéia é uma árvore (gráfico) de objetos (strings e caixas), contendo um ao outro a partir de uma caixa "head". Ao analisar linearmente o arquivo de entrada, você adiciona seqüências de caracteres e caixas à caixa "atual" e, enquanto adiciona, o comprimento máximo do contêiner é ajustado. Quando um contêiner atinge a quantidade de itens predefinidos que pode reter o retorno ao contêiner anterior. No final do arquivo de entrada, você tem um contêiner "head" que já possui um "maxLength" calculado; portanto, basta chamar o método print ().
É realmente uma solução agradável para escrever. Gostei muito da pergunta. Como mencionei anteriormente, optei pela elegância da solução e não pela abordagem minimalista, infelizmente o Java não possui a impressão "-" * 4 do Python para produzir "----" :-)
Aqui está a versão não destruída:
fonte