No fim das contas, é apenas outro truque no código de golfe

64

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:

  1. 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ão 0, 1, ..., 7.
  2. Total de largura , W. Isso inclui junções. Seu valor é um número inteiro positivo.
  3. 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:
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
Luis Mendo
fonte
34
Você me pegou com o clickbait no hnq #
Rohan Jhunjhunwala
2
@RohanJhunjhunwala Parece certo
Insano
4
Obrigado por combinar o número de sílabas nas letras ... você não acreditaria em quantas pessoas tentam reproduzir uma música e interpretar errado a silabificação, isso me deixa louco!
precisa saber é o seguinte
11
@ChrisCirefice Haha, obrigado! O título foi uma parte importante deste desafio
Luis Mendo

Respostas:

17

Pitão, 43 27 bytes

Eu preciso de golfe-lo fortemente ... o resultado é muito vergonhoso.

AQVE<*H?%N3X*8d+G*4/N3\|\_H

Experimente já online.

Formato de entrada

6,44
11

Formato de saída

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 

Explicação

AQVE<*H?%N3X*8d+G*4/N3\|\_H   First two inputs as list in Q,
                              third input as E.

AQ                            Assign G to the first item in Q
                              and H to the second item in Q.
  VE                          For N from 0 to E-1:
                   /N3            N floor-div 3.
                                    if N gives a remainder of 3 or 4 or 5
                                    when divided by 6, this will be odd;
                                    otherwise, this will be even.
                 *4               Multiply by 4.
                                    if the above is odd, this will leave
                                    a remainder of 4 when divided by 8;
                                    otherwise, the remainder would be 0.
               +G                 Add G (as an offset).
           X*8d       \|          In the string "        " (*8d),
                                  replace (X) the character with the
                                  index above with "|" (modular indexing,
                                  hence the manipulation above).
       ?%N3             \_        If N%3 is non-zero, use the above;
                                  otherwise, use "_".
     *H                           The above repeated H times.
    <                     H       Take the first H characters of above.
                                  Implicitly print with newline.
Freira Furada
fonte
parece que você venceu
wordsforthewise 20/08
30

C, 86 85 83 82 bytes

3 bytes salvos graças ao Lynn.
1 byte economizado graças a charlie.

i;f(o,w,h){++w;for(i=0;++i<w*h;)putchar(i%w?i/w%3?i%w+i/w/3*4+~o&7?32:124:95:10);}
orlp
fonte
11
for(i=0;++i<w*h;)ou se ifor tornado local (param trick): #for(;++i<w*h;)
charlie
substitua i;por i=1;e salve mais um byte no loop for.
precisa saber é o seguinte
for(i=1;i<w*h;++i)-> for(i=0;++i<w*h;)salva 1
Yay295
@ xryl669 Isso não é válido, as funções devem ser reutilizáveis.
orlp
@ Yay295 Eu creditei a Charlie isso, já que ele postou 7 horas antes.
orlp 17/08/16
26

C, 92 bytes

b(f,w,h,y,x){for(y=0;y<h;y++,puts(""))for(x=0;x<w;x++)putchar(y%3?(x+y/3*4-f)%8?32:124:95);}

Invocar como b(F, W, H).

Lynn
fonte
3
Apenas 92 bytes em C? Isso é incrível.
Freira vazada
85 bytes
ceilingcat
13

Perl, 63 bytes

#!perl -nl
$y+=print+map$y%3?$_++-$`&7?$":'|':_,($y%6&4)x$&for/ \d+/..$'

Contando o shebang como 2, a entrada é obtida de stdin, com espaço em branco separado.

Uso da amostra

$ echo 2 20 10 | perl bricks.pl
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________
primo
fonte
11

Haskell, 83 bytes

q s="_":[s,s]
(f!w)h=take h$cycle$take w.drop(7-f).cycle<$>q"       |"++q"   |    "

Isso define uma função infix ternária !que retorna uma lista de strings. Exemplo de uso:

*Main> putStrLn $ unlines $ (3!14) 7
______________
   |       |  
   |       |  
______________
       |      
       |      
______________

Como funciona:

            q"       |"++q"   |    "  -- build a list of 6 strings
                                      --   1:     "_"
                                      --   2:     "       |"
                                      --   3:     "       |"
                                      --   4:     "_"
                                      --   5:     "   |    "
                                      --   6:     "   |    "
         <$>                          -- for each of the strings
     take w.drop(7-f).cycle           -- repeat infinitely, drop the first 7-f chars
                                      --    and take the next w chars
  cycle                               -- infinitely repeat the resulting list
take h                                -- and take the first h elements
nimi
fonte
11
Respostas como essa me fazem querer aprender esse idioma.
GuitarPicker 16/08
3
Pensei em Haskell ao ler a descrição do problema. "Repetir infinitamente" é um recurso realmente interessante de se ter.
DLosc
10

JavaScript (ES6), 96 95 bytes

g=
(f,w,h)=>[...Array(h)].map((_,i)=>(i%3?`       |`:`_`).repeat(w+7).substr(f^7^i%6&4,w)).join`
`
;
<div onchange=o.textContent=g(f.value,w.value,+h.value)><input id=f type=number min=0 max=7 placeholder=Offset><input id=w type=number min=0 placeholder=Width><input id=h type=number min=0 placeholder=Height></div><pre id=o>

Explicaçã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 os wcaracteres necessários para cada linha. As três primeiras linhas começam na posição f^7e, em seguida, as próximas três linhas começam na posição f^3, então eu consigo isso alternando o bit 2 de fcada terceira linha usando o bit oposto 2 nas duas últimas linhas de cada bloco de 6 para economizar 1 byte.

Neil
fonte
7

MATL, 42 36 33 bytes

:-Q'_ | |'[DClCl]Y"8et4YShwi:3$)!

Formato 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:

________
       |
       |
________
  |     
  |     
Suever
fonte
11
Utilização agradável de codificação de comprimento de execução para gerar o padrão
Luis Mendo
6

Python 2, 93 88 bytes

2º 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:

def f(F,W,H):
 for h in range(H):print["_"*W,((("|"+7*" ")*W)[8-F+h%6/3*4:])[:W]][h%3>0]

código anterior:

def f(F,W,H,x="|"+7*" "):
 for h in range(H):
    print ["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]

Mesmo comprimento que lambda sem nome:

lambda F,W,H,x="|"+7*" ":"\n".join(["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]for h in range(H))
Karl Napf
fonte
F,W,H=input()
Freira vazada
remover o espaço em branco depoisprint
Leaky Nun
use h/3%2*4ou em h%6/3*4vez de #4*(h%6>3)
Leaky Nun
Você não precisa do segundo nível de recuo. Basta colocar a printdeclaração na mesma linha que a fordeclaração
Leaky Nun
"| "é menor do que ("|"+7*" ")se eu contar corretamente
Leaky Nun
6

QBasic, 121 109 bytes

(Testado em QB64)

Agradeço a @DLosc por jogar minha IFdeclaraçã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. MODAs instruções e a lógica booleana são usadas para determinar os limites dos blocos e quanto os escalonar.

Código:

INPUT F,W,H
FOR y=0TO H-1:FOR x=0TO W-1
?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
NEXT:?:NEXT

Nota de uso:

O QBasic espera que a entrada seja números separados por vírgulas.

GuitarPicker
fonte
11
Usando matemática em vez de IF/ THENacrescenta 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);
DLosc
Obrigado pelo comentário. Na minha cabeça, eu tinha pensado em explorar matemática, mas não o fiz. Fiz algo semelhante a isso para colorir uma imagem em um envio recente , mas a implementação que usei não tinha um operador MOD.
GuitarPicker 17/08/16
5

Java, 149 , 147 , 146 , 143 bytes

Golfe:

String f(int o,int w,int h){String s="";for(int y=0,x;y<h;++y){for(x=0;x<w;++x){s+=y%3>0?(x-o+(y-1)/3%2*4)%8==0?'|':' ':'_';}s+='\n';}return s;}

Ungolfed:

public class AllInAllItsJustUhAnotherTrickInCodeGolf {

  public static void main(String[] args) {
    int offset = 6;
    int width = 44;
    int height = 11;
    System.out.println(new AllInAllItsJustUhAnotherTrickInCodeGolf()
        .f(offset, width, height));
  }

  // Begin golf
  String f(int o, int w, int h) {
    String s = "";
    for (int y = 0, x; y < h; ++y) {
      for (x = 0; x < w; ++x) {
        s += y % 3 > 0 ? (x - o + (y - 1) / 3 % 2 * 4) % 8 == 0 ? '|' : ' ' : '_';
      }
      s += '\n';
    }
    return s;
  }
  // End golf

}

fonte
11
Talvez você possa mudar a ordem do ternário comparando com o > 0que pode salvar dois caracteres. E é claro que você pode combinar as declarações para int y=0,x.
Frozn 18/08/19
Como dito por Frozn , você pode remover int antes do xe usar int y=0,xno primeiro loop for para salvar 2 bytes. Além disso, atualmente você pode mudar y%3==0para y%3<1. (Isto não é possível para ...%8==0a ...&8<1embora, desde a sua operação poderia retornar um número negativo.)
Kevin Cruijssen
Feito e feito. Você está correto, esse segundo módulo pode retornar negativo e ocorreu durante a depuração quando escrevi originalmente essa função.
11
Não sabe ao certo como perdemos isso, mas você pode remover os espaços nos seus parâmetros para -2 bytes. Como alternativa, usando int...ocomo parâmetro e alterando wpara o[1], hpara o[2]e opara o[0]é -3 bytes.
Kevin Cruijssen 28/10
4

Rubi, 72 66 bytes

->f,w,h{h.times{|i|puts i%3<1??_*w:((?|+' '*7)*w)[8-f+i%6/4*4,w]}}

Obrigado @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).

Leibrug
fonte
2
Use em i%6/4*4vez de (i%6>3?4:0)e use em ?_vez de '_', em ?|vez de '|'.
Value Ink
Obrigado. Esqueci o ?truque de caractere único, e a parte "matemática" é realmente impressionante!
precisa saber é o seguinte
11
Eu acho que ((' '*7+?|)*w)[f^7^i%6&4,w]economiza dois bytes.
Neil
Obrigado @Neil. Vou editar o código ... assim que eu entendo como a sua sugestão funciona :)
Leibrug
4

Julia: 150 128 116 108 107 bytes

# in codegolf.jl
r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...)

para 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 :)

f(o,h,w)=(r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...))

demonstração

(Obrigado, @ glen-o pela dica extra de economia de bytes!)

Tasos Papastylianou
fonte
Bem-vindo ao PPCG! Prazer em vê-lo também aqui!
Luis Mendo
Observe que as entradas devem ser tomadas explicitamente, ou seja, você precisa de algum tipo de instrução de entrada para essas três variáveis. Ou você pode usar uma função que os aceite como argumentos e produza ou exiba o resultado. Quando terminar, você pode postar uma demonstração online usando o Experimente online!
Luis Mendo
ah sim eu fiz! : p
Tasos Papastylianou
11
Você pode salvar alguns caracteres usando repmat em vez de ones ( repmat([32],6,8)) e renomear repmat para raspar outro caractere ( g=repmat;b=g([32],6,8)e posterior b=g(b,h,w)[1:h,o+1:o+w+1]). Substitua reinterpretpor map. Pela minha contagem, você salvará 9 bytes entre essas alterações.
Glen O
3

JavaScript, 172 168 165 157 147 142 137 bytes

(O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

N = (O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

let test_data = [[6,44,11],
                 [2,20,10],
                 [1,1,1],
                 [1,2,3],
                 [3,80,21]];

for (test of test_data)
    console.log(N(...test));

Yay295
fonte
Por que não usar em s.repeat(w)vez de Array(w).fill(s).join``?
Neil
@ Neil: Boa ideia, mas pensei em algo melhor.
precisa saber é o seguinte
e então percebi que sua solução é melhor do que eu pensava. Obrigado!
precisa saber é o seguinte
3

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 solicita F, We Hnessa ordem

¯8↑'|' é ' |'

⎕⌽ é girar, ele corta F caracteres da frente e os coloca no final da string

o outro meio reverso

'_',2⍴⊂ cria uma tupla 3 de '_' seguida por duas cópias separadas da sequência até agora

a,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 matriz

ngn
fonte
2

Na verdade , 44 43 40 bytes

Esta é realmente uma porta do algoritmo na resposta JS de Neil . Sugestões de golfe são bem-vindas. Experimente online!

╗╝r⌠;6(%4&╜7^^╛'|7" "*+*t╛@H╛'_*3(%YI⌡Mi

Ungolfing:

          Takes implicit input in the order h, w, f.
╗╝        Save f to register 0. Save w to register 1.
r⌠...⌡M   Map over range [0..h-1]. Call this variable i.
  ;         Duplicate i
  6(%       i%6...
  4&        ...&4
  ╜7^^      ...^i^7. Call it c.
  ╛         Push w.
  '|7" "*+  The string "       |"
  *t╛@H     (("       |" * w)[c:])[:w]
  ╛'_*      Push "_" * w
  3(%       Push 3, move duplicate i to TOS, mod.
  YI        If not i%3, take "_"*w, else (("       |" * w)[c:])[:w]
            Function ends here.
i         Flatten the resulting list and print the bricks implicitly.
Sherlock9
fonte
2

PowerShell , 101 88 bytes

param($n,$w,$h)0..--$h|%{(('|       '*$w|% S*g(8-$n+4*($_%6-gt3))$w),('_'*$w))[!($_%3)]}

Experimente online!

Veskah
fonte
1

Oitava 80 76 bytes

% in file codegolf.m
c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;char(repmat(c+32,h,w)(1:h,o+1:o+w))

para 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 :)

c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;f=@(o,h,w)char(repmat(c+32,h,w)(1:h,o+1:o+w))

Ligue f(2,18,44)para o intérprete de oitava.

Tasos Papastylianou
fonte
1

Bash + Sed, 411 395 381 370 bytes:

F=`printf '_%.s' $(eval echo {1..$2})`;V="       |";(($[($2-$1)/8]>0))&&L=`printf "$V%.s" $(eval echo {1..$[($2-$1)/8]})`||L=;Z=`printf "%$1.s|%s\n" e "$L"`;I=$[($2-(${#Z}-4))/8];(($I>0))&&W=`printf "$V%.s" $(eval echo {1..$I})`||W=;J=${Z:4}$W;for i in `eval echo {1..$[$3/3+1]}`;{ (($[$i%2]<1))&&O+="$F\n$J\n$J\n"||O+="$F\n$Z\n$Z\n";};echo "`echo -e "$O"|sed -n 1,$3p`"

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.

R. Kap
fonte
1

Delphi / Object Pascal, 305 , 302 , 292 bytes

Programa de console completo que lê 3 parâmetros.

uses SySutils,Math;var i,q,o,w,h:byte;begin o:=StrToInt(paramstr(1));w:=StrToInt(paramstr(2));h:=StrToInt(paramstr(3));for q:=0to h-1do begin for i:=1to w do if q mod 3=0then Write('_')else if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8))=1then Write('|')else Write(' ');Writeln('');end end.

destroçado

uses
  SySutils,
  Math;
var
  i,q,o,w,h:byte;
begin
  o:=StrToInt(paramstr(1));
  w:=StrToInt(paramstr(2));
  h:=StrToInt(paramstr(3));

  for q := 0 to h-1 do
  begin
    for i := 1 to w do
      if q mod 3 = 0  then
        Write('_')
      else
        if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8)) = 1 then
          Write('|')
        else Write(' ');
    Writeln('');
  end
end.

Infelizmente, o Delphi não possui um operador ternário e é uma linguagem bastante detalhada.

caso de teste

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 2 20 10
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 6 44 11
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |
  |       |       |       |       |       |
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |

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

RD
fonte