Você deve construir postes ASCII!

24

Cross postado no meu post anagolf (nota: pode conter spoilers, post mortem).

Envie o texto a seguir exatamente.

  • Você pode ter espaços em branco à direita adicionais em cada linha e novas linhas à direita.
  • O código mais curto, em bytes, vence.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./0/.-,+*)(
                                      )*+,-./01210/.-,+*)
                                     *+,-./012343210/.-,+*
                                    +,-./0123456543210/.-,+
                                   ,-./01234567876543210/.-,
                                  -./0123456789:9876543210/.-
                                 ./0123456789:;<;:9876543210/.
                                /0123456789:;<=>=<;:9876543210/
                               0123456789:;<=>?@?>=<;:9876543210
                              123456789:;<=>?@ABA@?>=<;:987654321
                             23456789:;<=>?@ABCDCBA@?>=<;:98765432
                            3456789:;<=>?@ABCDEFEDCBA@?>=<;:9876543
                           456789:;<=>?@ABCDEFGHGFEDCBA@?>=<;:987654
                          56789:;<=>?@ABCDEFGHIJIHGFEDCBA@?>=<;:98765
                         6789:;<=>?@ABCDEFGHIJKLKJIHGFEDCBA@?>=<;:9876
                        789:;<=>?@ABCDEFGHIJKLMNMLKJIHGFEDCBA@?>=<;:987
                       89:;<=>?@ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA@?>=<;:98
                      9:;<=>?@ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA@?>=<;:9
                     :;<=>?@ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA@?>=<;:
                    ;<=>?@ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA@?>=<;
                   <=>?@ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA@?>=<
                  =>?@ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA@?>=
                 >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>
                ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?
               @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@
              ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
             BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCB
            CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDC
           DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFED
          EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFE
         FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGF
        GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHG
       HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIH
      IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJI
     JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJ
    KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLK
   LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONML
  MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONM
 NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPON
OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPO
Conor O'Brien
fonte
3
Existe uma primeira linha intencional apenas para espaços em branco?
AdmBorkBork
9
@AdmBorkBork que é um espaço porque esse é o primeiro caractere ASCII lol
HyperNeutrino
2
@ the4kman e o <=>=<peixe.
precisa saber é o seguinte
4
Existe uma razão para isso não ser intitulado "Você deve construir postes ASCII!"?
mattdm
3
@mattdm Eu só vim aqui da lista HNQ para fazer uma votação positiva por causa de seu título. Bem feito.
21418 Todd Wilcox

Respostas:

4

Tela , 15 14 bytes

0c[C²[j}¹m]/││

Experimente aqui!

Observe que, ao fazer isso, adicionei alguns recursos internos ( & ), pois o Canvas de alguma forma não tinha nenhum built-ins para ASCII / unicode antes ...

Explicação (alguns caracteres foram substituídos para parecerem monoespaços):

0c              push the charcode of "0" - 48
  {       ]     map over 1..48
   C              push the ASCII characters
    ²[ ]          repeat by the counter (0-indexed)
      j             remove the last character
        ¹m        mold to the length of the counter
           /    pad each line with spaces so it looks like a diagonal
            ││  palindromize the whole thing horizontally
dzaima
fonte
16

PowerShell , 73 bytes

' '*48;46..0|%{" "*$_+-join[char[]](($x=79-$_)..($y=$x+$j++)+(++$y)..$x)}

Experimente online!

Gera a primeira linha somente de espaço em branco e passa de 46para 0. Cada iteração gera o número correspondente de espaços e depois -joinedita juntoschar cria matriz dos símbolos apropriados, através de alguns cálculos.

AdmBorkBork
fonte
11
Você pode salvar alguns cálculos tratando a primeira linha como 47 espaços seguidos por um caractere de espaço?
Riking
@Riking Para fazer isso, você precisaria de um caso especial de como o array de caracteres é criado para criar apenas um item em vez de 3 ou mais. Como resultado, é mais curto para o caso especial a linha somente de espaços completamente separadamente.
AdmBorkBork
11

Carvão vegetal , 13 bytes

E⁴⁸⮌✂γι⊕⊗ι‖O←

Experimente online! Link é a versão detalhada do código. Explicação:

 ⁴⁸             Literal 48
E               Map over implicit range
      ι  ι      Current index
        ⊗       Doubled
       ⊕        Incremented
     γ          Printable ASCII
    ✂           Slice
   ⮌            Reverse
                Implicitly print each slice on separate lines
          ‖O←   Reflect with overlap
Neil
fonte
5
A saída parece errada para mim.
Mr. Xcoder
11
@ Mr.Xcoder Ugh, clássico off-by-1 erro ...
Neil
8

Python 2 , 73 bytes

i=48
while i:i-=1;r=range(79-i,127-i*2);print' '*i+bytearray(r+r[-2::-1])

Experimente online! Crossposted do anarchy golf (veja minha submissão ).

Análise post-mortem rápida: xnor e dianne descobriram exatamente a mesma solução . ebicochneal enviou uma solução de 71 bytes que mitchs melhorou para 70 bytes . Eles evitam lidar com bytearray(que é longo) ou ''.join(map(chr,…))(que é ainda mais longo) inteiramente, mantendo uma variável da "linha atual" e atualizando-a de maneira inteligente.

Lynn
fonte
4

05AB1E , 16 bytes

48FžQNÝûN+èJ}).C

Experimente online!

Emigna
fonte
Ahhh ... žQfoi muito melhor do quežw79ŸvyžwN2*+ŸûçJ}).C
Magia Octopus Urna
4

Lisp comum , 110 bytes

(dotimes(i 48)(dotimes(j 96)(princ(if(>(abs(- j 48))i)" "(code-char(+(-(* i 2)(abs(- j 48)))32)))))(princ"
"))

Experimente online!

Explicação

(dotimes(i 48)                   ;; for i from 0 up to 47
    (dotimes(j 96)               ;; for j from 0 up to 95
        (princ                   ;; print
            (if(>(abs(- j 48))i) ;; if abs(j - 48) > i
                " "              ;; print " "
                (code-char(+(-(* i 2)(abs(- j 48)))32)) ;; else print appropriate character
            )
        )
    )(princ"
") ;; print newline
)
Somente ASCII
fonte
3

VBA, 71 bytes

Uma função de janela imediata anônima do VBE que não recebe entrada nem saída no console.

For i=0To 47:?Spc(47-i);:For j=-i To i:?Chr(32-Abs(j)+2*i);:Next:?:Next
Taylor Scott
fonte
3

Ruby , 70 bytes

s=[*?\s..?~]*'';48.times{|i|puts s[i,i+1].rjust(48)+s.reverse[-2*i,i]}

Experimente online!

Constrói a sequência ASCII imprimível completa e, em seguida, imprime o número necessário de avanço (preenchido com espaços) + fatias anteriores.

Kirill L.
fonte
2

C (gcc), 117 bytes

c;i;main(){for(i=0;i<48;++i){for(c=2*i-15;c<32+2*i;++c)putchar(c>31+i?c:32);for(;c>31+i;--c)putchar(c);putchar(10);}}

Experimente online!

Ungolfed:

int ch;
int row;
int main(void) {
    for (row = 0; row < 48; ++row) {
        for (ch = 2*row-15; ch < 32 + 2*row; ++ch) {
            // The first character in the row is 2*row - 15 (row is zero-indexed)
            if (ch > 31+row)
                putchar(ch);
            else
                // If the current character is not in the pyramid, mask it with a space
                putchar(' ');
        }
        for (; ch > 31+row; --ch) {
            // Finish the other side of the pyramid
            putchar(ch);
        }
        putchar('\n');
    }
}
pizzapants184
fonte
108 bytes
ceilingcat
2

C (gcc) , 114 113 107 bytes

#define _(_)for(k=32;k<j;)putchar(j+_++);
f(j,k){for(j=31;++j<80;){printf("\n%*c",80-j,j);_(-31+k)_(j+~k)}}

Experimente online!

São possíveis 101 bytes usando um sinalizador de compilador.

Jonathan Frech
fonte
2

Perl 6 , 55 53 bytes

say ' 'x 47-$_,chrs 32+2*$_ X-(-$_..$_)>>.abs for ^48

Experimente online!

Nwellnhof
fonte
2

T-SQL, 153 bytes

DECLARE @ INT=33,@t CHAR(95)=''a:PRINT @t;
SET @t=LEFT(STUFF(STUFF(@t,63-@/2,2,''),46,0,CHAR(@-1)+CHAR(@)+CHAR(@+1)+CHAR(@)),33+@/2)
SET @+=2IF @<128GOTO a

Os retornos são apenas para exibição.

Tentei várias idéias, incluindo um loop para pré-construir a sequência completa (163 caracteres) e um loop aninhado para construí-lo em tempo real (168 caracteres), mas esse acabou sendo o mais curto.

Basicamente, em cada loop, estou colocando 4 novos caracteres no centro da string e, em seguida, aparando os extras de ambas as extremidades, usando a função SQLSTUFF() .

Formatado e explicado:

DECLARE @ INT=33,                      --Using a single counter for both rows and CHAR
        @t CHAR(95)=''                 --a non-null CHAR field will pre-fill with spaces
a:                                     --GOTO loop, shorter than a WHILE
    PRINT @t                           --duh
    SET @t = LEFT(                     --lops off the character at the end
            STUFF(                     --crams 4 new characters in the middle
            STUFF(@t, 63-@/2, 2, '')   --snips out a space and the leading character
                 ,46, 0, CHAR(@-1) + CHAR(@) + CHAR(@+1) + CHAR(@))
                 ,33 + @/2)            --rest of the LEFT()
    SET @+=2
IF @<128 GOTO a
BradC
fonte
2

J , 47 44 bytes

(,.~}:@|."1)(1+i.48)([|.@{.}.)"0 1 u:31+i.96

Experimente online!

Obrigado a Conor O'Brien pelo modelo! Agradecemos a FrownyFrog por indicar a solução inválida.

Galen Ivanov
fonte
11
Talvez isso seja mais facilmente modificável: Experimente online!
Conor O'Brien
@Conor O'Brien - Obrigado pelo modelo, atualizei o link.
Galen Ivanov
Imprime uma linha extra na parte superior.
FrownyFrog
@FrownyFrog Ah, é só agora que vejo que apenas novas linhas à direita são permitidas, e não à frente. Vou tentar consertar isso.
Galen Ivanov
@FrownyFrog - Fixo e ligeiramente golfe.
Galen Ivanov
2

Ruby, 59 bytes

48.times{|i|-47.upto(i){|c|putc~c<i ?32-c.abs+2*i:32};puts}

Publicado na minha resposta no anagol.

histocrata
fonte
2

Japonês -R, 18 15 bytes

14 bytes se uma nova linha principal adicional for permitida.

#0õ_odH+ZÉ ¬êÃû

Teste-o


Explicação

#0                  :48
  õ                 :Range [1,48]
   _         Ã      :Pass each Z through a function
    o               :  Range [0,Z)
      H+ZÉ          :    To each add 32+Z-1
     d              :    Get the character at that codepoint
           ¬        :  Join to a string
            ê       :  Palinrdomise
              û     :Centre pad each element to the length of the longest element
                    :Implicitly join with newlines and output
Shaggy
fonte
2

J ,  40 37  32 bytes

Expressão 40 u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47 agradecimento a + Galen Ivanov e + Conor O'Brien pelas ideias em suas soluções

37 eco incluído echo u:32+|.(~.(>:*+:@[-])"0 _])|i:47

echo u:32+|.(~.(>:*[+-)"{])|i:47

incorporando dicas @FrownyFrog dos comentários

TIO

Jayprich
fonte
Não acho que expressões sejam envios válidos.
LyricLy
@LyricLy, a opinião parece variar, pois vejo outra resposta J neste formulário .. de qualquer forma, obrigado por me fazer barbear outros 8 bytes .. agora tenho espaço para adicionar "echo": espero que você esteja feliz
:)
"0 _"{
FrownyFrog
+:@[-][+-
FrownyFrog
bonito .. obrigado por estas dicas @FrownyFrog
jayprich
2

Perl 5 , 77 75 69 bytes

map{say$"x(47-$_),(@a=map chr$_+32,$_..$_*2),reverse@a[0..@a-2]}0..47

Experimente online!

Xcali
fonte
1

Python 2 , 98 88 bytes

-1 byte graças a @ Mr.Xcoder

i=32
exec"print''.join(chr(i+i-32-abs(j))for j in range(32-i,i-31)).center(95);i+=1;"*48

Experimente online!

Gambá morto
fonte
-i+32=> 32-ie você pode usar em ' '*(79-i)vez de .center(95)para salvar bytes.
Mr. Xcoder
@ Mr.Xcoder obrigado! ' '*(79-i)+realmente não salva bytes: D
Dead Possum
1

Rubi , 78 bytes

s=*32;48.times{puts (s.map(&:chr)*'').center 95;c=*s[0]+1;s=c+s.map{|x|x+2}+c}

Experimente online!

Programa completo. Ungolfed:

s=*32;                              # s is an array of integers
48.times{                           # Repeat 48 times:
  puts (s.map(&:chr)*'').center 95; # Turn each int to a char, join, center, and print
  c = *s[0] + 1;                    # c is a singleton array. It will bookend the next line
  s = c + s.map{|x|x+2} + c         # Add 2 to each element of s before adding the bookends
}
benj2240
fonte
1

Yabasic , 80 bytes

Uma função anônima que não leva nenhuma entrada e saída para o console

For i=0To 47
For j=i To 47?" ";Next
For j=-i To i?Chr$(32-Abs(j)+2*i);Next
?Next

Experimente online!

Taylor Scott
fonte
1

uBASIC , 95 bytes

0ForI=0To47
1ForJ=ITo47:?" ";:NextJ
2ForK=-1*IToI:?Left$(Chr$(32-Abs(K)+2*I),1);:NextK
3?:NextI

Experimente online!

Taylor Scott
fonte
1

MY-BASIC , 97 bytes

Uma resposta MY-BASIC anônima que não leva nenhuma entrada e saída para o console

For i=0 To 47
For j=i To 47
Print" "
Next
For j=-i To i
Print Chr(32-Abs(j)+2*i)
Next
Print;
Next

Experimente online!

-1 byte graças a Jonathan Frech

Taylor Scott
fonte
11
Print " "-> Print" ".
27618 Jonathan Frech
@JonathanFrech - whoops desculpe, eu mispelled seu nome
Taylor Scott
1

Gol> <> , 29 bytes

`0FaLssLF:P|LF:M|`/L-R` lRo|;

Experimente online!

Como funciona

`0FaLssLF:P|LF:M|`/L-R` lRo|;

`0F                        |;  Repeat the following 48 times and halt...
   a                           Push 10 (\n)
    Lss                        Push L(loop counter) + 32
       LF:P|                   Repeat "Clone the top and increment" L times
            LF:M|              Repeat "Clone the top and decrement" L times
                 `/L-R`        Push 32 (space) 47-L times (space is significant)
                        lRo    Print everything as char, from the top,
                               until the stack is empty
Bubbler
fonte
1

Tcl , 129 122 118 117 bytes

time {incr i;set j -48;set a {};time {set a $a[format %c [expr abs([incr j])>=$i?32:$i*2-abs($j)+30]]} 96;puts $a} 48

Experimente online!

Explicação

time { # for i from 0 up to 47
    incr i
    set j -48
    set a {}
    time { # for j from -48 up to 47
        # add next character to a
        set a $a[format %c [expr abs([incr j])>$i?32:$i*2-abs($j)+32]]
    } 96
    puts $a # print a
} 48
Somente ASCII
fonte
1

C (gcc) 199 bytes

#include<stdio.h>
int i,j=32,k=32,l=49;int main(){while(k<127){for(i=0;i<l;++i)printf(" ");for(i=j;i<k;++i)printf("%c",i);printf("%c",k);for(i=k-1;i>=j;--i)printf("%c",i);printf("\n");j++;k+=2;l--;}}

Experimente online!

Obrigado a Picard e PunPun1000 por toda a ajuda

Jonathan Landrum
fonte
@ Picard removi os espaços. Eu poderia minificar ainda mais com uma variável iteradora global.
27418 Jonathan Landrum
@ Picard editei no meu telefone; não percebi que eu tinha deixado uma linha em branco.
27618 Jonathan Landrum
11
Há espaços desnecessários nas chamadas printf após as vírgulas, e os nomes das variáveis ​​podem ser reduzidos para uma letra. Também seria bom se você pudesse incluir um link TIO e a contagem de bytes real. Aqui está o link para o seu código atual TIO
PunPun1000
ok, eu tenho apertou um pouco mais, eu acho que eu teria que mudar o algoritmo para reduzi-lo ainda mais
Jonathan Landrum
1

Haskell, 102 bytes

main=putStr$do
i<-[48,47..0]
let l=replicate i 32++[79-i..126-i*2]
map toEnum$l++tail(reverse l)++[10]

Coisas que tentei que não eram mais curtas:

  • Expressando tudo em termos de caracteres literais e / succou predpara salvar o map toEnum.
  • Escrevendo um intervalo descendente em vez de usar reverse.
Kevin Reid
fonte