Bangun tangga ASCII

28

Diberikan input dari dua bilangan bulat n dan m , output tangga ASCII panjang n dan ukuran m .

Ini adalah tangga ASCII dengan panjang 3 dan ukuran 3:

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

Ini adalah tangga ASCII dengan panjang 5 dan ukuran 1:

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

Ini adalah tangga ASCII dengan panjang 2 dan ukuran 5:

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

Untuk lebih spesifik:

  • Panjang ( n ) mewakili berapa banyak kotak tangga dibuat.

  • Ukuran ( m ) mewakili lebar dan tinggi interior — yaitu, tidak termasuk "batas" —masing-masing persegi.

  • Setiap bujur sangkar terdiri dari area interior yang diisi dengan ruang-ruang, dikelilingi oleh -s di atas dan bawah, |s di kiri dan kanan, dan +s di keempat sudut.

  • Perbatasan antara kotak bergabung bersama, jadi dua baris berturut-turut dengan +--...--+bergabung menjadi satu.

  • Sudut-sudut seluruh tangga diganti dengan karakter o.

  • Anda secara opsional dapat menampilkan baris tambahan.

Panjang tangga ( n ) akan selalu ≥ 2, dan ukuran ( m ) akan selalu ≥ 1.

Input dapat diambil sebagai string whitespace- / dipisahkan koma, array / daftar / dll, atau dua fungsi / baris perintah / dll. argumen. Argumen dapat diambil dalam urutan mana yang paling nyaman / golf.

Karena ini adalah , kode terpendek dalam byte akan menang.

Tip: Contoh di atas juga dapat digunakan sebagai kasus uji.

Gagang pintu
sumber
Apakah kita harus mengambil panjang pertama, lalu ukuran?
RK.
@RK. Anda dapat mengambilnya dalam urutan apa pun yang lebih nyaman.
Gagang Pintu
1
Bisakah ada baris baru terkemuka ?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... Aku akan pergi tanpa yang itu.
Gagang pintu
1
Oke: P Itu layak dicoba.
Conor O'Brien

Jawaban:

4

Pyth, 34 byte

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

Suite uji

Membawa argumen baris baru dipisahkan pada STDIN.

Menggunakan fungsi pembantu :,, yang membangun setiap jenis string vertikal dari tiga karakter, kemudian mereplikasi seperlunya, mentransposisi dan bergabung pada baris baru.

isaacg
sumber
11

Ruby, 71

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

ungolfed dalam program tes

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
sumber
Tampaknya ada masalah kecil dengan versi golf: perlu ;setelah h=0, butuh ruang setelah puts. Tapi skor Anda hanya tumbuh dengan 1 karakter karena ada ruang ekstra sebelumnya puts.
manatwork
@manatwork oops, terima kasih, sudah diperbaiki. Saya tidak tahu bagaimana itu terjadi, saya harus bermain golf dan tidak menjalankannya setelah itu.
Level River St
9

CJam, 43 42 byte

Saya tidak puas dengan skor. Tapi aku bukan Dennis, kan?

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

Input adalah 2 item yang dipisahkan ruang. Panjang dulu

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

Penjelasan

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
sumber
1
Saya suka Anda mengatakannya sebagai pertanyaan. "Aku bukan Dennis ... kan?"
undergroundmonorail
7

JavaScript (ES6), 89

... ulangi, ulangi, ulangi ...

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

Uji

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
sumber
Saya tidak tahu itu document.getElementById('elem').bisa digantikan oleh elem.! +1 untuk ini, tapi tolong, bisakah Anda menunjukkan beberapa dokumen tentang ini?
F. Hauri
2
@ F. Hauri bekerja di hampir setiap browser, tetapi harus dihindari (kecuali ketika coding untuk bersenang-senang). Info dan tautan stackoverflow.com/questions/3434278/…
edc65
6

C #, 1412 byte

... Upaya CodeGolf pertamaku, Tidak mungkin menang tetapi berhasil, jadi inilah dia:

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
sumber
9
Selamat Datang di Programming Puzzles & Code Golf! Anda memiliki banyak ruang kosong dalam kode yang dapat Anda hapus untuk mempersingkat kode Anda, jika Anda ingin lebih membantu golf kode Anda, Anda dapat melihat Tips untuk bermain golf di C # .
Downgoat
Saya setuju dengan @ Doᴡɴɢᴏᴀᴛ di sini. Saya sudah bisa berpotensi golf hanya 533 byte . Tapi itu bisa lebih baik. (Peringatan: Saya tidak memprogram dalam C #.)
user48538
Saya turun ke 314 denganusing 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
Kehilangan beberapa ruang jadi 310 denganusing 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
Turun ke 270 tanpa perubahan dalam pendekatan yang digunakan: 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','-');}}. Namun, ada kemungkinan lebih banyak potensi di sini, hanya dengan mengubah cara melakukan sesuatu sedikit.
Joey
6

Julia, 87 byte

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)

Ini adalah fungsi yang menerima dua bilangan bulat dan mengembalikan string.

Tidak Terkumpul:

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

pb - 147 byte

^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]

Ini adalah jenis tantangan yang, menurut hak, pb harus benar-benar bagus. Menggambar gambar sederhana dengan karakter adalah persis apa pb dirancang untuk. Sayangnya, itu hanya bahasa bertele-tele kurasa.

Mengambil panjang input terlebih dahulu, diikuti oleh ukuran. Mengambil input dalam bentuk nilai byte, misalnya:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Lihat, animasi yang menyenangkan!

Dengan komentar:

^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 '+')
monmon bawah tanah
sumber
5

Bash murni, 132 130 128 127 byte

Ya saya bisa menjatuhkan 1 byte lagi menggantikan yang terakhir ${p% *}, tapi saya lebih suka ini:

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

Mencicipi:

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
sumber
4

Haskell, 100 97 byte

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

Contoh penggunaan:

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

Bagaimana itu bekerja:

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]

Sunting: @Christian Irwan ditemukan 3 byte. Terima kasih!

nimi
sumber
Pencocokan pola untuk skor -1 m=init$[1..l]>>("|"!" "<$u)++["+"!"-"]=>(_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
Akangka
Anehnya _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)bekerja
Akangka
@ChristianIrwan: terlihat jelas! Terima kasih!
nimi
3

brainfuck - 334 byte

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

Saya berharap ini jauh lebih pendek.

Ini mengatur "string" yang terlihat | (...) |dan satu yang terlihat seperti +----(...)----+, mencetak masing-masing sesuai kebutuhan, dengan beberapa casing khusus untuk huruf os di bagian atas dan bawah.

Membutuhkan juru bahasa yang menggunakan sel 8-bit dan memungkinkan Anda untuk pergi kiri dari sel 0 (baik itu ke dalam sel negatif atau perulangan). Dalam pengalaman saya, ini adalah pengaturan default yang paling umum.

Dengan komentar:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] 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
monmon bawah tanah
sumber
3

PowerShell, 77 80

param($l,$s)$a='-'*$s
($c="o$a`o")
(($b=,"|$(' '*$s)|"*$s)+"+$a+")*--$l
$b
$c
Joey
sumber
77 byte
Veskah
2

Jolf, 36 byte

Coba di sini!

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

Penjelasan

ρ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
sumber
2

Perl, 98 byte

($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
sumber
1
Jawaban pertama yang sangat bagus. Tapi saya tidak melihat +tanda - tanda dalam kode Anda, apakah Anda menganggap bahwa anak tangga antara memiliki +tanda - tanda di setiap akhir?
Level River St
Terima kasih atas komentar dengan kata-kata yang sangat bagus - Saya benar-benar memberi jarak pada tanda plus! Menghabiskan sedikit ruang untuk saya juga; masih memikirkan bagaimana saya dapat mempersingkat ... selain menghilangkan ($n,$m)=@ARGV;dan dengan asumsi mereka sudah ditetapkan - tidak yakin apakah itu semangat atau tidak. Saya harus mencarinya.
ZILjr
Kecuali ditentukan lain dalam pertanyaan, aturannya ada di sini meta.codegolf.stackexchange.com/a/2422/15599 . Anda tidak bisa hanya berasumsi bahwa variabel sudah diset, tetapi Anda bisa menulis fungsi alih-alih program, jika itu membantu. Saya tidak melakukan Perl tetapi saya menganggap itu mungkin menyelamatkan Anda @ARGV. Juga, ketika membalas seseorang, ingatlah untuk memasukkan @namapengguna agar mereka mendapatkan peringatan. Saya tidak perlu melakukannya karena ini adalah posting Anda.
Level River St
1

C, 122 byte

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

Cobalah online .

grc
sumber
1

Tcl, 187 byte

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}

Kode ini dibuat untuk dimasukkan ke dalam file dengan input argumen pada baris perintah. berikan jumlah kotak dan lebar dalam urutan itu.

Cjolly
sumber
1

PHP, 81 byte

Mengharapkan 2 argumen, diteruskan saat memanggil perintah PHP secara langsung. Yang pertama adalah ukuran dan yang kedua adalah jumlah langkah.

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

Mungkin memerlukan beberapa perbaikan.

Ismael Miguel
sumber
0

Python 2, 94 byte

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)

'Tidak Disatukan':

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
sumber
0

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

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

Cobalah online!

Xcali
sumber
0

Pip -l , 35 byte

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

Cobalah online!

Penjelasan

(^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

Beberapa versi lain

Saya mencoba banyak pendekatan berbeda mencoba menangkap Pyth ...

[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

Saya sangat menyukai t**byang, yang menggunakan matematika untuk menghasilkan pola vertikal tangga:

        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

The 1000200020001kemudian dapat digunakan untuk menghasilkan pola o|||+|||+|||odan - - - -, yang membentuk tangga. Sayangnya, saya tidak bisa membuat pendekatan ini lebih pendek dari pendekatan join / wrap.

DLosc
sumber