Devi costruire i Piloni ASCII!


24

Cross postato dal mio post di anagolf (nota: può contenere spoiler, post mortem).

Stampa esattamente il seguente testo.

  • Potresti avere spazi bianchi finali aggiuntivi su ogni riga e anche nuove righe finali.
  • Il codice più corto, in byte, vince.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./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

3
Esiste una prima linea intenzionale solo per spazi bianchi?
AdmBorkBork,

9
@AdmBorkBork è uno spazio perché è il primo carattere ASCII lol
HyperNeutrino,

2
@ the4kman e il <=>=<pesce.
pizzapants184,

4
C'è un motivo per cui questo non è intitolato "Devi costruire i piloni ASCII!"?
mattdm,

3
@mattdm Sono venuto qui dall'elenco HNQ solo per votare questo a causa del suo titolo. Ben fatto.
Todd Wilcox,

Risposte:


4

Tela , 15 14 byte

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

Provalo qui!

Nota che mentre facevo questo ho aggiunto un paio di built-in ( & ) in quanto Canvas in qualche modo non aveva alcun built-in per ASCII / unicode prima ...

Spiegazione (alcuni personaggi sono stati sostituiti per sembrare monospace):

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

16

PowerShell , 73 byte

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

Provalo online!

Emette la prima riga per soli spazi bianchi, quindi 46passa da a 0. Ogni iterazione, genera il numero corrispondente di spazi e quindi un -joininsieme ed- chararray dei simboli appropriati, tramite alcuni calcoli.


1
Puoi salvare alcuni calcoli trattando la prima riga come 47 spazi seguiti da un carattere spazio?
Riking

@Riking Per fare ciò, dovrai creare un caso particolare di come viene creato il char-array per creare un solo elemento anziché 3 o più. Di conseguenza, è più breve nel caso speciale la linea solo spazi completamente separata.
AdmBorkBork,

11

Carbone , 13 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 ⁴⁸             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

5
L'output mi sembra sbagliato.
Mr. Xcoder,

1
@ Mr.Xcoder Ugh, classico errore off-by-1 ...
Neil,

8

Python 2 , 73 byte

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

Provalo online! Crossposted from anarchy golf (vedi la mia presentazione ).

Breve analisi post-mortem: xnor e Dianne scoperto la esatto stessa soluzione . ebicochneal ha presentato una soluzione a 71 byte che mitchs è migliorata a 70 byte . Evitano di affrontare bytearray(che è lungo) o ''.join(map(chr,…))(che è ancora più lungo) del tutto, mantenendo una variabile "linea corrente" e aggiornandola abilmente.





4

Lisp comune , 110 byte

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

Provalo online!

Spiegazione

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

3

VBA, 71 byte

Una funzione finestra immediata VBE anonima che non accetta input e output sulla console.

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

3

Rubino , 70 byte

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

Provalo online!

Costruisce la stringa ASCII stampabile completa e quindi stampa il numero richiesto di sezioni in avanti (riempite con spazi) + parti all'indietro.



2

C (gcc), 117 byte

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

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




2

T-SQL, 153 byte

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

I ritorni sono solo per visualizzazione.

Ho provato diverse idee, tra cui un loop per precostruire l'intera stringa (163 caratteri) e un loop nidificato per costruirla al volo (168 caratteri), ma alla fine è stata la più breve.

Fondamentalmente, ad ogni loop sto riempiendo 4 nuovi caratteri al centro della stringa, quindi tagliando gli extra da entrambe le estremità, usando la funzione SQLSTUFF() .

Formattato e spiegato:

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

2

J , 47 44 byte

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

Provalo online!

Grazie a Conor O'Brien per il modello! Grazie a FrownyFrog per aver indicato la soluzione non valida.


1
Forse questo è più facilmente modificabile: provalo online!
Conor O'Brien,

@Conor O'Brien - Grazie per il modello, ho aggiornato il link.
Galen Ivanov,

Stampa una riga aggiuntiva in alto.
FrownyFrog,

@FrownyFrog Oh, è solo ora che vedo che sono permesse solo nuove righe finali, non in testa. Proverò a ripararlo.
Galen Ivanov,

@FrownyFrog - Risolto e leggermente golfato.
Galen Ivanov,

2

Rubino, 59 byte

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

Pubblicazione incrociata della mia risposta su anagol.


2

Japt -R, 18 15 byte

14 byte se è consentita una nuova riga iniziale aggiuntiva.

#0õ_odH+ZÉ ¬êÃû

Provalo


Spiegazione

#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

2

J ,  40 37  32 byte

40 espressioni u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47grazie a + Galen Ivanov e + Conor O'Brien per le idee nelle loro soluzioni

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

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

incorporando i suggerimenti di @FrownyFrog dai commenti

TIO


Non penso che le espressioni siano invii validi.
Lirico

@LyricLy, l'opinione sembra variare poiché vedo un'altra risposta J in questo modulo .. comunque grazie per avermi indotto a radere altri 8 byte .. ora ho spazio per aggiungere "echo": spero che tu sia felice
:)

"0 _"{
FrownyFrog,

+:@[-][+-
FrownyFrog,

bellissimo .. grazie per questi suggerimenti @FrownyFrog
jayprich


1

Python 2 , 98 88 byte

-1 byte grazie 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

Provalo online!


-i+32=> 32-ie potresti usare ' '*(79-i)invece di .center(95)salvare byte.
Mr. Xcoder,

@ Grazie Mr.Xcoder! ' '*(79-i)+non salva davvero i byte: D
Dead Possum,

1

Rubino , 78 byte

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

Provalo online!

Programma 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
}





1

Gol> <> , 29 byte

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

Provalo online!

Come funziona

`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

1

Tcl , 129 122 118 117 byte

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

Provalo online!

Spiegazione

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

1

C (gcc) 199 byte

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

Provalo online!

Grazie a Picard e PunPun1000 per tutto l'aiuto


@Picard Ho rimosso gli spazi. Potrei ulteriormente minimizzare con una variabile iteratore globale.
Jonathan Landrum,

@Picard L'ho modificato sul mio telefono; non mi ero reso conto di aver lasciato una riga vuota.
Jonathan Landrum,

1
Ci sono spazi non necessari nelle chiamate printf dopo le virgole e i nomi delle variabili possono essere abbreviati in una lettera. Inoltre sarebbe bello se si potesse includere un collegamento TIO e il conteggio dei byte effettivi. Ecco il link per il tuo codice attuale TIO
PunPun1000

ok, l'ho spremuto un po 'di più, penso che dovrei cambiare l'algoritmo per ridurlo ulteriormente
Jonathan Landrum

1

Haskell, 102 byte

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

Le cose che ho provato che non erano più brevi:

  • Esprimendo tutto in termini di caratteri letterali e succo predper salvare map toEnum.
  • Scrivere un intervallo discendente invece di usare reverse.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.