O objetivo deste desafio é produzir uma versão ASCII da capa deste grande álbum da banda de rock Pink Floyd.
As junções de tijolo são feitas de caracteres _
e |
. Os tijolos têm caracteres de largura 7 e altura 2, excluindo junções. Portanto, a unidade básica, incluindo as junções, é:
_________
| |
| |
_________
Cada linha de tijolos é compensada pela largura de meio tijolo (4 caracteres) em relação à linha anterior:
________________________________________
| | | | |
| | | | |
________________________________________
| | | | |
| | | | |
________________________________________
| | | | |
| | | | |
A parede é parametrizada da seguinte forma. Todos os parâmetros são medidos em caracteres, incluindo junções:
- Deslocamento horizontal da primeira linha
F
,. Esta é a distância entre a margem esquerda e a primeira junção vertical da linha superior. (Lembre-se também do deslocamento relativo de meio tijolo entre as linhas). Seus possíveis valores são0
,1
, ...,7
. - Total de largura ,
W
. Isso inclui junções. Seu valor é um número inteiro positivo. - Total de altura ,
H
. Isso inclui junções. Seu valor é um número inteiro positivo.
O topo da parede sempre coincide com o topo de uma linha. O fundo pode estar irregular (se a altura total não for um múltiplo de 3
). Por exemplo, aqui está a saída para 6
, 44
, 11
:
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
| | | | | |
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
e uma explicação visual dos parâmetros:
F=6
......
. ____________________________________________
. | | | | |
. | | | | |
. ____________________________________________
. | | | | | |
H=11 . | | | | | |
. ____________________________________________
. | | | | |
. | | | | |
. ____________________________________________
. | | | | | |
............................................
W=44
Regras adicionais
Você pode fornecer um programa ou uma função.
O formato de entrada é flexível, como de costume. A saída pode ser através de STDOUT ou um argumento retornado por uma função. Nesse caso, pode ser uma string com novas linhas ou uma matriz de strings.
Espaços à direita ou novas linhas são permitidos.
O menor código em bytes vence.
Casos de teste
As entradas estão na ordem dada acima, ou seja: deslocamento horizontal da primeira linha, largura total, altura total.
6, 44, 11:
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
| | | | | |
____________________________________________
| | | | |
| | | | |
____________________________________________
| | | | | |
2, 20, 10:
____________________
| | |
| | |
____________________
| |
| |
____________________
| | |
| | |
____________________
1, 1, 1:
_
1, 2, 3:
__
|
|
3, 80, 21:
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
________________________________________________________________________________
| | | | | | | | | |
| | | | | | | | | |
Respostas:
Pitão,
4327 bytesEu preciso de golfe-lo fortemente ... o resultado é muito vergonhoso.
Experimente já online.
Formato de entrada
Formato de saída
Explicação
fonte
C,
86858382 bytes3 bytes salvos graças ao Lynn.
1 byte economizado graças a charlie.
fonte
for(i=0;++i<w*h;)
ou sei
for tornado local (param trick): #for(;++i<w*h;)
i;
pori=1;
e salve mais um byte no loop for.for(i=1;i<w*h;++i)
->for(i=0;++i<w*h;)
salva 1C, 92 bytes
Invocar como
b(F, W, H)
.fonte
Perl, 63 bytes
Contando o shebang como 2, a entrada é obtida de stdin, com espaço em branco separado.
Uso da amostra
fonte
Haskell, 83 bytes
Isso define uma função infix ternária
!
que retorna uma lista de strings. Exemplo de uso:Como funciona:
fonte
JavaScript (ES6),
9695 bytesExplicação: Cria uma sequência de 7 espaços repetidos mais
|
padrão ou apenas_
s repetidos , mas pelo menos o tempo suficiente para poder extrair osw
caracteres necessários para cada linha. As três primeiras linhas começam na posiçãof^7
e, em seguida, as próximas três linhas começam na posiçãof^3
, então eu consigo issoalternando o bit 2 deusando o bit oposto 2 nas duas últimas linhas de cada bloco de 6 para economizar 1 byte.f
cada terceira linhafonte
MATL,
423633 bytesFormato de entrada é:
nCols
,offset
,nRows
Experimente Online
A abordagem aqui é que configuramos um "modelo" no qual indexamos usando os índices de linha (
[1 2 ... nRows]
) e os índices de coluna alterados pela primeira entrada ([1 2 ... nCols] - shift
). Graças à indexação modular do MATL, ele resultará automaticamente em uma saída lado a lado. Como nota lateral, para economizar espaço, tecnicamente eu trabalho com uma versão transposta do modelo e, em seguida, apenas faço uma transposição (!
) no final.O modelo é este:
fonte
Python 2,
9388 bytes2º nível de recuo é tab.Salvando alguns bytes graças a Leaky Nun e algumas próprias modificações, agora também o deslocamento correto:código anterior:
Mesmo comprimento que lambda sem nome:
fonte
F,W,H=input()
print
h/3%2*4
ou emh%6/3*4
vez de #4*(h%6>3)
print
declaração na mesma linha que afor
declaração"| "
é menor do que("|"+7*" ")
se eu contar corretamenteQBasic,
121109 bytes(Testado em QB64)
Agradeço a @DLosc por jogar minha
IF
declaração com um equivalente matemático. Isso valia 12 bytes.Método Geral:
Loop através de cada célula um de cada vez e determinar se ele deve ser um
_
,ou
|
dependendo de sua localização.MOD
As instruções e a lógica booleana são usadas para determinar os limites dos blocos e quanto os escalonar.Código:
Nota de uso:
O QBasic espera que a entrada seja números separados por vírgulas.
fonte
IF
/THEN
acrescenta ainda mais parênteses mas economiza 12 bytes:?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
Java,
149,147,146, 143 bytesGolfe:
Ungolfed:
fonte
> 0
que pode salvar dois caracteres. E é claro que você pode combinar as declarações paraint y=0,x
.int
antes dox
e usarint y=0,x
no primeiro loop for para salvar 2 bytes. Além disso, atualmente você pode mudary%3==0
paray%3<1
. (Isto não é possível para...%8==0
a...&8<1
embora, desde a sua operação poderia retornar um número negativo.)int...o
como parâmetro e alterandow
parao[1]
,h
parao[2]
eo
parao[0]
é -3 bytes.Rubi,
7266 bytesObrigado @Value Ink por 6 bytes!
Multiplicação e corte simples de cordas.
Funciona no Ruby 2.3.0 (a versão 2.1 da Ideone gerou erro de sintaxe).
fonte
i%6/4*4
vez de(i%6>3?4:0)
e use em?_
vez de'_'
, em?|
vez de'|'
.?
truque de caractere único, e a parte "matemática" é realmente impressionante!((' '*7+?|)*w)[f^7^i%6&4,w]
economiza dois bytes.Julia:
150128116108107 bytespara executar com argumentos:
julia -e 'o=2;h=18;w=40;include("codegolf.jl")'
Se você acha que chamar do bash está trapaceando e deseja uma função dentro do intérprete, a versão da função é 117 bytes :)
demonstração
(Obrigado, @ glen-o pela dica extra de economia de bytes!)
fonte
h
ew
em tijolos, e não em caracteresrepmat([32],6,8)
) e renomear repmat para raspar outro caractere (g=repmat;b=g([32],6,8)
e posteriorb=g(b,h,w)[1:h,o+1:o+w+1]
). Substituareinterpret
pormap
. Pela minha contagem, você salvará 9 bytes entre essas alterações.JavaScript,
172168165157147142137 bytesfonte
s.repeat(w)
vez deArray(w).fill(s).join``
?Dyalog APL, 29 bytes
↑⎕⍴⎕⍴¨a,4⌽¨a←'_',2⍴⊂⌽⎕⌽¯8↑'|'
testes de:
6 44 11
,2 20 10
,1 1 1
,1 2 3
,3 80 21
⎕
é entrada avaliada; como a expressão executa da direita para a esquerda, ele solicitaF
,W
eH
nessa ordem¯8↑'|'
é' |'
⎕⌽
é girar, ele corta F caracteres da frente e os coloca no final da stringo outro
⌽
meio reverso'_',2⍴⊂
cria uma tupla 3 de '_' seguida por duas cópias separadas da sequência até agoraa,4⌽¨a←
anexar a 4-rotação de tudo até agora, acabamos com uma 6-tupla⎕⍴¨
remodelar cada elemento para a largura⎕⍴
remodelar para a altura↑
misturar vetor de vetores em uma matrizfonte
Na verdade ,
444340 bytesEsta é realmente uma porta do algoritmo na resposta JS de Neil . Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing:
fonte
PowerShell ,
10188 bytesExperimente online!
fonte
Oitava
8076 bytespara executar a partir do terminal:
octave --eval "o=2;h=18;w=44; codegolf"
(como alternativa, se você acha que a chamada do terminal está trapaceando: p, uma implementação de função anônima leva 86 bytes :)
Ligue
f(2,18,44)
para o intérprete de oitava.fonte
Bash + Sed,
411395381370 bytes:Bem, aqui está minha primeira resposta no Bash, ou em qualquer linguagem de script de shell. Essa também é de longe a resposta mais longa aqui. Recebe uma sequência de argumentos de linha de comando separados por espaço no formato
Offset Width Height
. Provavelmente, isso pode ser muito mais curto do que é atualmente; portanto, são bem-vindas dicas e / ou truques para jogar golfe com menos força.fonte
Delphi / Object Pascal,
305,302, 292 bytesPrograma de console completo que lê 3 parâmetros.
destroçado
Infelizmente, o Delphi não possui um operador ternário e é uma linguagem bastante detalhada.
caso de teste
Editar: pode se barbear de 3 bytes usando byte como tipo para todas as variáveis.
Edit 2: E os aplicativos de console não precisam da declaração do programa, -10
fonte