Nicht zu schwer, dies richtig zu codieren?


17

Sie müssen ein Programm oder eine Funktion in einer beliebigen Sprache schreiben, die dieses Muster ausgibt:

~|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~
|~|||||||||||||||||||||||||||||||||||||||||||||||||||||||||~|
||~|||||||||||||||||||||||||||||||||||||||||||||||||||||||~||
|||~|||||||||||||||||||||||||||||||||||||||||||||||||||||~|||
||||~|||||||||||||||||||||||||||||||||||||||||||||||||||~||||
|||||~|||||||||||||||||||||||||||||||||||||||||||||||||~|||||
||||||~|||||||||||||||||||||||||||||||||||||||||||||||~||||||
|||||||~|||||||||||||||||||||||||||||||||||||||||||||~|||||||
||||||||~|||||||||||||||||||||||||||||||||||||||||||~||||||||
|||||||||~|||||||||||||||||||||||||||||||||||||||||~|||||||||
||||||||||~|||||||||||||||||||~|||||||||||||||||||~||||||||||
|||||||||||~|||||||||||||||||~|~|||||||||||||||||~|||||||||||
||||||||||||~|||||||||||||||~|||~|||||||||||||||~||||||||||||
|||||||||||||~|||||||||||||~|||||~|||||||||||||~|||||||||||||
||||||||||||||~|||||||||||~|||||||~|||||||||||~||||||||||||||
|||||||||||||||~|||||||||~|||||||||~|||||||||~|||||||||||||||
||||||||||||||||~|||||||~|||||||||||~|||||||~||||||||||||||||
|||||||||||||||||~|||||~|||||||||||||~|||||~|||||||||||||||||
||||||||||||||||||~|||~|||||||||||||||~|||~||||||||||||||||||
|||||||||||||||||||~|~|||||||||||||||||~|~|||||||||||||||||||

Die Ausgabe besteht aus 20 Zeilen mit jeweils 61 Zeichen.

Regeln

  • Standardlücken sind verboten
  • Am Ende der Ausgabe befindet sich möglicherweise eine einzelne nachgestellte Zeile
  • In keiner Zeile der Ausgabe darf ein Leerzeichen nachgestellt sein

Ohne nachfolgende Newline ist die md5-Checksumme der Ausgabe fde4e3b4606bf9f8c314131c93988e96 .

Mit einem nachgestellten Zeilenumbruch ergibt sich die MD5-Prüfsumme der Ausgabe 1f0b43db4fec6594be202c8339024cb7 .

Das ist , also gewinnt der kürzeste Code in Bytes.


Ich habe die Herausforderung bearbeitet, um sie etwas klarer zu gestalten. Sie können die Bearbeitung jederzeit rückgängig machen.
Kritixi Lithos

1
Ich habe ein merkwürdiges Muster gezeichnet ... rextester.com/WXZV81312
sergiol

Antworten:


13

C (GCC) , 97 82 81 80 Bytes

15 Bytes nach dem Erlernen absdes in C eingebauten Bytes , ein zusätzliches Byte dank Rogem für den Hinweis, dass die Deklarationen meiner Variablen in die Funktion verschoben werden können, und ein weiteres Byte dank ceilingcat für den Vorschlag x=31;--x+31anstelle von x=-31;++x<31.

f(x,y){for(y=21;--y;puts(""))for(x=31;--x+31;)printf(abs(10-abs(x))-y?"|":"~");}

Probieren Sie es online!

Dies wird mit einem nachgestellten Zeilenumbruch ausgegeben. Die Funktionf übernimmt die Ausgabe.

Erläuterung

Die Ausgabe kann grafisch dargestellt werden.

~|||||||||||||||||||||||||||||+|||||||||||||||||||||||||||||~
|~||||||||||||||||||||||||||||+||||||||||||||||||||||||||||~|
||~|||||||||||||||||||||||||||+|||||||||||||||||||||||||||~||
|||~||||||||||||||||||||||||||+||||||||||||||||||||||||||~|||
||||~|||||||||||||||||||||||||+|||||||||||||||||||||||||~||||
|||||~||||||||||||||||||||||||+||||||||||||||||||||||||~|||||
||||||~|||||||||||||||||||||||+|||||||||||||||||||||||~||||||
|||||||~||||||||||||||||||||||+||||||||||||||||||||||~|||||||
||||||||~|||||||||||||||||||||+|||||||||||||||||||||~||||||||
|||||||||~||||||||||||||||||||+||||||||||||||||||||~|||||||||
||||||||||~|||||||||||||||||||+|||||||||||||||||||~||||||||||
|||||||||||~|||||||||||||||||~+~|||||||||||||||||~|||||||||||
||||||||||||~|||||||||||||||~|+|~|||||||||||||||~||||||||||||
|||||||||||||~|||||||||||||~||+||~|||||||||||||~|||||||||||||
||||||||||||||~|||||||||||~|||+|||~|||||||||||~||||||||||||||
|||||||||||||||~|||||||||~||||+||||~|||||||||~|||||||||||||||
||||||||||||||||~|||||||~|||||+|||||~|||||||~||||||||||||||||
|||||||||||||||||~|||||~||||||+||||||~|||||~|||||||||||||||||
||||||||||||||||||~|||~|||||||+|||||||~|||~||||||||||||||||||
|||||||||||||||||||~|~|||||||||||||||||~|~|||||||||||||||||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

(Das + s werden nur zu Erklärungszwecken angezeigt und stellen die Achsen dar.)

Die Gleichung dieses Diagramms lautet y=abs(10abs(x)) wie hier in diesem Link zu einem Desmos-Diagramm zu sehen ist .

abs(10 - abs(x))
abs(           )            Reflect whatever is beneath the x-axis to above the x-axis
    10 - abs(x)             This forms the central triangle-like structure

In Funktion fhaben wir zwei for-Schleifen, die jede Koordinate in diesem Diagramm durchlaufen. ygeht von 20bis 1und x geht von -30bis 30.

Für jeden xprüfen wir, ob er abs(10-abs(x))gleich ist, yindem wir es abs(10-abs(x))-yin einem Ternär machen. Wenn sie gleich sind, ergibt dies 0einen falschen Wert in C, andernfalls wird er zu einem positiven Wert ausgewertet. Dann im Dreiklang abs(10-abs(x))-y?"|":"~"wir printfdementsprechend.

Und nach jeder Zeile geben wir eine neue Zeile mit aus puts(""), und so gibt die Funktion eine nachfolgende neue Zeile aus.


1
Speichern Sie ein Byte mit f(x,y)anstelle vonx,y;f()

@ceilingcat Danke für den Golf
Kritixi Lithos



3

Jelly , 18 16 Bytes

⁵×3ŒRAạ=þḤṚị⁾~|Y

Probieren Sie es online!

⁵×3ŒRAạ=þḤṚị⁾~|Y  Main link. No arguments.

⁵                 Set the argument and the return value to 10.
 ×3               Multiply by 3 to yield 30.
   ŒR             Balanced range; yield [-30, -29, ..., 29, 30].
     A            Take absolute values.
      ạ           Take absolute differences with 10.
         Ḥ        Unhalve; yield 20.
       =þ         Table equals; compare each result with each k in [1, ..., 20].
          Ṛ       Reverse the resulting 2D array.
           ị⁾~|   Index into "~|", yielding '~' for 1 and '|' for 0.
               Y  Separate by linefeeds.

3

Python 2.7, 163 138 135 133 113 91 Bytes

l,t=S='|~'
for s in range(20):a=[l]*61;a[s]=a[60-s]=t;a[40-s]=a[20+s]=S[s>9];print`a`[2::5]

Probieren Sie es online!

Edit 1: -25 Bytes: habe den Algorithmus geändert, nachdem ich mich etwas ehrgeizig gefühlt habe. : P

2: -3 Bytes bearbeiten: mit freundlicher Genehmigung Felipe Nardi Batista

3: -2 Bytes bearbeiten: mit freundlicher Genehmigung bearbeiten shooqie

Edit 4: -20 Bytes: mit freundlicher Genehmigung notjagan

Edit 5: -22 Bytes: mit freundlicher Genehmigung von Leaky Nun


Das habe ich komplett verpasst! Vielen Dank @FelipeNardiBatista. Es spielt jedoch keine Rolle mehr: P hat den Algorithmus komplett geändert.
Koishore Roy


1
Das Stapeln von Attributen wie a,b,c='1','2','3'ist das Gleiche wie a='1';b='2';c='3'und das Gleiche wie das Platzieren jedes Attributs in einer eigenen Zeile, aber Sie können Bytes gewinnen, indem Sie Zeichenfolgen wiea,b,c='123'
Felipe Nardi Batista,

1
Ist nicht n<mkürzer als n-m<0?
Shooqie

1
Ich habe es auf 113 Bytes gebracht .
Notjagan

3

/// 231 Bytes

/3/|~//2/\/\///1/!!20/|
2-/&#2,/|#2'/"""2&/||2%/1|2#/&~2"/1!2!/&&|/~'%,
3'1#0#'1~&
,'!,&0-'!3&&
!~'-!
!3'#!0!#'~!&
!,""%#!&0!-""%~!&&
1~"-"-1
%~"#3"#%
1#"~,"~%0%#%#!~%#%&
%,%~!#%~%&0"~!-!-!-"
"3!#%~!#"0"#!~%#!~"&
",,"~,"&0"-3"#3"&&

Probieren Sie es online! Oder sehen Sie es sich hier interaktiv an !


3

WendyScript , 65 Bytes (ohne Zeilenvorschub)

<<a=>(x)?x<0/>-x:/>x
#y:20->0{#x:-30->31?a(10-a(x))==y@"~":@"|"""}

Probieren Sie es online!

Folgt dem gleichen Prinzip wie die oben gegebene C-Antwort. Die erste Zeile ist die absFunktion, in der zweiten Zeile werden zwei für Schleifen und Ausgaben ~oder |basierend auf dem Diagramm ausgeführt. Die letzte ""wird verwendet, um nach jeder Schleife eine neue Zeile auszugeben y.


1
Warum schließen Sie die Newline aus?
Conor O'Brien

Der Zeilenumbruch ist nicht erforderlich, der Zeilenumbruch kann entfernt werden und das Skript funktioniert weiterhin einwandfrei. Es ist einfach da, damit die Trennung von absFunktion und Hauptfunktion besser erkennbar ist.
Felix Guo

2

Vim, 59 Bytes

2i~^[59i|^[qqYpi|^[f~l2xA|^[q18@q11G31|qqr~jlq9@qF~2lqqr~klq8@q

Wo ^[ist der <ESC>Schlüssel?


:11<CR>kann sein11G
nmjcman101

Prost. Ich wusste nichts davon
Biowiesel

2

Japt , 32 Bytes

20ç|
AÆhX'~
VméA
VpWUVmw)c ê z ·

Probieren Sie es online!Achten Sie darauf, das Ausgabefeld zu erweitern.

Erläuterung

20ç|

Stellen Sie Uauf der |20mal.

AÆhX'~

einstellen V den Bereich [0,9]( ) ein, der zugeordnet ist durch:
U(implizit), wobei das Zeichen am Index X(aktueller Wert) auf ( h) gesetzt ist ~.

VméA

Set Wzu Vjeder Linie 10 gedreht ( A) verkohlt rechts.

VpWUVmw

Array erstellen:, V, W, UundV mit jeder Zeile in umgekehrter Reihenfolge ( w). Dies ist nun die linke Hälfte der Form, um 90 ° nach links gedreht.

c ê z ·

Reduziere das Array ( c), palendromisiere es (ê ), drehen um 90 ° nach rechts ( z) und fügen Sie neue Linien hinzu ( ·).


2

Pinsel , 36 Bytes

nicht konkurrierend

b|20{s~>v}10{>^s~}9{>vs~}>v20{>^s~}▁

Erläuterung

b|20{s~>v}10{>^s~}9{>vs~}>v20{>^s~}▁  Program
b|                                    Sets the background character to `|`
  20{    }                            Executes function 20 times
     s~                               Sets the current character to `~`
       >v                             Moves one space right and one space down
          10{    }                    Executes function 10 times
             >^                       Moves one space right and one space up
               s~                     Sets the current character to `~`
                  9{    }             Executes function 9 times
                    >v                Moves one space right and one space down
                      s~              Sets the current character to `~`
                         >v           Moves one space right and one space down
                           20{    }   Executes function 20 times
                              >^      Moves one space right and one space up
                                s~    Sets the current character to `~`
                                   ▁  Cuts off the last line (because it pads an extra line when the pointer moves near the edge)

Das erinnert mich daran, dass ich eine Spiegeloperation hinzufügen muss.


2

Oktave , 157 57 54 Bytes

Golfen Sie weiter unten, dank der anderen Antworten und den Kommentaren.

a=zeros(20,61);for i=-30:30;a(21-abs(10-abs(i)),i+31)=2;end
a=char(a+124)

Ich habe es wie die andere Antwort mit der abs (10-abs (x)) - Funktion angegangen und dann die richtigen ASCII-Zeichen verwendet, um das Bild auszudrucken.


1
Hier brauchen wir Antworten, um in einer Code-Golf-Herausforderung gut zu spielen. Zumindest sollten Sie versuchen, Golf zu spielen, indem Sie zum Beispiel unnötige Leerzeichen entfernen.
Erik the Outgolfer

1
Auch die Sprache heißt einfach "Oktave". Achten Sie beim Golfen darauf, dass Sie nicht nur alle Leerzeichen (auch die Zeilenumbrüche) entfernen, sondern auch Anweisungen wie die beiden letzten Zeilen kombinieren.
Sanchises

Wenn jemand weiß, wie ich die neue Zeile nach endfor loswerden kann, wäre das eine große Hilfe.
Michthan




1

Bubblegum , 90 Bytes

00000000: 9dcb a10d 0040 08c5 50cf cc4d 673f 85ab  .....@..P..Mg?..
00000010: b880 22fd 7972 3f07 ef98 e1cc 85e1 ca05  ..".yr?.........
00000020: 8623 97d5 78c2 abf1 8457 e305 b31a 0f78  .#..x....W.....x
00000030: f507 0fcc 54fc 6ed3 794b b6d2 c1ed 163a  ....T.n.yK.....:
00000040: b8dd 42c7 68b7 d031 f757 3ab8 dd42 07b7  ..B.h..1.W:..B..
00000050: 5be8 e076 0b1d dcaf 060f                 [..v......

Probieren Sie es online!


1

MathGolf , 22 Bytes

I{S╒xñ♂-±Iï--mÆ┬û|~§yp

Probieren Sie es online!

Erläuterung

Es ist wahrscheinlich möglich, 2-3 Bytes davon weg zu golfen, ich werde sehen, was ich tun kann.

I                        push 20
 {                       start block or arbitrary length
  S                      push 30
   ╒                     range(1,n+1)
    x                    reverse int/array/string
     ñ                   pop(a), push palindromize(a) string/list/number
      ♂                  push 10
       -                 pop a, b : push(a-b)
        ±                absolute value
         I               push 20
          ï              index of current loop, or length of last loop
           -             pop a, b : push(a-b)
            -            pop a, b : push(a-b)
             m           explicit map
              Æ          start block of length 5
               ┬         check if equal to 0
                û|~      string "|~"
                   §     get from array/string
                    y    join array without separator to string or number
                     p   print with newline

So bequem die automatisch generierten Erklärungen sind, sie verpassen normalerweise den Punkt, warum das Programm das tut ...
Jo King

@JoKing das ist so ziemlich ein Port der Jelly-Antwort. Ich habe danach mit der gleichen Logik einen 21-Byte-Code gefunden. Ich werde versuchen, eine bessere Erklärung dafür zu schreiben.
Maxb


0

Positron , 165 Bytes

i=0;while(i<20)do{k='|'*(59-2*i);if(i==10)then{j='|'*19;k=j+'~'+j;};if(i>10)then{q=39-2*i;j='|'*q;q=2*i-21;k=j+'~'+'|'*q+'~'+j;}print@('|'*i+'~'+k+'~'+'|'*i);i=i+1;}

Probieren Sie es online!

Ich denke, Positron hat zu viele Fehler. Ich sollte es auf TIO updaten, da es dann ++tatsächlich funktioniert.


0

Mathematica, 78 75 Bytes

Print[""<>Riffle[Array[If[#+Abs[10-Abs[31-#2]]==21,"~","|"]&,{20,61}],"\n"]]

außer das \nwird durch eine aktuelle newline ersetzt. Probieren Sie es online! ( In Mathematics gibt es aus irgendeinem Grund zusätzliche Leerzeichen am Anfang der Zeilen. In Mathematica funktioniert dies jedoch einwandfrei .)

Ich hatte eine eigene Vorlage, aber dann fügte Kritixi Lithos eine Erklärung hinzu, die meiner sehr ähnlich war, aber eine etwas schlauere Formel verwendete. Dies ist nur ein Teil dieser Antwort. (Geh und lies das und stimme dem zu!)


0

Bubblegum , 93 Bytes

00000000: 9dcb 390e 4301 10c2 d09e 335b 9c3d 5d56  ..9.C.....3[.=]V
00000010: e72f 4c35 327a 65bf 86ee 9830 f342 5879  ./L52ze....0.BXy
00000020: 8130 f202 848d 9797 a613 262c bc7c 6a3a  .0........&,.|j:
00000030: 60c2 552e 9858 bcdc a2f9 55ac 9916 5e6f  `.U..X....U...^o
00000040: a285 d79b 6819 eb4d b4cc fe99 165e 6fa2  ....h..M.....^o.
00000050: 85d7 9b68 e1d5 26da 782f 3578 00         ...h..&.x/5x.

Probieren Sie es online!


0

JavaScript (ES6), 87 Byte

for(a=Math.abs,y=20;y--;console.log(s))for(s='',x=-30;x<31;x++)s+=a(10-a(x))+~y?'|':'~'


0

Lua, 193 Bytes

m={}function g(x,y)if(x<62)then
m[x+y*61]="~"if(x==31or x==21or x==41)then
b=not b
end
g(x+1,y+((b and-1)or 1))end
end
g(1,0)for y=0,19 do
s=""for x=1,61 do
s=s..(m[x+y*61]or"|")end
print(s)end

Beachten Sie, dass Lua nichts ausdrucken kann, ohne eine neue Zeile zu erstellen. Aus diesem Grund muss ich eine der Regeln brechen.

Zum großen Teil minimiert:

map={}
o=20
p=61
--b is true means go up
function bounce(x,y,c)
    if (x~=p)then
        map[x+y*p]=c 
        if(x==31 or x==21 or x==41)then 
            b=not b 

        end
        bounce(x+1,y+((b and -1) or 1),c)
    end
end
bounce(1,0,"~")
--map[2+60] = "h"
for y=0,o-1 do
    str = ""
    for x=1,p do
        str = str..(map[x+y*p] or "|")
    end
    print(str)
end

Einige Änderungen wurden während der Minimierung vorgenommen, wodurch das Programm weniger erweiterbar, aber kleiner wird.

Versuchen Sie es: https://tio.run/##PY7LCoMwEEX3@YqQVVJTcWwRCp0vKV1oNa1QJ0UjGPr49TRq6eoO91wOcx/LEDp8vs1IF9da4lc5aa9aI6djkSt3a4h1pynxmwLOKD5iJog7sD2Pmf9yD@u0QrKOV6yhmkVTAtonUla8pHoLKm5BqZmtHHSmTCw9ZhoOvLZsQCHMogRdwNoMaSr/L9hevMSiePQtOTnMdwhf

Ich bin mir nicht sicher, ob jemand dies zuvor getan hat, aber ich habe versucht, durch Laden des Programms als Zeichenfolge und Verwenden von gsub (Suchen / Ersetzen) zu minimieren. Leider hat es das Programm vergrößert. Wenn dieses Programm jedoch groß genug wäre, würde es weniger Bytes ergeben.

g=string.gsub
loadstring(g(g(g('m={}function g(x,y)if(x<62vm[x+y*61]="~"if(x==31zx==21zx==41vb=not beg(x+1,y+((b and-1)z1))eeg(1,0)fzy=0,19 do s=""fzx=1,61 do s=s..(m[x+y*61]z"|")eprint(s)e','e',' end '),'v',')then '),'z','or '))()

Aufgrund seiner relativen Nähe zum tatsächlichen Ergebnis (240 Byte, nur 41 weitere) habe ich mir gedacht, dass ich es posten würde. Wenn dieses Programm mehr als 350 Bytes hätte, hätte es wahrscheinlich eine Reduzierung gegeben.


0

Java 8, 113 Bytes

v->{String r="";for(int i=-1,j;++i<20;r+="\n")for(j=61;j-->0;)r+=j==i|j+i==60|i>9&(j-i==20|j+i==40)?"~":"|";return r;}

Ich habe das Gefühl, die Schecks (j==i|j+i==60|i>9&(j-i==20|j+i==40) auf jeden Fall kann man Golf spielen, wenn man mehrere Schecks irgendwie zu einem kombiniert).

Erläuterung:

Probieren Sie es hier aus.

v->{                    // Method with empty unused parameters and String return-type
  String r="";          //  Result-String
  for(int i=-1,j;       //  Index integers
      ++i<20;           //  Loop (1) from 0 to 20 (exclusive)
      r+="\n")          //    After every iteration: append a new-line to the result-String
    for(j=61;           //   Reset `j` to 61
        j-->0;)         //   Inner loop (2) from 60 down to 0 (inclusive)
      r+=               //    Append the result-String with:
         j==i           //     If `j` and `i` are equal (top-right /),
         |j+i==60       //     or `j` + `i` is 60 (top-left \),
         |i>9           //     or we're at the bottom halve
          &(j-i==20     //      and `j` - `i` is 20 (bottom left \),
            |j+i==40)?  //      or `j` + `i` is 40 (bottom right /)
          "~"           //       Append a literal "~" to the result-String
         :              //     Else:
          "|";          //      Append a literal "|" to the result-String
                        //   End of inner loop (2) (implicit / single-line body)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the result-String
}                       // End of method


0

Tcl , 104 Bytes

time {incr j
set i 0
time {puts -nonewline [expr 21-abs(abs([incr i]-31)-10)-$j?"|":"~"]} 61
puts ""} 20

Probieren Sie es online!


Tcl , 105 Bytes

time {incr j
set i 0
time {puts -nonewline [expr $j==21-abs(abs([incr i]-31)-10)?"~":"|"]} 61
puts ""} 20

Probieren Sie es online!


Tcl , 109 Bytes

time {incr j;set i 0;time {append s [expr $j==21-abs(abs([incr i]-31)-10)?"~":"|"]} 61;set s $s\n} 20
puts $s

Probieren Sie es online!

Tcl, 143 133 123 110

Noch viel ungolfed, aber ich werde es weiterentwickeln:

time {incr j;set i 0;time {incr i;append s [expr $j==21-abs(abs($i-31)-10)?"~":"|"]} 61;set s $s\n} 20
puts $s

Demo


Wolfram gab ein bisschen Hilfe, um ein bisschen Golf zu spielen: wolframalpha.com/input/?i=-abs(10-abs(x-31))%2B21 ein Grundstück, das ich auf Desmos
Sergiol

0

05AB1E , 20 bis 19 Bytes

20F„|~20Ýû31∍ûNQèJ,

Probieren Sie es online aus.

Erläuterung:

20F               # Loop 20 times:
   „|~            #  Push the string "|~"
   20Ý            #  List of range [0,20]
      û           #  Palindromize [0..20..0]
       31        #  Shorten to length 31 [0..20..10]
          û       #  Palindromize again [0..20..10..20..0]
           NQ     #  Check if the loop index is equal to it
             è    #  And index it into the string
              J   #  Then join the list of characters together
               ,  #  And print with trailing newline

20Ýû31∍û generiert die Liste:

[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,19,18,17,16,15,14,13,12,11,10,11,12,13,14,15,16,17,18,19,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
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.