Sie müssen ASCII-Pylone erstellen!


24

Cross aus meinem Anagolf-Post gepostet (Hinweis: Kann Spoiler enthalten, post mortem).

Geben Sie den folgenden Text genau aus.

  • Möglicherweise werden in jeder Zeile zusätzliche Leerzeichen und in jeder Zeile auch Zeilenumbrüche nachgestellt.
  • Kürzester Code in Byte gewinnt.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./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
Gibt es eine absichtliche erste Zeile, die nur Leerzeichen enthält?
AdmBorkBork

9
@AdmBorkBork, das ist ein Leerzeichen, weil das das erste ASCII-Zeichen ist
HyperNeutrino

2
@ the4kman und der <=>=<Fisch.
Pizzapants184

4
Gibt es einen Grund, warum der Titel nicht "Sie müssen ASCII-Pylone erstellen!" Lautet?
Mattdm

3
@mattdm Ich bin nur von der HNQ-Liste hierher gekommen, um dies wegen des Titels zu bewerten. Schön gemacht.
Todd Wilcox

Antworten:


4

Canvas , 15 bis 14 Bytes

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

Probieren Sie es hier aus!

Beachten Sie, dass ich beim Erstellen ein paar eingebaute Elemente ( & ) hinzugefügt habe, da Canvas zuvor irgendwie keine eingebauten Elemente für ASCII / Unicode hatte ...

Erklärung (einige Zeichen wurden ersetzt, um monospace auszusehen):

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

Probieren Sie es online!

Gibt die erste Zeile nur mit Leerzeichen aus und führt dann eine Schleife von 46bis durch 0. Jede Iteration gibt über einige Berechnungen die entsprechende Anzahl von Leerzeichen und dann ein -joinzusammengesetztes charArray der entsprechenden Symbole aus.


1
Können Sie einige Berechnungen speichern, indem Sie die erste Zeile als 47 Leerzeichen gefolgt von einem Leerzeichen behandeln?
Riking

@Riking Um dies zu tun, müssen Sie in einem speziellen Fall festlegen, wie das Zeichen-Array erstellt wird, um nur ein Element anstelle von 3 oder mehr zu erstellen. Infolgedessen ist es im Sonderfall kürzer, die Leerzeichen-Zeile nur ganz getrennt zu verwenden.
AdmBorkBork

11

Kohle , 13 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

 ⁴⁸             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
Die Ausgabe scheint mir falsch.
Mr. Xcoder

1
@ Mr.Xcoder Ugh, klassische Off-by-1-Fehler ...
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])

Probieren Sie es online! Crossposted von Anarchy Golf (siehe meine Vorlage ).

Schnelle Post-Mortem-Analyse: xnor und dianne entdeckten genau die gleiche Lösung . ebicochneal reichte eine 71-Byte-Lösung ein, die sich auf 70 Byte verbesserte . Sie vermeiden es, sich mit bytearray(was lang ist) oder ''.join(map(chr,…))(was noch länger ist) vollständig zu befassen , indem sie eine "aktuelle Zeile" -Variable behalten und sie geschickt aktualisieren.





4

Common Lisp , 110 Bytes

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

Probieren Sie es online!

Erläuterung

(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

Eine anonyme VBE-Direktfensterfunktion, die keine Ein- und Ausgaben an die Konsole annimmt.

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

Probieren Sie es online!

Konstruiert die vollständige druckbare ASCII-Zeichenfolge und druckt dann die erforderliche Anzahl von Vorwärts- (mit Leerzeichen aufgefüllten) + Rückwärtsschnitten davon.



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

Probieren Sie es 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 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

Rückgaben sind nur zur Anzeige.

Ich habe verschiedene Ideen ausprobiert, darunter eine Schleife zum Vorkonstruieren des vollständigen Strings (163 Zeichen) und eine verschachtelte Schleife zum spontanen Erstellen (168 Zeichen), aber dies war letztendlich die kürzeste.

Grundsätzlich stopfe ich in jeder Schleife 4 neue Zeichen in die Mitte des Strings und schneide dann die Extras von beiden Seiten mithilfe der SQL- STUFF()Funktion ab .

Formatiert und erklärt:

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

Probieren Sie es online!

Vielen Dank an Conor O'Brien für die Vorlage! Vielen Dank an FrownyFrog für die Anzeige der ungültigen Lösung.


1
Vielleicht ist dies einfacher zu ändern: Probieren Sie es online!
Conor O'Brien

@Conor O'Brien - Vielen Dank für die Vorlage, ich habe den Link aktualisiert.
Galen Ivanov

Gibt eine zusätzliche Zeile oben aus.
FrownyFrog

@FrownyFrog Oh, erst jetzt sehe ich, dass nur abschließende Zeilenumbrüche zulässig sind, keine führenden. Ich werde versuchen, es zu beheben.
Galen Ivanov

@FrownyFrog - Fest und leicht golfen.
Galen Ivanov

2

Ruby, 59 Bytes

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

Aus meiner Antwort auf anagol gekreuzt.


2

Japt -R, 18 15 Bytes

14 Byte, wenn eine zusätzliche führende Zeile zulässig ist.

#0õ_odH+ZÉ ¬êÃû

Probier es aus


Erläuterung

#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

Vielen u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47Dank an + Galen Ivanov & + Conor O'Brien für die Ideen in ihren Lösungen

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

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

Einbindung von @FrownyFrog-Tipps aus Kommentaren

TIO


Ich denke nicht, dass Ausdrücke gültige Eingaben sind.
Text

@LyricLy scheint Meinung zu ändern , als ich eine weitere J Antwort in dieser Form sehen tun .. trotzdem danke für prodding mir weitere 8 Bytes zu rasieren .. jetzt habe ich Raum „Echo“ hinzuzufügen: Hoffnung sind Sie glücklich:)
jayprich

"0 _"{
FrownyFrog

+:@[-][+-
FrownyFrog

schön .. danke für diese Tipps @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}

Probieren Sie es online!

Volles Programm. 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 Bytes

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

Probieren Sie es online!

Wie es funktioniert

`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

Probieren Sie es online!

Erläuterung

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

Probieren Sie es online!

Vielen Dank an Picard und PunPun1000 für die Hilfe


@ Picard Ich habe die Leerzeichen entfernt. Ich könnte mit einer globalen Iteratorvariablen weiter verkleinern.
Jonathan Landrum

@ Picard Ich habe es auf meinem Handy bearbeitet. Ich wusste nicht, dass ich eine leere Zeile hinterlassen hatte.
Jonathan Landrum

1
Es gibt unnötige Leerzeichen in den printf-Aufrufen nach den Kommas und die Variablennamen können auf einen Buchstaben gekürzt werden. Es wäre auch schön, wenn Sie einen TIO-Link und die tatsächliche Byteanzahl angeben könnten. Hier ist der Link für Ihren aktuellen Code TIO
PunPun1000

ok, ich habe es ein bisschen mehr gedrückt, ich denke, ich müsste den Algorithmus ändern, um es weiter zu schrumpfen
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]

Dinge, die ich ausprobiert habe, die nicht kürzer waren:

  • Alles in Zeichenliteralen ausdrücken und succoder preddas retten map toEnum.
  • Einen abwärts gerichteten Bereich schreiben, anstatt zu verwenden reverse.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.