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

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.

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);}

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


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
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

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

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.


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:

________
       |
       |
________
  |     
  |     

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

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.


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

}

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


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!)


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));


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


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.


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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.