ASCII Art of the Day # 1 - Double Knot

47

Napisz pełny program lub funkcję, która przyjmuje dodatnią liczbę całkowitą Njako dane wejściowe przez STDIN / wiersz poleceń / ARGV lub argumenty funkcji i wypisuje podwójny węzeł ASCII odpowiadający NSTDOUT.

Podwójny węzeł ASCII wygląda następująco:

  __  __  __  __  __  __
 /  \/  \/  \/  \/  \/  \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
 \ \/\ \/\ \/\ \/\ \/\ \/
 /\ \/\ \/\ \/\ \/\ \/\ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
 \__/\__/\__/\__/\__/\__/

Powyższe dotyczy N = 6

Oto jeszcze kilka podwójnych węzłów dla innych wartości N:

Jeśli N = 1wyjściowy podwójny węzeł wygląda następująco:

  __
 /  \
| /\ |
| \/ |
 \ \/
 /\ \
| /\ |
| \/ |
 \__/

Bo to N = 2jest

  __  __ 
 /  \/  \
| /\/ /\ |
| \/ /\/ |
 \ \/\ \/
 /\ \/\ \
| /\/ /\ |
| \/ /\/ |
 \__/\__/

Bo to N = 3jest

  __  __  __ 
 /  \/  \/  \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
 \ \/\ \/\ \/
 /\ \/\ \/\ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
 \__/\__/\__/

i podobnie, wzorzec trwa i każda większa wartość N.

Szczegóły :

  • Dane wejściowe są zawsze dodatnimi liczbami całkowitymi większymi niż 0.
  • Końcowy znak nowej linii jest opcjonalny
  • W każdej linii nie powinno być ani spacji końcowych, ani wystarczającej liczby spacji końcowych, aby długość każdego wiersza wynosiła 4*N + 2.
  • Nigdy nie powinno być żadnej wiodącej przestrzeni, która nie jest częścią określonego wzorca.

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


Seria liderów

Przekształcam to w serię wyzwań artystycznych ASCII, dodając w ten sposób tabelę liderów serii (fragment autorstwa Martina). Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:

# Language Name, N bytes

gdzie N jest rozmiarem Twojego zgłoszenia. Jeśli poprawisz swój wynik, możesz zachować stare wyniki w nagłówku, przekreślając je. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes


Jak dotąd seria

1. Podwójny węzeł

2. Flow Snakes

3. Chińskie świątynie

4. Znaki zodiaku

5. Losowe diamentowe tilings

Optymalizator
źródło
1
Dlaczego prawa krawędź jest inna dla N = 3?
aditsu
@aditsu Haha. 4 dni, 3K wyświetleń, 11 odpowiedzi i jesteś pierwszą osobą, która to zauważy: D. Naprawiony!
Optymalizator

Odpowiedzi:

12

CJam, 55 bajtów

Bardzo mnie to poraziło nerda ... w końcu wymyśliłem 55 bajtów ISO 8859-1:

"²îå<63Åhbغ¢dräOä[æTZ"246b5b"|_ \/"f=9/4/~2/\ri*2>*zN*

lub ta alternatywa :

"ô/Ht]õDz1M;í,D¯Tmä$:r"246b5b"_/\ |"f=9/2/~+ri*2>\++zN*

Początkowo próbowałem to zrobić jako zwykły ASCII, ale sprowadziłem go tylko do 58 bajtów :

"C]VA~`+-WIt*n_I?FanSEo*b"128b5b"_/|\ "f=9/4/~2/\ri*2>*zN*

i znowu alternatywa :

"1,*Ap7c?UvI$yQHqHqs~=}n"153b5b"_ /|\\"f=9/2/~+ri*2>\++zN*

Wyjaśnienie:

Chodzi o to, aby zakodować unikalne części (lewą krawędź, prawą krawędź i wzór środkowy) w wygodny sposób, powtórzyć środkową część w razie potrzeby i złożyć je razem. Kod okazał się pod wieloma względami podobny do odpowiedzi Dennisa; Nie próbowałem go skopiować, ale wypróbowałem wiele różnych podejść (w tym wykorzystując więcej symetrii i powtórzeń) i to właśnie działało najlepiej.

Łączę lewą i prawą krawędź w następujący sposób:

    
 /\ 
|  |
|  |
 \/ 
 /\ 
|  |
|  |
 \/ 

Środkowy wzór ma 4 kolumny, ale są one powtarzane N-0,5 razy, tj. Jedno powtórzenie jest przecinane na pół. Dla wygody użyłem tego wzoru:

  __
\/  
/ /\
 /\/
/\ \
\/\ 
/ /\
 /\/
/\__

i usunąłem pierwszą połowę pierwszego powtórzenia.

Więc dołączyłem do części i zakodowałem je w formie transponowanej, ponieważ łatwiej jest z nimi pracować w ten sposób. Pierwszy i trzeci program kodują ten ciąg:

 \/ /\/ /
 / /\/ /\
_ /\ \/\_
_ \/\ \/_
  ||  || 
 /  \/  \
 \  /\  /
  ||  || 

(bez nowych linii), czyli transpozycja środkowych + krawędzi. Drugi i czwarty program („alternatywy”) kodują ten ciąg:

  ||  || 
 /  \/  \
 \  /\  /
  ||  || 
 \/ /\/ /
 / /\/ /\
_ /\ \/\_
_ \/\ \/_

znowu, bez nowych linii, a to jest transpozycja krawędzi + środek.

Oto jak działa ta wspólna część kodu:

"…"        encoded string (constructed via the reverse process,
           using a suitable base that gives valid characters)
246b       convert the string to an integer, treating each character as a digit
           in base 246 (or other bases in the ASCII versions)
5b         convert the number to base 5, obtaining 72 digits from 0 to 4,
           representing the 5 different characters we have
"|_ \/"f=  convert the digits to their corresponding characters
           (each program uses a different assignment order)
9/         split the resulting strings into 8 strings of 9 characters
           if viewed as lines, they look exactly like the 2 patterns shown above

Następnie implementacja różni się nieznacznie. W pierwszym i trzecim programie mamy:

4/     split the lines into groups of 4 - the middle part and the edges
~      dump the two 4-line parts onto the stack
2/     split the second part (the edges) into 2 groups of 2 lines
       (left edge and right edge)
\      swap the edges with the middle part
ri*    read the input, convert to integer (N) and repeat the middle part N times
2>     remove the first 2 lines (first half of first repetition)
*      join the 2 edges using the repeated middle part as a separator
z      transpose the result back to the desired form
N*     join with newlines

W drugim i czwartym (alternatywnym) programie mamy:

2/     split the lines into groups of 2
       (left edge, right edge, middle first half, middle 2nd half)
~      dump all the groups onto the stack
+      join the two middle halves into a single middle group of 4 lines
ri*    read the input, convert to integer (N) and repeat the middle part N times
2>     remove the first 2 lines (first half of first repetition)
\      swap the repeated middle with the right edge
+      concatenate the middle with the right edge
+      concatenate the left edge with the rest
z      transpose the result back to the desired form
N*     join with newlines
aditsu
źródło
Nie jestem pewien, jak długo starałem się 1>W<skrócić. Okazuje się, że musiałem tylko obrócić tablicę przed jej zakodowaniem i użyć 2>...
Dennis
23

CJam, 103 92 83 69 66 57 bajtów

"O5àäªÞáKZò,_÷%SJ«Ò"248b5b"/ \_|"f=9/4/~ri*1>W<+2m<zN*

Wypróbuj online w interpretatorze CJam .

Pomysł

Wzór staje się o wiele bardziej oczywisty, gdy transponujemy wiersze z kolumnami (wypełnione spacją po prawej stronie).

Na przykład dla danych wejściowych 3 daje to:

  ||  || 
 /  \/  \
_ /\ \/\_
_ \/\ \/_
 \/ /\/ /
 / /\/ /\
_ /\ \/\_
_ \/\ \/_
 \/ /\/ /
 / /\/ /\
_ /\ \/\_
_ \/\ \/_
 \  /\  /
  ||  || 

Pierwsze dwa i ostatnie dwa rzędy są wyjątkowe, ale pozostałe powtarzają ten sam wzór w kółko.

Zatem dla wejścia N wszystko, co musimy zrobić, to powtórzyć

 / /\/ /\
_ /\ \/\_
_ \/\ \/_
 \/ /\/ /

N razy zamień pierwszy rząd na

  ||  || 
 /  \/  \

ostatni wiersz z

 \  /\  /
  ||  || 

i na koniec transponuj wiersze z kolumnami.

Kod

"O5àäªÞáKZò,_÷%SJ«Ò"

248b  e# Convert the string (array of code points in base 248) to an integer.
5b    e# Convert the integer to the array of its digits in base 5.

      e# This pushes the following array:

      e# [ 1 2 1 1 0 2 1 1 0 1 1 4 4 1 1 4 4 1 1 1 4 4 1 1
      e#   4 4 1 1 0 1 1 2 0 1 1 2 1 0 1 0 2 0 1 0 2 3 1 0
      e#   2 1 2 0 2 3 3 1 2 0 2 1 2 0 3 1 2 0 1 0 2 0 1 0 ]

"/ \_"

f=    e# Retrieve the chars that correspond to the indexes in the array.

      e# This pushes the following string:

      e# " \  /\  /  ||  ||   ||  ||  /  \/  \ / /\/ /\_ /\ \/\__ \/\ \/_ \/ /\/ /"

9/4/~ e# Divide into groups of 4 strings of length 9.

      e# This pushes the following arrays:

      e# [ " \  /\  /"   "  ||  || "   "  ||  || "   " /  \/  \" ]
      e# [ " / /\/ /\"   "_ /\ \/\_"   "_ \/\ \/_"   " \/ /\/ /" ]

ri    e# Read an integer from STDIN.
*     e# Repeat the last array that many times.
1>W<  e# Remove the first and last string from the array.
+     e# Concatenate both arrays.
2m<   e# Rotate the concatenated arrays two elements to the left.
z     e# Zip the array of strings (transpose rows with columns).
N*    e# Join the strings of the array, separating by linefeeds.
Dennis
źródło
12

JavaScript ( wersja robocza ES7 ), 169 163 160 158 bajtów

Edycja: -6 za pomocą ciągu szablonu, aby wyeliminować pewne powtórzenia z ciągu wzoru.

Edycja: -3 przez zmianę z slice(0,-2)na slice(2)przez zmianę kolejności łańcucha wzorca.

Edycja: -2 przez zapętlenie bzamiast ai zmniejszenie aciągu do 4 za pomocą modulo.

F=N=>[(a='  ||'[i%4])+b[i]+`  __0\\/ ${c=' 0/ /\\0 /\\/0/\\'} \\0\\/\\${c}__`.split(0)[i].repeat(N).slice(2)+(b+b)[9-i]+a for(i in b=' /  \\/  \\')].join(`
`)
<input id="stdin" value="4" />
<button onclick="stdout.innerHTML=F(stdin.value)">Run</button><br />
<pre id="stdout"></pre>

Skomentowano:

F=N=>[ // define function F, start array comprehension to generate each line
    (a = '  ||'[i % 4]) + // first character of the line, store copy in a
    b[i] + // second character of each line
        `  __0\\/ ${c=' 0/ /\\0 /\\/0/\\'} \\0\\/\\${c}__`. 
        // list of patterns for each line delimited by 0's
        // results in string: '  __0\/  0/ /\0 /\/0/\ \0\/\ 0/ /\0 /\/0/\__'
        split(0)[i]. // split by 0, get index at i
        repeat(N). // repeat N times
        slice(2) + // chop off the first 2 characters
    (b + b)[9 - i] + // get opposite of second character, b+b to get a space at index 9
    a // repeat first character (a)
    for(i in b = ' /  \\/  \\') // runs for each index in character map b
].join(` // join resulting array with newlines
`)
nderscore
źródło
Myślę, że można wymienić łańcuch zanim .split(0)się ('__ 0 '+(r='\\/0/\\/ 0\\/ /0 ')+r+'0\\/ /0__/\\').
flawr
@flawr byłem w stanie jeszcze bardziej skondensować, używając podobnej metody :)
nderscore
Jeśli 0go przekażesz, zobaczysz 8.
Ismael Miguel
Co one `` i ${...}dokładnie robią?
flawr
@flawr Składnia backtick `deklaruje ciąg szablonu . Wszystko w środku ${}jest oceniane jako wyrażenie javascript.
nderscore
9

Perl, 134 129

print s/...\K.{4}/$&x~-"@ARGV"/er=~y!iolp!| /\\!r,$/for
map/i/?$_.oi:"o$_$_".o,o__o,loop,@x=(iolplolp,ioplolpl),popl,lpop,@x,p__l

Pobiera parametr wiersza polecenia:

$ perl ~/knot.pl 3
  __  __  __  
 /  \/  \/  \ 
| /\/ /\/ /\ |
| \/ /\/ /\/ |
 \ \/\ \/\ \/ 
 /\ \/\ \/\ \ 
| /\/ /\/ /\ |
| \/ /\/ /\/ |
 \__/\__/\__/ 
nutki
źródło
8

JavaScript ( ES6 ), 165 166

Elementy węzłów:

  • 2 górne wiersze na podstawie powtórzeń „__” i „/ \”
  • 2 zewnętrzne rzędy, na podstawie „/ \ /” powtórzonych i ujęte w „| ... |
  • 2 wewnętrzne rzędy, na podstawie „\ / \” powtórzonych i ujęte w „... /” i „/ ... \”
  • te same 2 zewnętrzne rzędy powyżej
  • 1 dolny wiersz na podstawie powtarzanego „\ __ /”

Bez golfa

K=r=>
{
  R = x => x.repeat(r);
  S = d => R(elem).slice(d,d-2); // use global 'elem' that must be assigned before the call
  elem = '/\\/ '
  outer = '\n| ' + S(0) + ' |\n| ' + S(1) + ' |\n '
  elem = '\\ \\/'
  inner = '\\' + S(1) + '/\n /' + S(0) + '\\'
  return R('  __') + '\n ' + R('/  \\') + outer
  + inner + outer + R('\\__/')
}

Grał w golfa

K=r=>(S=d=>(R=e=>e.repeat(r))(e).slice(d,d-2),o=`
| ${S(0,e='/\\/ ')} |
| ${S(1)} |
 `,R('  __')+`
 ${R('/  \\')+o}\\${S(1,e='\\ \\/')}/
 /${S(0)}\\${o}`+R('\\__/'))

// TEST

function go() {
  O.innerHTML=K(I.value)
}

go()
<input id=I value=5><button onclick='go()'>-></button><br>
<pre id=O></pre>

edc65
źródło
2
Spróbuj przejść 0do niego, a dostaniesz czteronożnego pająka.
Ismael Miguel
8

C ++, 1530 639 479

To wyglądało na zabawne wyzwanie, które nieco odbiegałem od briefu.

#include "stdafx.h"
#include <iostream>
#include <sstream>
using namespace std;
string a=" __ ",b="/  \\",c=" /\\",d="/\\/ ",f="\\ \\/",g="/\\\ \\",r="\\__/",o="",e=o,j="|";
string q(int n,string r,string x="",string m=" ",string t=" "){string z=o;for(int i=0;i<n;i++){z+=r;if(i!=n-1)z+=x;}return m+z+t+"\n";}
int main(){int x,y;cin>>x;cin>>y;e+=q(x,a)+q(x,b);for(int i=0;i<y;i++){e+=q(x,c,"/",j," |")+q(x-1,d,o,"| \\/ ",j);if(i!=y-1){e+=q(x,f)+q(x,g);}}e+=q(x,r);cout<<e;}

Nie jestem pewien, jak mierzyć bajty wielkości mojej aplikacji, ale spróbuję to rozgryźć i zaktualizować swoją odpowiedź.

Moja aplikacja może być mniejsza, ale zapętla się zarówno w x, jak i y, i trochę to lubię: D

Astronauta
źródło
1
Witamy w PPCG! Twój wynik to rozmiar kodu źródłowego, który wynosi 1530 bajtów. Możesz zacząć zapisywać bajty, usuwając komentarze i białe znaki oraz skracając nazwy zmiennych i funkcji.
Dennis
Wowzor, który jest większy niż reszta, haha, będę pracować nad tym, aby go zdjąć: D
Spaceman
6

Python 2, 156 151 147 141 139 139

edycja 1: edytowane w celu użycia input () zamiast funkcji.

edycja 2: użyto str.join i dodano do var c, aby usunąć zbędne znaki.

edycja 3: usunięto niepotrzebne sekwencje specjalne ciągów znaków.

edycja 4: użyto ~ -n zamiast a = n-1

To była dobra zabawa w programowaniu, mój pierwszy golf w golfa!

n=input()
a='/\/ '*~-n
b='\ '+'\/\ '*~-n+'\\'
c='\n| '+a+'/\ |\n| \/ '+a+'|'
print'\n '.join(('  __'*n,'/  \\'*n+c,b+'/','/'+b+c,'\__/'*n))

zapisz go w zewnętrznym edytorze tekstu jako n.py, aby usunąć ostatni znak nowej linii, aby zmniejszyć rozmiar pliku o 1 bajt, uruchom moduł i wprowadź swój numer.

Micsthepick
źródło
Jeśli zezwolisz na wpisanie numeru bezpośrednio po instrukcji wykonania programu, to mogę go dalej usunąć do 151 bajtów
micsthepick
Zwykle input ()jest uważane za w porządku podczas czytania ze STDIN.
patrzqu
Widzę, że a=n-1oszczędziłeś na pisaniu *(n-1)dwa razy, ale robisz*~-n .
xnor
nadal ta sama liczba znaków w obu kierunkach, ponieważ używam tej wartości dwa razy, ale dobra wskazówka.
micsthepick
Możesz zapisać niektóre bajty, w jaki sposób Python obsługuje ukośniki odwrotne w ciągach, nie zawsze trzeba je kodować. Patrz stackoverflow.com/a/16973452/3351622
Matty
5

Python 2, 139 133 129 bajtów

n=input()
for i in range(9):w=' ?|'[i&2];s=' / /\/ /\_ /\ \/\__ \/\ \/_ \/ /\/ /'[i::9]*n;s=(s,' %s '%s[1:-1])[i%4>1];print w+s+w

Ten po prostu buduje i drukuje linia po linii.

Oto kod w postaci bez golfa:

n=int(input())
# The list with all the knot pieces
l= [' __ ',
    '/  \\',
    ' /\/',
    '/\/ ',
    '\ \/',
    '/\ \\',
    ' /\/',
    '/\/ ',
    '\__/']
# The first and last columns
w = '  ||  || '
# Loop for each row
for i in range(9):
    # Exception for the first and last character in the knot (in some rows)
    s = l[i]*n
    if i % 4 > 1:
        s = ' ' + s[1:-1] + ' '
    # Print the knot for this row
    print(w[i] + s + w[i])

Edycja: Zmieniłem język na Python 2, aby był zgodny z moją odpowiedzią dla # 3 (i oszczędza również 6 dodatkowych bajtów)

Matty
źródło
Wierzę w=(3*' ||')[i] -> w=' |'[i&2]i ' '+s[1:-1]+' ' -> ' %s '%s[1:-1]pracuję (pierwszy to ciąg z dwiema spacjami, a potem rura, ale SE działa w górę)
Sp3000
@ Sp3000 Thanks! Ten pierwszy jest całkiem sprytny. Powinienem był pomyśleć ' ||'[i%4], ale jest to jeszcze krótsze (także z dwoma spacjami).
Matty
3

C, 159 bajtów

j,k;f(n){char*t="7>771I;M6CMI93;IIB;;MI1M;M6CMI93;IIB;>MI";for(n*=4;t[j/2];++k,k%=n+3,j+=k-n?k%n<3||k%4-2?1:-3:3)putchar("\n _|/\\"[(t[j/2]-48)/(j%2?1:6)%6]);}

Z białymi znakami i kilkoma innymi ulepszeniami w zakresie czytelności:

#include <stdio.h>

int j, k;

void f(int n) {
    char *t = "7>771I;M6CMI93;IIB;;MI1M;M6CMI93;IIB;>MI", *m = "\n _|/\\";
    for (n *= 4; t[j / 2];
         ++k,
         k %= n + 3,
         j += k - n ? k % n < 3 || k % 4 - 2 ? 1 : -3 : 3)
        putchar(m[(t[j / 2] - 48) / (j % 2 ? 1 : 6 ) % 6]);
}

Jest to przede wszystkim oparte na szablonie. Szablon tzawiera wszystkie 9 możliwych kolumn wyniku, co oznacza, że ​​koduje 9 * 9 = 81 znaków lub 80 bez końcowego znaku nowej linii.

Ponieważ we wzorze jest tylko 6 różnych znaków (w tym znaki nowego wiersza), spakowałem je w jeden znak szablonu, co oznacza, że ​​szablon można zapisać w 40 znakach. Istnieje zatem 6 * 6 = 36 możliwych par znaków, które są kodowane jako znaki ASCII od 48 do 73. Tłumaczenie z powrotem na oryginalny znak jest podane w małej tabeli odnośników m.

Reszta logiki polega głównie na powtarzaniu czasów wzoru n, co oznacza przeskakiwanie o 4 znaki w szablonie, przy jednoczesnym prawidłowym wysyłaniu początkowej i końcowej części każdego wiersza.

Reto Koradi
źródło
2

PHP 5.5.3, 488 , 466

<?php 
function k($n){$r=array_fill(0,9,'');for($i=0;$i<$n;$i++){$r[0].=($i==0)?"  __ ":" __ ";$r[1].=($i==0)?" /  \\":"/  \\";$r[2].=($i==0)?"| /\\/":(($i==$n-1)?" /\\ |":" /\\/");$r[3].=($i==0)?"| \/ ":(($i==$n-1)?"/\/ |":"/\/ ");$r[4].=($i==0)?" \\ ":(($i==$n-1)?"\\/\\ \\/":"\\/\\ ");$r[5].=($i==0)?" /\\ ":(($i==$n-1)?"\\/\\ \\":"\\/\\ ");$r[6]=$r[2];$r[7]=$r[3];$r[8].=($i==0)? " \__/":"\__/";}foreach($r as $o){if(strlen($o)-2 !== 4*$n)$o.=" ";echo $o."\n";}}
Med
źródło
Możesz zapisać niektóre znaki, usuwając niepotrzebne białe znaki wokół operatorów, na przykład wokół =i .=.
ProgramFOX
Dzięki zredagowałem odpowiedź
Med
2

Prolog (SWI), 285 bajtów

a(N):-b(N,"  ||  || "," /  \\/  \\","_ /\\ \\/\\_","_ \\/\\ \\/_"," \\/ /\\/ /"," / /\\/ /\\"," \\  /\\  /"). b(N,[A|G],[B|H],[C|I],[D|J],[E|K],[F|L],[Y|Z]):-c(N,[Y,A],[E,F,C,D],T),writef([A,B,C,D|T]),nl,b(N,G,H,I,J,K,L,Z). c(1,L,_,L):-!. c(N,L,X,O):-M is N-1,c(M,L,X,T),append(X,T,O).

(Z białymi znakami):

a(N):-
    b(N,
    "  ||  || ", 
    " /  \\/  \\", 
    "_ /\\ \\/\\_", 
    "_ \\/\\ \\/_", 
    " \\/ /\\/ /", 
    " / /\\/ /\\", 
    " \\  /\\  /").

b(N,[A|G],[B|H],[C|I],[D|J],[E|K],[F|L],[Y|Z]):-
    c(N,[Y,A],[E,F,C,D],T),
    writef([A,B,C,D|T]),
    nl,
    b(N,G,H,I,J,K,L,Z).

c(1,L,_,L):-!.
c(N,L,X,O):-
    M is N - 1,
    c(M,L,X,T),
    append(X,T,O).

Próbowałem kilku sposobów rąbania strun, ale żaden nie wydawał się pokonać tej naiwnej metody kolumn.

Paul Butcher
źródło
2

JavaScript (ES6), 158 154 148 137 bajtów

n=>`    __
 /\\/ - \\/
 /\\/\\-__/`.replace(/-/g,` \\
| / /\\ |
|  /\\/ |
 \\/\\`).replace(/(..)(....)/g,(_,l,m)=>l+m.repeat(n).slice(2))

Edycja: Zapisano 11 bajtów dzięki @ Bálint.

Neil
źródło
@ Bálint Ale /(..)(.{4})/gma 13 bajtów, tyle samo co /(..)(....)/g...
Neil
@ Bálint Właściwie zdałem sobie sprawę, że moje poprzednie 4-bajtowe zapisywanie pozwoliło mi to zrobić, ale wtedy byłem z dala od komputera.
Neil
@ Bálint Nice! Spojrzałem na unikanie powtarzającego się segmentu \\ / \\, ale nie pomyślałem o sprawdzeniu pod kątem dłuższego powtarzania podciągów.
Neil
1

Java, 339 330 bajtów

class D{int n,i;public static void main(String[]a){new D(new Integer(a[0]));}D(int k){n=k;r("  __");p("\n ");r("/  \\");c();r("\\ \\/");p("\n ");r("/\\ \\");c();r("\\__/");}void c(){p("\n|");--n;r(" /\\/");p(" /\\ |\n| \\/");r(" /\\/");++n;p(" |\n ");}void p(String s){System.out.print(s);}void r(String s){for(i=n;i>0;--i)p(s);}}

Moje pierwsze rozwiązanie zawierało tak wiele „statycznych” słów kluczowych, że krótsze było uczynienie metod i atrybutów niestatycznymi i uruchomienie kodu w konstruktorze.

ECS
źródło
1

PowerShell, 228 207 181 133 bajtów

%{"  "+"__  "*$_;" "+"/  \"*$_;$b="|"+" /\/"*$_+"`b |";$b;$c="| "+"\/ /"*$_+"`b|";$c;" "+"\ \/"*$_;" "+"/\ \"*$_;$b;$c;" "+"\__/"*$_}

Przypomnienie - PowerShell nie czeka automatycznie na standardowe wejście. Musisz coś wpakować, np3|%{...}

Nacht - Przywróć Monikę
źródło
0

SmileBASIC, 149 bajtów

INPUT N?"  __"*N
A$="| / /\ |
B$="|  /\/ |
K" /\/  \
K A$K B$K" \/\ \/
K" /\/\ \
K A$K B$K" \/\__/
DEF K A?SUBST$(A,2,4,MID$(MID$(A,2,4)*N,2,N*9))END

Każdy łańcuch zawiera wzór AACCBBDD, który jest rozszerzony, tworząc część zastosowane n-krotnie, a następnie 2 pierwsze znaki są usunięte. (Usunięcie postaci od początku było krótsze niż od końca)AABB(CCBB)*DDCCBB

12Me21
źródło