Не так уж сложно кодировать это правильно?


17

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

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

Вывод состоит из 20 строк по 61 символа в каждой.

правила

  • Стандартные лазейки запрещены
  • В конце вывода может быть один завершающий символ новой строки
  • В каждой строке вывода не должно быть конечных пробелов

Без завершающего символа новой строки контрольная сумма md5 вывода fde4e3b4606bf9f8c314131c93988e96 .

С завершающим символом новой строки контрольная сумма md5 для вывода равна 1f0b43db4fec6594be202c8339024cb7 .

Это , поэтому выигрывает самый короткий код в байтах.


Я отредактировал задачу, чтобы сделать ее немного понятнее, не стесняйтесь откатить редактирование.
Kritixi Lithos

1
Я нарисовал любопытный узор ... rextester.com/WXZV81312
sergiol

Ответы:


13

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

Проиграл 15 байтов после изучения absвстроенного в C, еще одного байта, спасибо Rogem за то, что он указал, что объявления моих переменных могут быть перемещены в функцию, и еще один байт, который получен с помощью roofcat за предложение 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к ошибочному значению в C, в противном случае он будет иметь некоторое положительное значение. Тогда в троице abs(10-abs(x))-y?"|":"~"мы printfсоответственно.

И после каждой строки мы выводим новую строку, используя puts(""), и так выводит функция с завершающим переводом строки.


1
Сохраните один байт f(x,y)вместоx,y;f()

@ceilingcat Спасибо за гольф
Критиси Литос



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 байт: изменил алгоритм после того, как я почувствовал себя немного амбициозным. :П

Редактировать 2: -3 байта: предоставлено Фелипе Нарди Батиста

Редактировать 3: -2 байта: любезность shooqie

Редактировать 4: -20 байтов: любезно предоставлено

Редактировать 5: -22 байта: любезно предоставлено Leaky Nun


Полностью пропустил это! Спасибо @FelipeNardiBatista. Это уже не имеет значения: P полностью изменил алгоритм.
Койшор Рой


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@"~":@"|"""}

Попробуйте онлайн!

Следует тому же принципу, что и ответ C, приведенный выше. Первая строка - это absфункция, вторая - две для циклов и выходов ~или |на основе графика. Последний ""используется для вывода новой строки после каждого цикла y.


1
Почему вы исключаете новую строку?
Конор О'Брайен

Новая строка не требуется, новая строка может быть удалена, а сценарий по-прежнему работает нормально. Это просто так, так что легче увидеть разделение absфункции от основной функции.
Феликс Го


2

Japt , 32 байта

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

Попробуйте онлайн! Обязательно расширьте поле вывода.

объяснение

20ç|

Установите Uв |неоднократных 20 раз.

AÆhX'~

Устанавливается Vв range [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
Также язык называется просто «октава». Что касается игры в гольф, кроме удаления всех пробелов (также и новых строк), убедитесь, что вы объединяете утверждения, как две последние строки.
Sanchises

Если кто-нибудь знает, как я могу избавиться от новой строки после endfor, это было бы очень полезно.
Михтан




1

Жевательная резинка , 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

Хотя автоматические сгенерированные объяснения удобны, они обычно упускают суть того, почему программа делает это ...
Джо Кинг,

@ Шучу, это в значительной степени порт Джелли. После этого я нашел 21-байтовый код, использующий почти ту же логику, я постараюсь написать лучшее объяснение этому.
максимум


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

Попробуйте онлайн!

Я думаю, что в Позитроне слишком много ошибок. Я должен обновить его до TIO, потому что тогда на ++самом деле будет работать.


0

Mathematica, 78 75 байтов

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

за исключением того, \nчто заменяется фактическим переводом строки. Попробуйте онлайн! (По какой-то причине в начале строк в Mathics есть лишние пробелы, но в Mathematica это работает нормально .)

Я придумала собственное представление, но затем Kritixi Lithos добавил их объяснение, и оно было очень похоже на мое, но с использованием немного более умной формулы, так что теперь это всего лишь порт этого ответа. (Пойди и прочитай это и скажи!)


0

Жевательная резинка , 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: 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.