Aqui está uma descrição ASCII bastante simples de um livro aberto:
|\
| \
| \
| \
| \__________
| || |
| || Lorem i |
\ || psum do |
\ || lor sit |
\ || amet, |
\ || consect |
\||_________|
Observe que a parte do texto está apenas na página direita e tem 7 caracteres de largura por 5 de altura. Observe também que a borda superior do livro possui 5 barras invertidas e 10 sublinhados. O 10 vem da largura do texto mais 3 e o 5 é metade de 10.
Usando o mesmo formato de escala, podemos redimensionar o livro para ter uma área de texto com caracteres de largura eh alto, onde w é qualquer número inteiro positivo ímpar e h é qualquer número inteiro positivo.
Alguns livros w × h : 1 × 1, 1 × 2, 3 × 2
|\
|\ | \
|\ | \____ | \______
| \____ | || | | || |
| || | | || L | \ || Lor |
\ || L | \ || o | \ || em |
\||___| \||___| \||_____|
O número de sublinhados na parte superior é sempre w +3 e o número de barras invertidas é sempre ( w +3) / 2.
Objetivo
Escrever um progama que leva um nome de arquivo e w e h como argumentos de linha de comando, e produz um livro com essas dimensões de texto para stdout, exibindo o conteúdo do arquivo.
Quando o arquivo tiver mais texto do que caberá em uma página, a N
chave deverá imprimir a próxima página e B
voltar uma página. Nada deve acontecer se B
for pressionado na primeira página ou N
pressionado na última página. O programa deve parar quando a Q
tecla for pressionada.
Exemplo
Suponha que f.txt
contém Lorem ipsum dol?
e o usuário tenha pressionado a sequência de teclas N N B N N Q
. O programa deve executar algo como isto:
>>> bookmaker f.txt 3 2
|\
| \
| \______
| || |
\ || Lor |
\ || em |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
>>>
Observe que há uma nova linha após cada livro e não há espaços à direita. Isso é necessário.
Notas
- Você pode assumir que o arquivo contém apenas caracteres ASCII imprimíveis (hex 20 a 7E).
- Imprima um caractere em cada ponto disponível, independentemente dos limites das palavras.
- w e h são opcionais argumentos que padrão a 7 e 5, respectivamente. Seu programa receberá um ou ambos. (Você pode assumir que a entrada está sempre bem formada.)
- Preencha qualquer espaço de texto vazio na última página com espaços.
Q
ainda será necessário sair se houver apenas uma página.
Ganhando
O programa mais curto em bytes após a aplicação dos bônus vence.
Bónus
- Remova os espaços à esquerda para que cada linha comece com uma palavra (ou segmento de palavra). por exemplo,
| amet, |
no primeiro exemplo se tornaria| amet, c |
. (-30 bytes) - Limpe a tela dos livros previamente desenhados depois
N
ouB
pressionada (eT
se você fizer o bônus depois disso) para que o livro pareça com as páginas em mudança. (-20 bytes) Faça com que a
T
chave alterne instantaneamente entre o texto que está sendo desenhado da esquerda para a direita, de cima para baixo (o padrão), de cima para baixo, da esquerda para a direita. Se você fez o primeiro bônus, ele deve funcionar para colunas no modo de cima para baixo. (-100 bytes)Então, por exemplo:
|\ | \ | \______ | || | \ || Lor | \ || em | \||_____|
torna-se
|\ | \ | \______ | || | \ || Lrm | \ || oe | \||_____|
fonte
\033[2J\033[;H
Respostas:
C # 535bytes
A pontuação é 655 bytes de código -20 bytes de bônus para limpeza e -100 bytes de bônus para a chave T ... Acho que não posso dizer que tenho certeza de que não perdi algo nas especificações
Posso tentar recolher os loops fazendo com que o método W retorne o argumento s, mas isso exigiria esforço, portanto não há promessas.
Código de golfe:
Formatado um pouco:
fonte
Java,
10391001993953946Com bônus: Remova os espaços à esquerda (-30 bytes) ->
1009971963923916Limpar a tela não vale a pena com java (exceto se eu imprimir algumas linhas novas. Mas o usuário precisará usar o tamanho correto do console)
Código:
Bonita:
Se o programa não precisar ser executado para sempre, eu também poderia salvar alguns bytes removendo o loop while e apenas chamando main.
Isso não é ideal, mas é um começo.
fonte
public
palavras - chave ... Além disso,import java.*;
funciona?import java.*;
também, mas não funciona. E o método principal precisa ser exatamentepublic static void main(String[]c)
(inclusivepublic
), caso contrário, não é reconhecido. Mas a turma, claro, não precisa ser pública, boa captura.