¡Debes construir pilones ASCII!


24

Cruz publicado desde mi publicación de anagolf (nota: puede contener spoilers, post mortem).

Salida del siguiente texto exactamente.

  • Es posible que tenga espacios en blanco finales adicionales en cada línea y también nuevas líneas finales.
  • El código más corto, en bytes, gana.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./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
¿Existe una primera línea intencional de solo espacios en blanco?
AdmBorkBork

99
@AdmBorkBork que es un espacio porque es el primer ASCII char lol
HyperNeutrino

2
@ the4kman y el <=>=<pez.
pizzapants184

44
¿Hay alguna razón por la que esto no se titula "Debes construir pilones ASCII"?
mattdm

3
@mattdm Solo vine aquí de la lista HNQ para votar esto debido a su título. Bien hecho.
Todd Wilcox el

Respuestas:


4

Lienzo , 15 14 bytes

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

Pruébalo aquí!

Tenga en cuenta que al hacer esto, agregué un par de elementos integrados ( & ) ya que Canvas de alguna manera no tenía ningún elemento integrado para ASCII / unicode antes ...

Explicación (algunos caracteres han sido reemplazados para parecer monoespaciales):

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 bytes

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

Pruébalo en línea!

Emite la primera línea de solo espacios en blanco, luego realiza un bucle de 46a 0. Cada iteración, genera el número correspondiente de espacios y luego un -joinconjunto charconjunto de los símbolos apropiados, a través de algunos cálculos.


1
¿Puedes guardar algunos cálculos tratando la primera línea como 47 espacios seguidos de un carácter de espacio?
Riking

@Riking Para hacerlo, necesitaría un caso especial de cómo se crea la matriz de caracteres para crear solo un elemento en lugar de 3 o más. Como resultado, es más corto que el caso especial de la línea de solo espacios completamente por separado.
AdmBorkBork

11

Carbón , 13 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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

55
La salida me parece mal.
Sr. Xcoder

1
@ Mr.Xcoder Ugh, error clásico off-by-1 ...
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])

Pruébalo en línea! Crossposted de anarquía golf (ver mi presentación ).

Análisis rápido post mortem: xnor y dianne descubrieron exactamente la misma solución . ebicochneal presentó una solución de 71 bytes que Mitchs mejoró a 70 bytes . Evitan tratar bytearray(que es largo) o ''.join(map(chr,…))(que es aún más largo) por completo, manteniendo una variable de "línea actual" y actualizándola inteligentemente.





4

Lisp común , 110 bytes

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

Pruébalo en línea!

Explicación

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

Una función de ventana inmediata anónima VBE que no lleva entradas y salidas a la consola.

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

3

Ruby , 70 bytes

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

Pruébalo en línea!

Construye la cadena ASCII imprimible completa y luego imprime el número requerido de cortes hacia adelante (rellenados con espacios) + hacia atrás.



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

Pruébalo en línea!

Sin golf:

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

Las devoluciones son solo para exhibición.

Intenté varias ideas, incluido un bucle para preconstruir la cadena completa (163 caracteres) y un bucle anidado para construirlo sobre la marcha (168 caracteres), pero este terminó siendo el más corto.

Básicamente, en cada bucle estoy introduciendo 4 caracteres nuevos en el centro de la cadena, luego recorto los extras de ambos extremos, usando la función SQLSTUFF() .

Formateado y 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

2

J , 47 44 bytes

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

Pruébalo en línea!

¡Gracias a Conor O'Brien por la plantilla! Gracias a FrownyFrog por indicar la solución no válida.


1
Quizás esto sea más fácil de modificar: ¡ Pruébelo en línea!
Conor O'Brien

@Conor O'Brien - Gracias por la plantilla, he actualizado el enlace.
Galen Ivanov

Imprime una línea extra en la parte superior.
FrownyFrog

@FrownyFrog Oh, es solo ahora que veo que solo se permiten nuevas líneas finales, no líderes. Intentaré arreglarlo.
Galen Ivanov

@FrownyFrog - Fijo y ligeramente golfizado.
Galen Ivanov

2

Ruby, 59 bytes

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

Cruzado de mi respuesta en anagol.


2

Japt -R, 18 15 bytes

14 bytes si se permite una nueva línea inicial adicional.

#0õ_odH+ZÉ ¬êÃû

Pruébalo


Explicación

#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 bytes

40 expresión u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47 gracias a + Galen Ivanov y + Conor O'Brien por las ideas en sus soluciones

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

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

incorporando @FrownyFrog consejos de comentarios

TIO


No creo que las expresiones sean presentaciones válidas.
LyricLy

@LyricLy, la opinión parece variar ya que veo otra respuesta J en este formulario ... de todos modos, gracias por presionarme para que afeite otros 8 bytes ... ahora tengo espacio para agregar "echo": espero que estés contento
:)

"0 _"{
FrownyFrog

+:@[-][+-
FrownyFrog

hermoso .. gracias por estos consejos @FrownyFrog
jayprich



1

Ruby , 78 bytes

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

Pruébalo en línea!

Programa completo Sin golf:

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 bytes

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

Pruébalo en línea!

Cómo 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

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

Pruébalo en línea!

Explicación

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

Pruébalo en línea!

Gracias a Picard y PunPun1000 por toda la ayuda.


@Picard eliminé los espacios. Podría minificar aún más con una variable iteradora global.
Jonathan Landrum

@Picard Lo edité en mi teléfono; No me di cuenta de que había dejado una línea en blanco.
Jonathan Landrum

1
Hay espacios innecesarios en las llamadas de printf después de las comas, y los nombres de las variables se pueden acortar a una letra. También sería bueno si pudiera incluir un enlace TIO y el recuento de bytes real. Aquí está el enlace para su código actual TIO
PunPun1000

ok, lo apreté un poco más, creo que tendría que cambiar el algoritmo para reducirlo aún más
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]

Cosas que he probado que no fueron más cortas:

  • Expresando todo en términos de caracteres literales y / succo predpara guardar el map toEnum.
  • Escribir un rango descendente en lugar de usar reverse.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.