Non è troppo difficile codificare questo giusto?


17

Devi scrivere un programma o una funzione in qualsiasi lingua che emetta questo schema:

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

L'output è composto da 20 righe di 61 caratteri ciascuna.

Regole

  • Sono vietate le scappatoie standard
  • Potrebbe esserci una nuova riga finale alla fine dell'output
  • Potrebbe non esserci spazio vuoto finale su nessuna riga dell'output

Senza una nuova riga finale, il checksum md5 dell'output è fde4e3b4606bf9f8c314131c93988e96.

Con una nuova riga finale, il checksum md5 dell'output è 1f0b43db4fec6594be202c8339024cb7.

Questo è , quindi vince il codice più breve in byte.


Ho modificato la sfida per renderla leggermente più chiara, sentiti libero di ripristinare la modifica.
Kritixi Lithos,

1
Ho disegnato uno schema curioso ... rextester.com/WXZV81312
sergiol

Risposte:


13

C (gcc) , 97 82 81 80 byte

Golfato 15 byte dopo aver appreso che absè incorporato in C, un byte aggiuntivo grazie a Rogem per aver sottolineato che le dichiarazioni delle mie variabili possono essere spostate nella funzione e un altro byte grazie a ceilingcat per suggerire x=31;--x+31invece di x=-31;++x<31.

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

Provalo online!

Questo produce una nuova riga finale. La funzione fesegue l'output.

Spiegazione

L'output può essere dichiarato come un grafico.

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

(Le +s sono mostrate solo a scopo esplicativo e rappresentano gli assi.)

L'equazione di questo grafico è come si può vedere qui in questo collegamento a un grafico Desmos .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

In funzione f, abbiamo due for-loop che ripetono tutte le coordinate in questo grafico. yva da 20a 1e x va da -30a 30.

Per ogni x, controlliamo se è abs(10-abs(x))uguale yfacendo abs(10-abs(x))-yin un ternario. Se sono uguali, si ottiene 0un valore di falsità in C, altrimenti verrà valutato un valore positivo. Quindi nel ternario abs(10-abs(x))-y?"|":"~", di printfconseguenza.

E dopo ogni riga, viene generata una nuova riga usando puts(""), ed è così che la funzione genera una nuova riga finale.


1
Salvare un byte con f(x,y)invece dix,y;f()

@ceilingcat Grazie per il golf
Kritixi Lithos



3

Gelatina , 18 16 byte

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

Provalo 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 byte

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]

Provalo online!

Modifica 1: -25 byte: ha cambiato l'algoritmo dopo che mi sono sentito un po 'ambizioso. : P

Modifica 2: -3 byte: cortesia Felipe Nardi Batista

Modifica 3: -2 byte: shooqie di cortesia

Modifica 4: -20 byte: cortesia notjagan

Modifica 5: -22 byte: cortesia Leaky Nun


Completamente perso quello! Grazie @FelipeNardiBatista. Non importa più: P ha cambiato completamente l'algoritmo.
Koishore Roy,


1
impilare attributi come a,b,c='1','2','3'è lo stesso a='1';b='2';c='3'e mettere tutti nella propria linea, ma puoi guadagnare byte scompattando stringhe comea,b,c='123'
Felipe Nardi Batista,

1
Non è n<mpiù breve di n-m<0?
shooqie,

1
Ridotto a 113 byte .
notjagan,

3

/// , 231 byte

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

Provalo online! Oppure, visualizzalo interattivamente qui !


3

WendyScript , 65 byte (escludi newline)

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

Provalo online!

Segue lo stesso principio della risposta C data sopra. La prima riga è la absfunzione, la seconda riga ne esegue due per loop e output ~o in |base al grafico. L'ultimo ""viene utilizzato per emettere una nuova riga dopo ogni loop attivo y.


1
Perché stai escludendo la nuova riga?
Conor O'Brien,

La nuova riga non è necessaria, la nuova riga può essere rimossa e lo script continua a funzionare correttamente. È proprio lì, quindi è più facile vedere la separazione della absfunzione rispetto alla funzione principale.
Felix Guo,


2

Japt , 32 byte

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

Provalo online! Assicurati di espandere la casella di output.

Spiegazione

20ç|

Impostato Usu |ripetuto 20 volte.

AÆhX'~

Impostato Vsull'intervallo [0,9]( ) mappato da:
U(implicito) con il carattere all'indice X(valore corrente) impostato su ( h) ~.

VméA

Impostare Wsu Vcon ogni riga ruotata di 10 ( A) caratteri a destra.

VpWUVmw

Crea array:, V, W, Ue Vcon ciascuna riga invertita ( w). Questa è ora la metà sinistra della forma, ruotata di 90 ° a sinistra.

c ê z ·

Appiattire l'array ( c), palendromizzarlo ( ê), ruotare di 90 ° a destra ( z) e unirlo a newline ( ·).


2

Pennello , 36 byte

fuori concorso

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

Spiegazione

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)

Questo mi ricorda che devo aggiungere un'operazione mirror.


2

Ottava , 157 57 54 byte

Scivolando più in basso, grazie alle altre risposte e ai commenti.

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

Mi sono appena avvicinato come l'altra risposta con la funzione abs (10-abs (x)) e poi ho usato i caratteri ASCII giusti per stampare l'immagine.


1
Qui abbiamo bisogno di risposte per giocare bene in una sfida di code-golf. Almeno dovresti
provare

1
Inoltre, la lingua si chiama semplicemente "Ottava". Per quanto riguarda il golf, oltre a rimuovere tutti gli spazi bianchi (anche le nuove righe), assicurati di combinare le istruzioni, come le due linee finali.
Sanchises,

Se qualcuno sa come posso liberarmi della newline dopo endfor, sarebbe di grande aiuto.
Michthan,




1

Bubblegum , 90 byte

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

Provalo online!


1

MathGolf , 22 byte

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

Provalo online!

Spiegazione

Probabilmente è possibile giocare a golf a 2-3 byte da questo, vedrò cosa posso fare.

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

Per quanto le spiegazioni generate automaticamente siano convenienti, di solito mancano il motivo per cui il programma lo sta facendo ...
Jo King,

@JoKing questa è praticamente una porta della risposta Jelly. Ho trovato un 21-byte dopo questo usando praticamente la stessa logica, proverò a scrivere una spiegazione migliore per questo.
max

1

C (gcc) , 75 byte

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

Provalo online!

Totalmente cambiato dalla risposta del quack di Cows


0

Positron , 165 byte

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

Provalo online!

Penso che Positron abbia troppi bug. Dovrei farlo aggiornare a TIO perché allora ++funzionerà davvero.


0

Mathematica, 78 75 byte

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

tranne che \nè sostituito da una nuova riga effettiva. Provalo online! (Ci sono spazi extra all'inizio delle linee in Matematica per qualche motivo, ma funziona bene in Mathematica .)

Mi è venuta in mente una mia presentazione, ma poi Kritixi Lithos ha aggiunto una loro spiegazione ed era abbastanza simile alla mia ma usando una formula leggermente più intelligente, quindi ora questa è solo una porta di quella risposta. (Vai a leggere quello e votalo!)


0

Bubblegum , 93 byte

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.

Provalo 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 byte

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

Nota che Lua non può stampare qualcosa senza creare una nuova linea. Per questo motivo, devo infrangere una delle regole.

Ridotto al minimo in larga misura:

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

Alcune modifiche sono state apportate durante la minificazione, il che rende il programma meno estensibile ma più piccolo.

Provalo: https://tio.run/##PY7LCoMwEEX3@YqQVVJTcWwRCp0vKV1oNa1QJ0UjGPr49TRq6eoO91wOcx/LEDp8vs1IF9da4lc5aa9aI6djkSt3a4h1pynxmwLOKD5iJog7sD2Pmf9yD@u0QrKOV6yhmkVTAtonUla8pHoLKm5BqZmtHHSmTCw9ZhoOvLZsQCHMogRdwNoMaSr/L9hevMSiePQtOTnMdwhf

Non sono sicuro che qualcuno l'abbia già fatto prima, ma ho provato a minimizzare caricando il programma come stringa e usando gsub (cerca / sostituisci). Incredibilmente, ha reso il programma più grande. Tuttavia, se questo programma fosse abbastanza grande, produrrebbe in meno byte.

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

A causa della sua relativa vicinanza con il risultato reale (240 byte, solo 41 in più), ho pensato di pubblicarlo. Se questo programma avesse 350+ byte, probabilmente ci sarebbe stata una riduzione.


0

Java 8, 113 byte

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

Ho la sensazione che i controlli (j==i|j+i==60|i>9&(j-i==20|j+i==40) possono sicuramente essere giocati a golf combinando in qualche modo più controlli in uno.

Spiegazione:

Provalo qui.

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 byte

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

Provalo online!


Tcl , 105 byte

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

Provalo online!


Tcl , 109 byte

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

Provalo online!

Tcl, 143 133 123 110

Ancora molto non golfato, ma lo farò evolvere dopo:

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

dimostrazione


Wolfram ha dato un piccolo aiuto per giocare a golf un po 'di più: wolframalpha.com/input/?i=-abs(10-abs(x-31))%2B21 una trama che ho tracciato su Desmos: desmos.com/calculator/z9czvtpihy
sergiol

0

05AB1E , 20 19 byte

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

Provalo online.

Spiegazione:

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∍û genera l'elenco:

[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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.