Не надто важко кодувати це право?


17

Ви повинні написати програму або функцію будь-якою мовою, яка виводить цей шаблон:

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

Вихід складається з 20 рядків по 61 символ.

Правила

  • Стандартні лазівки заборонені
  • В кінці виходу може бути одна затримка нового рядка
  • У будь-якому рядку виводу може бути відсутність пробілів

Без зворотного нового рядка контрольна сума виводу md5 є fde4e3b4606bf9f8c314131c93988e96.

З останньою новою лінією є контрольна сума виводу md5 1f0b43db4fec6594be202c8339024cb7.

Це , тому виграє найкоротший код у байтах.


Я відредагував виклик, щоб зробити його трохи зрозумілішим, сміливо відкатуйте правки.
Kritixi Lithos

1
Я намалював цікавий візерунок ... rextester.com/WXZV81312
sergiol

Відповіді:


13

C (gcc) , 97 82 81 80 байт

Після 15-ти байтових байтів, дізнавшись, що absце вбудований C, додатковий байт завдяки Рогем за те, що він зазначив, що декларації моїх змінних можуть бути переміщені до функції, а ще один байт - завдяки навісному коту за пропозицію x=31;--x+31замість x=-31;++x<31.

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

Спробуйте в Інтернеті!

Це виводиться із заднім рядком. Функція fвиконує вихід.

Пояснення

Вихід може бути вказаний у вигляді графіка.

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

( +S показані лише з метою пояснення і представляють осі.)

Рівняння цього графа дорівнює y=abs(10abs(x)) як це можна побачити в цьому посиланні на графік Десмоса .

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

У функції у fнас є дві for-петлі, які повторюються через кожну координату на цьому графіку. yйде від 20до 1і х переходить від -30до 30.

Для кожного xми перевіряємо, чи abs(10-abs(x))дорівнює y, виконуючи abs(10-abs(x))-yв потрійному. Якщо вони рівні, це вихід 0, значення фальси в С, інакше воно буде оцінено до деякого позитивного значення. Тоді в трійці abs(10-abs(x))-y?"|":"~"ми printfвідповідно.

І після кожного рядка ми виводимо новий рядок, використовуючи puts(""), і саме так функція виводиться із зворотним новим рядком.


1
Збережіть один байт, f(x,y)а неx,y;f()

@ceilingcat Спасибі за гольф
Kritixi Lithos



3

Желе , 18 16 байт

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

Спробуйте в Інтернеті!

⁵×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 байт

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]

Спробуйте в Інтернеті!

Редагувати 1: -25 байт: змінив алгоритм після того, як я відчув себе трохи амбітним. : P

Редагуйте 2: -3 байти: люб’язно Феліпе Нарді Батіста

Редагуйте 3: -2 байти: ввічливість шокі

Редагуйте 4: -20 байт: ввічливість надано

Редагуйте 5: -22 байти: люб’язно надайте Leaky Nun


Повністю пропустив це! Дякуємо @FelipeNardiBatista. Це вже не має значення: P повністю змінив алгоритм.
Koishore Roy


1
розміщення атрибутів на кшталт a,b,c='1','2','3'- це те саме, що a='1';b='2';c='3'і розміщення кожного в його власному рядку, але ви можете отримати байти, розпаковуючи рядки типуa,b,c='123'
Феліпе Нарді Батіста,

1
Чи не n<mкоротше n-m<0?
shooqie

1
Зменшив її до 113 байт .
notjagan


3

WendyScript , 65 байт (виключаючи новий рядок)

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

Спробуйте в Інтернеті!

Дотримується того самого принципу, що і відповідь С, наведена вище. Перший рядок - це absфункція, другий рядок працює два для циклів і виходів ~або |на основі графіка. Останній ""використовується для виведення нового рядка після кожного циклу y.


1
Чому ви виключаєте новий рядок?
Conor O'Brien

Новий рядок не потрібно, новий рядок можна видалити, а сценарій все ще працює. Це просто там, тому легше бачити поділ absфункції від основної функції.
Фелікс Го


2

Japt , 32 байти

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

Спробуйте в Інтернеті! Не забудьте розгорнути вихідне поле.

Пояснення

20ç|

Встановіть Uв |неодноразових 20 разів.

AÆhX'~

Встановіть Vдіапазон [0,9]( ), відображений за допомогою:
U(неявно) із символом в індексі X(поточне значення), встановленим на ( h) ~.

VméA

Встановіть, Wщоб Vкожен рядок обертав 10 ( A) символів праворуч.

VpWUVmw

Створити масив:, V, W, Uі Vз кожним рядком, оберненим назад ( w). Це тепер ліва половина форми, повернена на 90 ° ліворуч.

c ê z ·

cВирівняти масив ( ), палендромізувати його ( ê), повернути на 90 ° вправо ( z) і з'єднати з новими рядками ( ·).


2

Пензлик , 36 байт

неконкурентоспроможний

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

Пояснення

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)

Це мені нагадує, мені потрібно додати дзеркальну операцію.


2

Октава , 157 57 54 байт

Завдяки іншим відповідям та коментарям, гольфував це далі.

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

Я просто підійшов до нього, як і до іншої відповіді за допомогою функції abs (10-abs (x)), а потім використав правильні символи ASCII для роздрукування зображення.


1
Тут ми вимагаємо відповіді, щоб добре пограти в гольф-коді. Принаймні, вам слід спробувати
пограти

1
Також мову називають просто «Октавою». Що стосується гольфу, окрім видалення всього пробілу (нові рядки теж), обов’язково поєднуйте висловлювання, як і два заключні рядки.
Санчіз

Якщо хтось знає, як я можу позбутися нового рядка після ендфору, це було б чудовою допомогою.
Міхтан




1

Bubblegum , 90 байт

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

Спробуйте в Інтернеті!


1

MathGolf , 22 байти

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

Спробуйте в Інтернеті!

Пояснення

Мабуть, можна покататися на 2-3 байти від цього, я побачу, що я можу зробити.

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

Наскільки зручні автоматично створені пояснення, вони, як правило, пропускають думку, чому програма робить це ...
Джо Кінг

@JoKing це в значній мірі портрет відповіді Jelly. Я знайшов 21 байт після цього, використовуючи майже таку ж логіку, спробую написати краще пояснення для цього.
maxb


0

Позитрон , 165 байт

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

Спробуйте в Інтернеті!

Я думаю, що у Positron є занадто багато помилок у ньому. Мені слід оновити його до TIO, оскільки тоді ++він справді спрацює.


0

Математика, 78 75 байт

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

за винятком того \n, що замінено фактичним новим рядком. Спробуйте в Інтернеті! (З’являються додаткові пробіли на початку рядків у Mathics чомусь, але це добре працює в Mathematica .)

Я придумав своє власне подання, але тоді Kritixi Lithos додав їхнє пояснення, і це було досить схоже на моє, але використовуючи дещо розумнішу формулу, тож тепер це лише відповідь на цю відповідь. (Перейдіть і прочитайте це і підтвердіть!)


0

Bubblegum , 93 байти

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.

Спробуйте в Інтернеті!



0

Луа, 193 байт

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

Зауважте, що Lua не може щось надрукувати без створення нового рядка. З цієї причини я повинен порушити одне з правил.

Мінімально в значній мірі мінімізовані:

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

Деякі зміни відбулися під час мінімізації, і все це робить програму менш розширеною, але меншою.

Спробуй це: https://tio.run/##PY7LCoMwEEX3@YqQVVJTcWwRCp0vKV1oNa1QJ0UjGPr49TRq6eoO91wOcx/LEDp8vs1IF9da4lc5aa9aI6djkSt3a4h1pynxmwLOKD5iJog7sD2Pmf9yD@u0QrKOV6yhmkVTAtonUla8pHoLKm5BqZmtHHSmTCw9ZhoOvLZsQCHMogRdwNoMaSr/L9hevMSiePQtOTnMdwhf

Я не впевнений, чи робив це хтось раніше, але я спробував мінімізувати, завантаживши програму як рядок та використовуючи gsub (пошук / заміна). Незручно це зробило програму більшою. Однак, якби ця програма була досить великою, вона отримала б менше байтів.

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

Через свою відносну близькість з реальним результатом (240 байт, лише 41) я зрозумів, що опублікую його. Якби ця програма мала 350 байт, швидше за все, скорочення було б.


0

Java 8, 113 байт

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

Я відчуваю чеки (j==i|j+i==60|i>9&(j-i==20|j+i==40) точно можна пограти в гольф, якось об'єднавши кілька чеків в один.

Пояснення:

Спробуйте тут.

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 байти

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

Спробуйте в Інтернеті!


Tcl , 105 байт

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

Спробуйте в Інтернеті!


Tcl , 109 байт

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

Спробуйте в Інтернеті!

Tcl, 143 133 123 110

Ще багато невтішених, але я розвину це після:

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

демонстрація


Вольфрам дав трохи допомогу в гольфі трохи більше: wolframalpha.com/input/?i=-abs(10-abs(x-31))%2B21 сюжет, який я простежив на Десмосі: desmos.com/calculator/z9czvtpihy
sergiol

0

05AB1E , 20 19 байт

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

Спробуйте в Інтернеті.

Пояснення:

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∍û генерує список:

[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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.