Nie jest zbyt trudno zakodować to dobrze?

17

Musisz napisać program lub funkcję w dowolnym języku, który generuje ten wzorzec:

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

Wynik składa się z 20 wierszy po 61 znaków.

Zasady

  • Standardowe luki są zabronione
  • Na końcu wyniku może znajdować się pojedynczy znak nowej linii
  • W żadnym wierszu wydruku nie może być żadnych końcowych białych znaków

Bez końcowego znaku nowej sumy kontrolnej md5 wyniku jest fde4e3b4606bf9f8c314131c93988e96.

Z końcowym znakiem nowej linii suma kontrolna wyjścia md5 wynosi 1f0b43db4fec6594be202c8339024cb7.

To jest , więc wygrywa najkrótszy kod w bajtach.

Pro11
źródło
Zredagowałem wyzwanie, aby było nieco jaśniejsze, możesz cofnąć edycję.
Kritixi Lithos
1
Narysowałem ciekawy wzór ... rextester.com/WXZV81312
sergiol

Odpowiedzi:

13

C (gcc) , 97 82 81 80 bajtów

Grał w golfa 15 bajtów po nauce, że absjest wbudowany w C, dodatkowy bajt dzięki Rogemowi za wskazanie, że deklaracje moich zmiennych można przenieść do funkcji, a kolejny bajt dzięki pułapkowi cat za sugerowanie x=31;--x+31zamiast x=-31;++x<31.

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

Wypróbuj online!

Daje to końcowy znak nowej linii. Funkcja fwykonuje dane wyjściowe.

Wyjaśnienie

Dane wyjściowe można określić jako wykres.

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

(Te +są pokazane tylko w celu wyjaśnienia i przedstawiają osie.)

Równanie tego wykresu to y=abs(10abs(x)) co można zobaczyć tutaj w tym łączu do wykresu Desmos .

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

W funkcji fmamy dwie pętle for, które iterują każdą współrzędną na tym wykresie. yprzechodzi od 20do, 1a x przechodzi od -30do 30.

Dla każdego xsprawdzamy, czyabs(10-abs(x)) jest równy y, wykonując abs(10-abs(x))-yw trójskładniku. Jeśli są one równe, daje 0to falsey wartość w C, w przeciwnym razie będzie to wartość dodatnia. Następnie w trójskładnikowego abs(10-abs(x))-y?"|":"~", mamy printfodpowiednio.

I po każdej linii puts("")wypisujemy nowy wiersz za pomocą , i w ten sposób funkcja wypisuje znak końca nowej linii.

Kritixi Lithos
źródło
1
Zaoszczędź jeden bajt f(x,y)zamiastx,y;f()
@ceilingcat Dzięki za golfa
Kritixi Lithos
11

Węgiel drzewny , 16 15 bajtów

-1 bajt dzięki notjagan

↘×~²⁰↗↗×~χ‖OUB|

Wypróbuj online!

Okx
źródło
-1 bajt poprzez usunięcie i przejście niejawnie.
notjagan
4

R , 70 67 bajtów

3 bajty dzięki Giuseppe.

write(c("|","~")[outer(abs(10-abs(-30:30)),20:1,"==")+1],"",61,,"")

Wypróbuj online!

Leaky Nun
źródło
67 bajtów
Giuseppe,
Zmień pierwszy ""na a 1dla -1.
J.Doe
3

Galaretka , 18 16 bajtów

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

Wypróbuj 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.
Dennis
źródło
3

Python 2.7, 163 138 135 133 113 91 bajtów

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]

Wypróbuj online!

Edytuj 1: -25 bajtów: zmieniłem algorytm po tym, jak poczułem się trochę ambitny. : P

Edytuj 2: -3 bajty: dzięki uprzejmości Felipe Nardi Batista

Edytuj 3: -2 bajty: dzięki uprzejmości shooqie

Edycja 4: -20 bajtów: dzięki uprzejmości notjagan

Edytuj 5: -22 bajtów: dzięki uprzejmości Dziurawej Zakonnicy

Koishore Roy
źródło
Całkowicie tego przegapiłem! Dzięki @FelipeNardiBatista. Ale to już nie ma znaczenia: P całkowicie zmienił algorytm.
Koishore Roy,
1
135 bajtów
Felipe Nardi Batista
1
ułożenie atrybutów jak a,b,c='1','2','3'jest takie samo jak a='1';b='2';c='3'i umieszczenie każdego z nich we własnej linii, ale możesz zyskać bajty poprzez rozpakowanie ciągów takich jaka,b,c='123'
Felipe Nardi Batista
1
Nie jest n<mkrótszy niż n-m<0?
shooqie,
1
Sprowadziłem to do 113 bajtów .
notjagan
3

/// , 231 bajtów

/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"&&

Wypróbuj online! Lub zobacz tutaj interaktywnie !

Conor O'Brien
źródło
3

WendyScript , 65 bajtów (wyklucz nowy wiersz)

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

Wypróbuj online!

Kieruje się tą samą zasadą, co odpowiedź C podana powyżej. Pierwszy wiersz jest absfunkcją, drugi wiersz prowadzi dwa dla pętli i wyjść ~lub |na podstawie wykresu. Ostatni ""służy do wyświetlania nowej linii po każdej pętli y.

Felix Guo
źródło
1
Dlaczego wykluczasz nową linię?
Conor O'Brien
Nowa linia nie jest wymagana, nową linię można usunąć, a skrypt nadal działa poprawnie. Właśnie tam jest, więc łatwiej jest zobaczyć rozdzielenie absfunkcji od funkcji głównej.
Felix Guo,
2

Vim, 59 bajtów

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

Gdzie ^[jest <ESC>klucz

bioweasel
źródło
:11<CR>może być11G
nmjcman101 11.07.17
Twoje zdrowie. Nie wiedziałem o tym
bioweasel
2

Japt , 32 bajty

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

Wypróbuj online! Pamiętaj, aby rozwinąć okno wyjściowe.

Wyjaśnienie

20ç|

Ustaw Una| powtarzanych 20 razy.

AÆhX'~

Ustaw Vna zakres [0,9]( ) odwzorowany przez:
U(niejawny) ze znakiem w indeksie X(bieżąca wartość) ustawionym na ( h) ~.

VméA

Zestaw Wdo Vz każdej linii obrócony 10 ( A) zwęgla rację.

VpWUVmw

Utwórz tablicę: V, W, Ui Vprzy każdej linii odwróconej ( w). To jest teraz lewa połowa kształtu, obrócona o 90 ° w lewo.

c ê z ·

Spłaszcz tablicę ( c), palendromize ( ê), obróć o 90 ° w prawo ( z) i połącz z nowymi liniami ( ·).

Justin Mariner
źródło
2

Pędzel , 36 bajtów

niekonkurujący

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

Wyjaśnienie

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)

To mi przypomina, że ​​muszę dodać operację dublowania.

HyperNeutrino
źródło
2

Oktawa , 157 57 54 bajtów

Grałem w golfa dalej, dzięki innym odpowiedziom i komentarzom.

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

Podszedłem do niego jak do innej odpowiedzi z funkcją abs (10-abs (x)), a następnie użyłem odpowiednich znaków ASCII do wydrukowania obrazu.

Michthan
źródło
1
Tutaj potrzebujemy odpowiedzi, aby dobrze zagrać w golfa. Przynajmniej powinieneś spróbować
zagrać
1
Ponadto język nazywa się po prostu „Octave”. Jeśli chodzi o grę w golfa, oprócz usuwania wszystkich białych znaków (także nowych linii), upewnij się, że łączysz wyrażenia, takie jak dwie ostatnie linie.
Sanchises,
Jeśli ktoś wie, jak mogę pozbyć się nowej linii po endfor, to byłaby świetna pomoc.
Michthan,
1

Bubblegum , 90 bajtów

00000000: 9dcb a10d 0040 08c5 50cf cc4d 673f 85ab  [email protected]?..
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......

Wypróbuj online!

ovs
źródło
1

MathGolf , 22 bajty

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

Wypróbuj online!

Wyjaśnienie

Prawdopodobnie można oderwać od tego 2-3 bajty, zobaczę, co da się zrobić.

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
maxb
źródło
O ile automatyczne generowanie wyjaśnień jest wygodne, zwykle brakuje im sensu, dlaczego program to robi ...
Jo King,
@JoKing jest to właściwie port odpowiedzi na galaretkę. Znalazłem 21 bajtów po tym, używając tej samej logiki, postaram się napisać lepsze wyjaśnienie tego.
maks.
1

C (gcc) , 75 bajtów

f(x){for(x=1240;--x;)putchar(x%62?x/62+1-abs(10-abs(x%62-31))?124:126:10);}

Wypróbuj online!

Całkowicie zmieniony od odpowiedzi szarlatanu Krowy

l4m2
źródło
0

Positron , 165 bajtów

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

Wypróbuj online!

Myślę, że Positron ma za dużo błędów. Powinienem go zaktualizować do TIO, ponieważ wtedy ++faktycznie zadziała.

HyperNeutrino
źródło
0

Mathematica, 78 75 bajtów

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

z wyjątkiem tego, że \njest zastąpiony przez rzeczywistą nową linię . Wypróbuj online! (Z jakiegoś powodu na początku linii w Mathics są dodatkowe spacje, ale w Mathematica działa dobrze .)

Wymyśliłem własne zgłoszenie, ale potem Kritixi Lithos dodał wyjaśnienie ich i było dość podobne do mojego, ale przy użyciu nieco bardziej sprytnej formuły, więc teraz jest to tylko część tej odpowiedzi. (Idź i przeczytaj ten i głosuj!)

Nie drzewo
źródło
0

Bubblegum , 93 bajty

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.

Wypróbuj online!

musicman523
źródło
0

JavaScript (ES6), 87 bajtów

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

darrylyeo
źródło
0

Lua, 193 bajtów

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

Zauważ, że Lua nie może wydrukować czegoś bez utworzenia nowej linii. Z tego powodu muszę złamać jedną z zasad.

Minimalnie zminimalizowane w dużym stopniu:

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

Niektóre zmiany zostały wprowadzone podczas minifikacji, co powoduje, że program jest mniej rozszerzalny, ale mniejszy.

Spróbuj go: https://tio.run/##PY7LCoMwEEX3@YqQVVJTcWwRCp0vKV1oNa1QJ0UjGPr49TRq6eoO91wOcx/LEDp8vs1IF9da4lc5aa9aI6djkSt3a4h1pynxmwLOKD5iJog7sD2Pmf9yD@u0QrKOV6yhmkVTAtonUla8pHoLKm5BqZmtHHSmTCw9ZhoOvLZsQCHMogRdwNoMaSr/L9hevMSiePQtOTnMdwhf

Nie jestem pewien, czy ktoś to zrobił wcześniej, ale próbowałem minimalizować, ładując program jako ciąg znaków i używając gsub (szukaj / zamień). Niestety program powiększył się. Jednak jeśli ten program byłby wystarczająco duży, dałby mniej bajtów.

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

Ze względu na jego względną bliskość do rzeczywistego wyniku (240 bajtów, tylko 41 więcej), pomyślałem, że go opublikuję. Gdyby ten program miał ponad 350 bajtów, prawdopodobnie nastąpiłaby redukcja.

AI221
źródło
0

Java 8, 113 bajtów

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

Mam przeczucie, że czeki (na j==i|j+i==60|i>9&(j-i==20|j+i==40)pewno można grać w golfa, łącząc wiele czeków w jeden.

Wyjaśnienie:

Wypróbuj tutaj.

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
Kevin Cruijssen
źródło
0

Tcl , 104 bajty

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

Wypróbuj online!


Tcl , 105 bajtów

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

Wypróbuj online!


Tcl , 109 bajtów

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

Wypróbuj online!

Tcl, 143 133 123 110

Wciąż dużo nie golfistów, ale rozwinę to po:

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

próbny

sergiol
źródło
Wolfram nieco pomógł trochę w golfa: wolframalpha.com/input/?i=-abs(10-abs(x-31))%2B21 fabuła, którą prześledziłem na Desmos: desmos.com/calculator/z9czvtpihy
sergiol
0

05AB1E , 20 19 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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∍û generuje listę:

[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]
Kevin Cruijssen
źródło