Buduj drabiny ASCII

28

Biorąc pod uwagę wejście dwóch liczb całkowitych n i m , wyprowadza drabinkę ASCII o długości n i rozmiarze m .

To jest drabina ASCII o długości 3 i rozmiarze 3:

o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

To jest drabina ASCII o długości 5 i rozmiarze 1:

o-o
| |
+-+
| |
+-+
| |
+-+
| |
+-+
| |
o-o

To jest drabina ASCII o długości 2 i rozmiarze 5:

o-----o
|     |
|     |
|     |
|     |
|     |
+-----+
|     |
|     |
|     |
|     |
|     |
o-----o

Aby być konkretnym:

  • Długość ( n ) reprezentuje liczbę kwadratów, z których składa się drabina.

  • Rozmiar ( m ) reprezentuje szerokość i wysokość wnętrza - to znaczy nie licząc „granic” - każdego kwadratu.

  • Każdy kwadrat składa się z wewnętrznej przestrzeni wypełnionej spacjami, otoczonej przez -s na górze i na dole, |s po lewej i prawej stronie oraz +s we wszystkich czterech rogach.

  • Granice między kwadratami łączą się ze sobą, więc dwie linie z rzędu +--...--+łączą się w jeden.

  • Narożniki całej drabiny zastępuje się postacią o.

  • Opcjonalnie możesz wypisać końcowy znak nowej linii.

Długość drabiny ( n ) zawsze będzie ≥ 2, a rozmiar ( m ) zawsze będzie ≥ 1.

Dane wejściowe mogą być traktowane jako ciąg oddzielony spacjami / przecinkami, tablica / lista / itp. Lub dwie funkcje / linia poleceń / itp. argumenty. Argumenty można przyjmować w dowolnej kolejności, która jest najwygodniejsza / najbardziej golfowa.

Ponieważ jest to , wygrywa najkrótszy kod w bajtach.

Wskazówka: powyższe przykłady można również wykorzystać jako przypadki testowe.

Klamka
źródło
Czy najpierw musimy wziąć długość, a potem rozmiar?
RK.
@RK. Możesz je zabrać w dowolnej kolejności, która jest wygodniejsza.
Klamka
1
Czy może być wiodąca nowa linia?
Conor O'Brien,
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... Idę z tym nie.
Klamka
1
Dobra: P Warto było spróbować.
Conor O'Brien

Odpowiedzi:

4

Pyth, 34 bajty

.NjjNm*QTvz*2YjC:M++J"+|o"m"- -"QJ

Zestaw testowy

Przyjmuje argumenty nowej linii rozdzielone na STDIN.

Korzysta z funkcji pomocnika :, która buduje każdy typ łańcucha pionowego z trzech znaków, a następnie replikuje w razie potrzeby, transponuje i łączy na nowej linii.

isaacg
źródło
11

Ruby, 71

->m,n{h=0;(?o+?+*(n-1)+?o).chars{|c|puts [?|+' '*m+?|]*h,c+?-*m+c;h=m}}

nie wziął udziału w programie testowym

f=->m,n{
  h=0                             #The number of | above the 1st rung is 0
  (?o+?+*(n-1)+?o).chars{|c|      #Make a string of all the rung ends o++...++o and iterate through it
    puts [?|+' '*m+?|]*h,         #draw h vertical segments |  ...  |
      c+?-*m+c                    #and a rung with the correct ends
    h=m                           #The number of | above all rungs except the 1st is m
  }
}


f[gets.to_i,gets.to_i]
Level River St
źródło
Wydaje się, że istnieją niewielkie problemy z wersją golfową: potrzeba ;po h=0, potrzeba miejsca po puts. Ale wynik rośnie tylko z 1 postacią, ponieważ wcześniej było dodatkowe miejsce puts.
manatwork
@manatwork ups, dzięki, naprawiono. Nie wiem, jak to się stało, musiałem grać w golfa i nie prowadzić go później.
Level River St
9

CJam, 43 42 bajty

Wynik mnie nie przeraża. Ale ja nie jestem Dennis, prawda?

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$

Dane wejściowe to 2 elementy oddzielone spacjami. Najpierw długość

2 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Wyjaśnienie

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$
q~                                         e# read input
  :Z;                                      e# Record the size in Z and discard
     '-'o{[\Z*1$N]}:X~                     e# Create the initial line (and final). also creates a shorcut to do this later
           \                               e# Capture two arguments
            Z*                             e# The separator is repeated size times
              1$                           e# Repeat the first argument
                N                          e# Add newline
                                           e# X is a function to create line in a ladder
                      ['-_'+X\'|XZ*]       e# Design the repeating part
                                    @*     e# Repeat the pattern n times
                                      1>   e# Discard the initial
                                        1$ e# Since the final line is same than the initial, we just write it.
                                           e# Implicit printing
Akangka
źródło
1
Podoba mi się, że sformułowałeś to jako pytanie. „Nie jestem Dennis… prawda?”
undergroundmonorail
7

JavaScript (ES6), 89

... powtórz, powtórz, powtórz ...

(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

Test

F=(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

// Less golfed
U=(n,m)=>
{
  var R=x=>x.repeat(m),
      a=R(' '),
      b=R(`|${a}|\n`);
      c=R('-'),
      d=`o${c}o\n`;
  m=n-1;
  return d+R(b+`+${c}+\n`)+b+d
}

function test() {
  var i=I.value.match(/\d+/g)
  if (i) O.textContent=F(+i[0],+i[1])
  console.log(i,I.value)
}  
 
test()
N,M: <input id=I value="3,5" oninput=test()>
<pre id=O></pre>

edc65
źródło
Nie wiedziałem, że document.getElementById('elem').można to zastąpić elem.! +1 za to, ale czy mógłbyś wskazać jakieś dokumenty na ten temat?
F. Hauri,
2
@ F.Hauri działa w prawie każdej przeglądarce, ale należy tego unikać (z wyjątkiem kodowania dla zabawy). Informacje i linki stackoverflow.com/questions/3434278/…
edc65 10.01.2016
6

C #, 1412 bajtów

... Moja pierwsza próba CodeGolf, raczej nie wygra, ale działa, więc zaczynamy:

using System;

namespace Ascii_Ladders
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 0;
            int m = 0;

            Console.Write("Please enter Height: ");
            n = int.Parse(Console.ReadLine());
            Console.Write("Please Enter Width: ");
            m = int.Parse(Console.ReadLine());

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                Console.Write("-");
            }
            Console.WriteLine("o");

            for (int k = 0; k < n; k++)
            {
                for (int i = 0; i < m; i++)
                {
                    Console.Write("|");
                    for (int j = 0; j < m; j++)
                    {
                        Console.Write(" ");
                    }
                    Console.WriteLine("|");
                }
                if (k != n - 1)
                {
                    Console.Write("+");
                    for (int i = 0; i < m; i++)
                    {
                        Console.Write("-");
                    }
                    Console.WriteLine("+");
                }
            }

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                 Console.Write("-");
            }
            Console.WriteLine("o");

            Console.ReadKey();
        }
    }
}
Reed Jones
źródło
9
Witamy w Programowaniu Puzzle i Code Golf! W kodzie jest wiele białych znaków, które można usunąć, aby skrócić kod. Jeśli chcesz uzyskać więcej pomocy w grze w kod, możesz sprawdzić Wskazówki dotyczące gry w golfa w języku C # .
Downgoat,
Zgadzam się z @ Doᴡɴɢᴏᴀᴛ tutaj. Potrafiłem potencjalnie zagrać w golfa do zaledwie 533 bajtów . Ale może być lepiej. (Ostrzeżenie: nie programuję w języku C #.)
user48538,
Zmniejszyłem ją do 314 zusing System;class P{static int m;static void Main(){int n = int.Parse(Console.ReadLine());m = int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser
3
Brakowało kilku spacji, więc 310 zusing System;class P{static int m;static void Main(){int n=int.Parse(Console.ReadLine());m=int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser
2
W dół do 270 bez zmian w podejściu stosowane: using C=System.Console;class P{static void Main(){int i,k,n=int.Parse(C.ReadLine()),m=int.Parse(C.ReadLine());System.Action<char,char> M=(x,y)=>C.WriteLine(x+new string(y,m)+x);M('o','-');for(k=0;k<n;k++){for(i=0;i<m;i++){M('|',' ');}if(k<n-1){M('+','-');}}M('o','-');}}. Jednak najprawdopodobniej jest tutaj większy potencjał, po prostu poprzez zmianę sposobu robienia rzeczy.
Joey,
6

Julia, 87 bajtów

f(n,m)=(g(x)=(b=x[1:1])x[2:2]^m*b*"\n";(t=g("o-"))join([g("| ")^m for i=1:n],g("+-"))t)

Jest to funkcja, która akceptuje dwie liczby całkowite i zwraca ciąg znaków.

Nie golfowany:

function f(n::Int, m::Int)
    # Create a function g that takes a string of two characters and
    # constructs a line consisting of the first character, m of the
    # second, and the first again, followed by a newline.
    g(x) = (b = x[1:1]) * x[2:2]^m * b * "\n"

    # Assign t to be the top and bottom lines. Construct an array
    # of length n where each element is a string containing the
    # length-m segment of the interior. Join the array with the
    # ladder rung line. Concatenate all of this and return.
    return (t = g("o-")) * join([g("| ")^m for i = 1:n], g("+-")) * t
end
Alex A.
źródło
5

pb - 147 bajtów

^t[B]>>[B]vw[T!0]{b[43]<[X]b[43]>w[B=0]{b[45]>}v[X-1]w[B=0]{b[124]^}v[X]t[T-1]}t[111]b[T]<w[X!0]{b[45]<}b[T]w[Y!0]{w[B!0]{^}b[124]^}b[T]^>>[B]vb[T]

Jest to rodzaj wyzwania, w którym zgodnie z prawami pb powinien być naprawdę dobry. Rysowanie prostych zdjęć za pomocą znaków jest dokładnie tym, do czego zaprojektowano pb. Niestety, to chyba tylko kiepski język.

Najpierw pobiera długość wejściową, a następnie rozmiar. Pobiera dane wejściowe w postaci wartości bajtów, na przykład:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Spójrz, zabawna animacja!

Z komentarzami:

^t[B]            # Save length to T
>>[B]v           # Go to X=size+1, Y=0

w[T!0]{          # While T is not 0:
    b[43]            # Write a '+'
    <[X]b[43]        # Write a '+' on the left side as well
    >w[B=0]{b[45]>}  # Travel back to the right '+', writing '-' on the way
    v[X-1]           # Go down by X-1 (== size)
    w[B=0]{b[124]^}  # Travel back up to the '+', writing '|' on the way
    v[X]             # Go down by X (== size + 1, location of next '+')
    t[T-1]           # Decerement T
}

t[111]           # Save 'o' to T (it's used 4 times so putting it
                 # in a variable saves bytes)

b[T]             # Write an 'o' (bottom right)

<w[X!0]{         # While not on X=0:
    b[45]<           # Travel left, writing '-' on the way
}

b[T]             # Write an 'o' (bottom left)

w[Y!0]{          # While not on Y=0:
    w[B!0]{^}        # Skip nonempty spaces
    b[124]           # Write a '|'
    ^                # Travel up
}

b[T]             # Write an 'o' (top left, replaces existing '+')

^>>[B]v          # Go back to where the size is saved and go to X=size+1, Y=0

b[T]             # Write an 'o' (top right, replaces existing '+')
podziemny monorail
źródło
5

Pure Bash, 132 130 128 127 bajtów

Tak, mogę upuścić jeszcze 1 bajt, zastępując ostatni ${p% *}, ale wolę to:

p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"

Próba:

ladders() {
    p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
    a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"
}

ladders 3 4
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

ladders 2 1
o--o
|  |
|  |
o--o
F. Hauri
źródło
4

Haskell, 100 97 bajtów

l#s=unlines$t:m++[t]where _:m=[1..l]>>["+"!"-"]++("|"!" "<$u);t="o"!"-";o!i=o++(u>>i)++o;u=[1..s]

Przykład użycia:

*Main> putStr $ 4 # 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Jak to działa:

l#s=unlines$t:m++[t]         -- concat top line, middle part and end line
                             -- with newlines between every line
  where                      -- where
  _:m=                       -- the middle part is all but the first line of
     [1..l]>>                -- l times
         ["+"!"-"]           --    a plus-dashes-plus line
         ++("|"!" "<$u)      --    followed by s times a bar-spaces-bar line

  t="o"!"-"                  -- very first and last line
  o!i=o++(u>>i)++o           -- helper to build a line
  u=[1..s]

Edycja: @Christian Irwan znalazł 3 bajty. Dzięki!

nimi
źródło
m=init$[1..l]>>("|"!" "<$u)++["+"!"-"](_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
Dopasowywanie wzorów
Zaskakująco _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)działa
Akangka
@ChristianIrwan: dobrze zauważony! Dzięki!
nimi
3

brainfuck - 334 bajty

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-]<----[>---<----]--[>[+>>]<<[<<]>++++++]>[+.>>]-[<+>---]<+++++++>>--[<+>++++++]->---[<------->+]++++++++++[<++<]+++++[>[++++++>>]<<[<<]>-]>[-]>.-<<----[>>+++<<----]--[>+<--]>---<<<<++++++++++.,[>[>+>+<<-]>[<+>-]>[<<<<[>>>>>>[.>>]<<[<<]>>-]>>>>>[.>>]<<[<<]>-]<<<<+>-]>>>>[-]----[>---<----]>+.[>]<<<<<[.<<]

Spodziewałem się, że będzie to o wiele krótsze.

To ustawia „ciąg”, który wygląda | (...) |i taki, który wygląda +----(...)----+, drukując każdy w razie potrzeby, ze specjalną obudową dla os na górze i na dole.

Wymaga interpretera, który wykorzystuje komórki 8-bitowe i pozwala przejść w lewo od komórki 0 (czy to do komórek ujemnych, czy do zapętlenia). Z mojego doświadczenia wynika, że ​​są to najczęściej używane ustawienia domyślne.

Z komentarzami:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] Get m from input; make a copy
                      Turn it into m cells containing 1 with empty cells between

<----[>---<----]      Put 67 at the beginning (again with an empty cell between)

--[>[+>>]<<[<<]>++++++]  Add 43 to every nonempty cell

>[+.>>]               Add 1 to each cell and print it

-[<+>---]<+++++++    Put 92 after the last 45 (no empty cell!)

>>--[<+>++++++]      Put 43 immediately after the 92

->---[<------->+]    Put 234 after 43

++++++++++           And 10 after that

[<++<]             Add two to the 234; 92; the empty spaces; and left of the 111

+++++[>[++++++>>]<<[<<]>-] Add 30 to each 2; the 94; and the 236

>[-]>.-<<----[>>+++<<----] Erase leftmost 32; Print 111; subtract 68 from it

--[>+<--]>---        Put 124 where the 32 was

<<<<++++++++++.,     Print a newline; override the cell with n from input

[                    n times:

  >[>+>+<<-]>[<+>-]    Make a copy of m

  >[                   m times:

    <<<<                 Look for a flag at a specific cell

    [                    If it's there:

      >>>>>>[.>>]          Go to the 43; print it and every second cell after

      <<[<<]>>-            Clear the flag

    ]

    >>>>>[.>>]           Go to the 124; print it and every second cell after

    <<[<<]>              Go back to the copy of m

  -]

  <<<<+>               Plant the flag

-]

>>>>

[-]----[>---<----]>+ Erase the 124; add 68 to 43

.[>]                 Print it; then head to the end

<<<<<[.<<] Go to the last 45; print it; then print every second cell to the left
podziemny monorail
źródło
3

PowerShell, 77 80

param($l,$s)$a='-'*$s
($c="o$a`o")
(($b=,"|$(' '*$s)|"*$s)+"+$a+")*--$l
$b
$c
Joey
źródło
77 bajtów
Veskah
2

Jolf, 36 bajtów

Wypróbuj tutaj!

ρpi,a+2J+2J"o-| "j"o(.+)o
o.+o'+$1+

Wyjaśnienie

ρpi,a+2J+2J"o-| "j"o(.+)o\no.+o'+$1+
 pi              j                   repeat vertically j times
   ,a+2J+2J"o-| "                    a box with dimensions 2+J
ρ                 "o(.+)p\np.+o'     replace with regex
                                +$1+ with the -...-
Conor O'Brien
źródło
2

Perl, 98 bajtów

($n,$m)=@ARGV;print$h="o"."-"x$m."o\n",((("|".(" "x$m)."|\n")x$m.$h)x$n)=~s{o(-+)o(?=\n.)}{+$1+}gr
ZILjr
źródło
1
Doskonała pierwsza odpowiedź. Ale nie widzę żadnych +znaków w twoim kodzie, czy bierzesz pod uwagę, że szczeble pośrednie mają +znaki na każdym końcu?
Level River St
Dziękuję za bardzo ładnie sformułowany komentarz - całkowicie rozłożyłem znaki plus! Kosztowało mnie też sporo miejsca; wciąż myślę o tym, jak mogę to skrócić ... poza pominięciem ($n,$m)=@ARGV;i zakładając, że są już ustawione - nie jestem pewien, czy jest to zgodne z duchem. Będę musiał to sprawdzić.
ZILjr
O ile w pytaniu nie określono inaczej, reguła jest tutaj meta.codegolf.stackexchange.com/a/2422/15599 . Nie możesz po prostu założyć, że zmienne są ustawione, ale możesz napisać funkcję zamiast programu, jeśli to pomoże. Nie robię Perla, ale zakładam, że może cię to uratować @ARGV. Ponadto, odpowiadając komuś, pamiętaj o dołączeniu @nazwa_użytkownika, aby otrzymać alert. Nie muszę tego robić, ponieważ to jest twój post.
Level River St
1

C, 122 bajty

f(int m,int n,char*s){int i=0,w=3+m++;for(;i<w*m*n+w;++i)*s++=i%w>m?10:" |-+-o"[!(i/w%m)*2+!(i%w%m)+!(i/w%(m*n))*2];*s=0;}

Wypróbuj online .

grc
źródło
1

Tcl, 187 bajtów

lassign $argv n w
set c 0
while { $c < [expr {($w * $n) + ($n + 2)}]} {if {[expr {$c % ($n + 1)}] == 0} {puts "o[string repeat "-" $w ]o"} else {puts "|[string repeat " " $w ]|"}
incr c}

Ten kod jest przeznaczony do umieszczenia w pliku z argumentami wprowadzonymi w wierszu poleceń. podaj liczbę skrzynek i szerokość w tej kolejności.

Cjolly
źródło
1

PHP, 81 bajtów

Oczekuje 2 argumentów przekazanych przy bezpośrednim wywołaniu polecenia PHP. Pierwszy to rozmiar, a drugi to liczba kroków.

$R=str_repeat;echo$P="o{$R('-',$W=$argv[1])}o
",$R("|{$R(' ',$W)}|
$P",$argv[2]);

Może wymagać pewnych ulepszeń.

Ismael Miguel
źródło
0

Python 2, 94 bajty

def F(n,m):a,b,c,d='o|+-';r=[a+d*m+a]+([b+' '*m+b]*m+[c+d*m+c])*n;r[-1]=r[0];print'\n'.join(r)

„Niegolfowany”:

def F(n,m):
 # 'o---o'
 r = ['o'+'-'*m+'o']
 # ('|   |'*m+'+---+') n times
 r += (['|'+' '*m+'|']*m+['+'+'-'*m+'+'])*n
 # replace last +---+ with o---o
 r[-1] = r[0]
 print '\n'.join(r)
TFeld
źródło
0

Perl 5 , 91 + 1 (-a) = 92 bajty

$_='|'.$"x$F[1].'|';push@a,y/| /+-/r,($_)x$F[1]while$F[0]--;$a[0]=y/| /o-/r;say for@a,$a[0]

Wypróbuj online!

Xcali
źródło
0

Pip -l , 35 bajtów

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o

Wypróbuj online!

Wyjaśnienie

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o
                                     a is length, b is size, s is space (implicit)
   sXb                               String containing b spaces
      RLa                            List containing a copies of that string
         JW'-                        Join on "-" and wrap the result in "-" as well
  Y                                  Necessary for operator precedence reasons
 ^                                   Split into a list of characters
(            )Xb                     String-repeat each character in the list b times
                                     This list represents the central columns of the ladder

                    '|Xb             String containing b pipe characters
                        RLa          List containing a copies of that string
                           J'+       Join on "+"
                   (          )WR'o  Wrap in "o"
                  ^                  Split into a list of characters
                                     This list represents the outer columns of the ladder

                WR                   Wrap the left list in the right list, vectorizing

Niektóre inne wersje

Próbowałem wielu różnych podejść, próbując złapać Pytha ...

[Y'-XbWR'o;@>(sXbWR'|RLbPE'-XbWR'+RL:a)y]  41
Y^(t**b.1*:t**bX--a.1)" --"@yXbWR"|o+"@y   40
Y'|XbRLaJ'+YyWR'o;Z:sXbRLaJW'-RLbPEyAEy    39
t**:b(" |-o-+"<>2)@_@^t.1M$*Y[ttXa-1].1    39
J*Z:sXbRLaJW'-RLbWR:^('|XbRLaJ'+)WR'o      37
Y^$*Y[t**:btXa-1].1" --"@yXbWR"|o+"@y      37

Szczególnie lubię t**bte, które wykorzystują matematykę do generowania pionowego wzoru drabiny:

        b           Size; e.g. 3
    t               Preset variable for 10
     **:            Set t to t**b (e.g. 1000)
           a        Length; e.g. 3
            -1      2
         tX         String-repeat (the new value of) t 2 times: 10001000
   [          ]     Put t and the above into a list: [1000; 10001000]
               .1   Append 1 to both of them: [10001; 100010001]
$*(              )  Fold on multiplication: 1000200020001

1000200020001Może być następnie wykorzystany do generowania wzorów o|||+|||+|||oi - - - -, które składają się na drabinie. Niestety nie udało mi się, aby to podejście było krótsze niż podejście do łączenia / zawijania.

DLosc
źródło