Paragraf berritsleting

21

(Terinspirasi oleh tantangan ini )

Diberikan dua string input, satu di antaranya persis satu karakter lebih panjang dari yang lain, mengatur string ke dalam seni ASCII seolah-olah mereka adalah dua bagian ritsleting yang hanya setengah ritsleting. Kata yang lebih panjang membentuk bagian bawah ritsleting, dan merupakan karakter pertama dan terakhir dari bagian ritsleting gabungan. Karena paragraf itu sulit dimengerti, lihat beberapa contoh:

zippered
paragraph

 z
   i
     p
       p
        gerraepdh
      a
    r
  a
p

Perhatikan bagaimana paragraph(kata yang lebih panjang) membentuk ritsleting bagian bawah, dan g r a p hbagian merangkum e r e dbagian dari zippered, dan bagian z i p pdan p a r abagian diimbangi satu sama lain.

Memasukkan

  • Dua string ASCII dalam format apa pun yang nyaman , dengan satu dijamin panjangnya lebih panjang dan yang lainnya tepat satu karakter lebih panjang.
  • Tidak ada string yang berisi spasi, tetapi mungkin mengandung nilai ASCII yang dapat dicetak lainnya.
  • Anda dapat mengambil input dalam urutan apa pun. Silakan sebutkan dalam kiriman Anda, pesanan input.

Keluaran

Representasi seni ASCII yang dihasilkan dari kata-kata ritsleting, seperti yang dijelaskan di atas, sekali lagi dalam format apa pun yang nyaman.

Aturan

  • Leading atau trailing newlines atau whitespace semuanya opsional, asalkan karakter itu sendiri berbaris dengan benar.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

ppcg
tests

 p
   p
    sctgs
  e
t

string
strings

 s
   t
     r
      iinnggs
    r
  t
s
AdmBorkBork
sumber
Bolehkah kita menganggap input tidak mengandung spasi putih?
DJMcMayhem
@DJMcMayhem Ya, itu asumsi yang adil.
AdmBorkBork
1
@Titus one guaranteed to be even in length and the other exactly one character longer. String yang lebih pendek selalu genap
Baldrickk

Jawaban:

7

Japt , 31 28 byte

N®¬£ç iXYm½*Ul
uUo mw
y c ·y

Uji secara online! Mengambil string yang lebih pendek terlebih dahulu.

Penjelasan

N®¬£ç iXYm½*Ul    First line: Set U to the result.
N®                Map each item (there's exactly 2 of them) in the input to
  ¬                 the item split into chars,
   £                with each item X and index Y mapped to
    ç                 the first input filled with spaces,
      iX              with X inserted at index
        Ym½*Ul          min(Y, 0.5 * U.length).
                  At the end each input is an array like
                  ["p    ", " p   ", "  c  ", "  g  "]
                  ["t    ", " e   ", "  s  ", "  t  ", "  s  "]

uUo mw    Second line: Set V to the result (though that's not important).
 Uo       Pop the last item (the array representing the second string) from U.
    m     Map each item by
     w      reversing.
u         Push the result to the beginning of U.
          At the end we have e.g.
          ["    t", "   e ", "  s  ", "  t  ", "  s  "]
          ["p    ", " p   ", "  c  ", "  g  "]

y c ·y    Last line: Output the result of this line.
y         Transpose: map [[A,B,C,...],[a,b,c,...]] to [[A,a],[B,b],[C,c],...].
  c       Flatten into one array. [A,a,B,b,C,c,...]
    ·     Join on newlines. Now we have the output transposed.
     y    Transpose rows with columns.
Produksi ETH
sumber
6

Arang , 33 31 byte

→F²«FL諧θκ→¿‹κ÷Lθ²¿ι↑↓»J⁰LθAηθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil string yang lebih pendek terlebih dahulu. Sunting: Disimpan 2 byte dengan mengubah deteksi titik tengah. Penjelasan:

→F²«

Ulangi setiap string secara bergantian.

FLθ«

Ulangi setiap karakter string secara bergantian.

§θκ→

Cetak karakter dan pindahkan kotak ekstra ke kanan.

¿‹κ÷Lθ²¿ι↑↓»

Untuk bagian pertama dari string, gerakkan juga kursor ke bawah atau ke atas sesuai kebutuhan.

J⁰LθAηθ

Setelah mencetak string pertama, lompat ke titik awal string kedua, dan ganti string pertama dengan yang kedua, sehingga tercetak untuk loop kedua. (Kode ini berjalan di kedua loop, tetapi yang kedua kali adalah no-op.)

Neil
sumber
4

Pyth , 35 byte

AQj.t.e+*d+lG*<klH*^_1k/h-lGk2b.iHG

Cobalah online!

Biarawati Bocor
sumber
1
Itu cepat cepat!
AdmBorkBork
@ AdmBorkBork Anda dapat mengharapkan itu terjadi beberapa kali, terutama dari penjawab ini.
Erik the Outgolfer
4

Jelly ,  27  26 byte

-1 byte terima kasih kepada Erik the Outgolfer (gunakan repeat ¡,, untuk mengganti if ?,, dan klausa lain yang dilewati ¹)

JCḂ¡€ṚH
żµL⁶ẋ;ЀFṙ"ÇZṙÇṀ$Y

Program lengkap yang mencetak hasilnya dengan spasi putih, sebagaimana diizinkan dalam pertanyaan (atau tautan diad mengembalikan daftar karakter).

Cobalah online!

Bagaimana?

JCḂ¡€ṚH - Link 1, get rotations: list p        e.g.: ["a1","b2","c3","d4","e5","f6","g"]
J       - range of length of p                       [ 1, 2, 3, 4, 5, 6, 7]
    €   - for €ach:
   ¡    -   repeat link:
  Ḃ     - ...# of times: modulo 2                      1  0  1  0  1  0  1
 C      - ...link: complement (1-x)                    0  2 -2  4 -4  6 -6
     Ṛ  - reverse                                    [-6, 6,-4, 4,-2, 2, 0]
      H - halve                                      [-3, 3,-2, 2,-1, 1, 0]

żµL⁶ẋ;ЀFṙ"ÇZṙÇṀ$Y - Main link: longer (odd length); shorter (even length)
                   -                           e.g.: "abcdefg", "123456"
ż                  - zip them together               ["a1","b2","c3","d4","e5","f6","g"]
 µ                 - monadic chain separation, call that p
  L                - length of p                     7
   ⁶               - literal space character         ' '
    ẋ              - repeat                          "       "
        F          - flatten p                       "a1b2c3d4e5f"
      Ѐ           - map with:
     ;             -   concatenation                 ["       a","       1","       b","       2","       c","       3","       d","       4","       e","       5","       f","       6","       g"]
           Ç       - call last link (1) as a monad with argument p
          "        - zip with (no action on left by trailing values of right):
         ṙ         -   rotate left by                ["  a     ","    1   "," b      ","     2  ","c       ","      3 ","       d","       4","       e","       5","       f","       6","       g"]
            Z      - transpose                       ["    c        ","  b          ","a            ","             "," 1           ","   2         ","     3       ","      d4e5f6g"]
                $  - last two links as a monad:
              Ç    -   call last link (1) as a monad with argument p
               Ṁ   -   maximum                       3
             ṙ     - rotate left by                  ["             "," 1           ","   2         ","     3       ","      d4e5f6g","    c        ","  b          ","a            "]
                 Y - join with newlines            '''             \n
                                                       1           \n
                                                         2         \n
                                                           3       \n
                                                            d4e5f6g\n
                                                          c        \n
                                                        b          \n
                                                      a            '''
                   - as full program: implicit print
Jonathan Allan
sumber
C¹Ḃ?->CḂ¡
Erik the Outgolfer
3

Python 2 , 128 119 byte

f=lambda a,b,n=0:n/2<len(a)and' '*-~n+a[0]+'\n'+f(a[1:],b[1:],n+2)+'\n'+' '*n+b[0]or' '*n+''.join(sum(zip(b,a+' '),()))

Cobalah online!

tongkat
sumber
3

V , 47 38 30 27 26 25 byte

Akhirnya kalahkan jawaban Jelly saat ini \ o /

Mengambil input dengan kata yang lebih panjang di atas

Penjelasan datang, jangan berpikir ada banyak lagi untuk golf.

òGxplòxãòd|>HÏpd|>GGÏphl

Cobalah online!

Penjelasan

ò     ò      ' <M-r>ecursively
             |abc
             def
 Gx          ' (G)oto the last line and (x) the first character
             abc
             |ef
            ' <C-O> Go back to the previous location
             |abc
             ef
    p        ' (p)aste the character cut
             a|dbc
             ef
     l       ' move one character right
             ad|bc
             ef

x                  ' (x) the last extraneous character from the previous loop
 ã                 ' <M-c>enter the cursor
  ò                ' <M-r>ecursively
   d|              ' (d)elete to the first co(|)umn
     >H            ' (>) Indent every line from here to (H)ome (first line)
                   ' this leaves the cursor on the first line
       Ïp          ' <M-O>n a newline above this (the first) (p)aste the deleted section
                   ' this leaves the cursor on the last character
         d|        ' (d)elete to the first co(|)umn
           >G      ' (>) Indent every line from here to the end (G)
                   ' unfortunately the cursor stays on the first line
             G     ' (G)oto the last line
              Ïp   ' <M-O>n a newline above this (the last) (p)aste the deleted section
                hl ' move left and then right (break the loop at the end)
nmjcman101
sumber
2

V , 79 byte

ãl}dÍ./ &
XòYf D"0Pr -Y;D"0pr +òGï"1pÓ./&ò
}dGÓ/&ò
{jpògJòÓó
|DÇ./d
MÙ"-pBr 

Cobalah online!

Berikut ini harus dibaca dengan banyak sarkasme dan tanda kutip .

Inilah jawaban dalam bahasa golf saya yang bagus untuk jawaban singkat untuk tantangan berbasis string dan ASCII-art .

Mengapa saya terus melakukan ini pada diri saya sendiri?

Hexdump:

00000000: e36c 167d 64cd 2e2f 2026 0a58 f259 6620  .l.}d../ &.X.Yf 
00000010: 4422 3050 7220 2d59 3b44 2230 7072 202b  D"0Pr -Y;D"0pr +
00000020: f247 ef22 3170 d32e 2f26 f20a 0f16 7d64  .G."1p../&....}d
00000030: 47d3 2f26 f20a 7b6a 70f2 674a f2d3 f30a  G./&..{jp.gJ....
00000040: 7c44 c72e 2f64 0a4d d922 2d70 4272 20    |D../d.M."-pBr 
DJMcMayhem
sumber
Apakah V memiliki perintah "transpos baris dengan kolom"? Karena jika tidak, Anda mungkin ingin berinvestasi dalam ...
ETHproduksi
2

Jelly , 28 byte

HĊ©«Rµ®Ḥ_,Ṗ
ZLÇṬ€a"¥"o⁶ZẎz⁶Y

Cobalah online!

Woo Jelly sebenarnya bersaing dalam tantangan dan ! \Hai/

Erik the Outgolfer
sumber
Terutama karena setiap bahasa lain juga mengalami kesulitan. Omong-omong, seseorang mungkin ingin berbicara dengan V ...
ETHproduksi
Bagus, saya berhasil 27 - tapi mungkin Anda juga bisa menyalahgunakan tunjangan ruang putih terkemuka / tertinggal?
Jonathan Allan
@ Jonathan Allan Sedihnya saya pikir itu tidak mungkin. Menghapus tidak akan menambahkan ruang trailing tetapi trailing 1. Dan menghilangkan segala sesuatu yang ada hubungannya dengan spasi menghilangkan susunan huruf-huruf. Secara umum, algoritma ini menggunakan pengindeksan sehingga surat-surat mendapatkan indeks tertentu dalam kolom dan sisanya diisi dengan spasi, jadi saya pikir ini tidak bisa di-golf lagi. Setidaknya aku senang bahwa Jelly tidak dikalahkan oleh CJam. ;)
Erik the Outgolfer
: | Jelly lebih pegolf daripada Arang
ASCII
2

05AB1E , 26 23 byte

øS2ä`JIθ«¸«vyNúr})2äR˜»

Cobalah online!

Penjelasan

Dengan contoh input = ppcg, tests

ø                           # zip the input strings
                            # STACK: ['tp', 'ep', 'sc', 'tg']
 S                          # split to a list of characters
                            # STACK: ['t', 'p', 'e', 'p', 's', 'c', 't', 'g'
  2ä                        # divide the list into 2 parts
    `                       # push them as separate to stack
                            # STACK: ['t', 'p', 'e', 'p'], ['s', 'c', 't', 'g']
     J                      # join the second part to a single string
      Iθ«                   # append the tail of the second input
         ¸«                 # concatenate the 2 lists
                            # STACK: ['t', 'p', 'e', 'p', 'sctgs']
           v                # for each y,N (element, index) in the list
            yNú             # prepend N spaces to y
               r            # reverse the stack
                })          # end loop and wrap the stack in a list
                            # STACK: ['    sctgs', '  e', 't', ' p', '   p']
                  2ä        # split the list into 2 parts
                    R       # reverse the list
                            # STACK: [[' p', '   p'], ['    sctgs', '  e', 't']]
                     ˜»     # flatten the list and join on newlines
Emigna
sumber
1
Saya berusaha sangat keras pada pertanyaan ini seperti seminggu yang lalu dan Anda harus pergi dan ... mengalahkan saya. +1 untuk membuat saya mencoba lebih banyak!
nmjcman101
@ nmjcman101: Saya harap Anda bisa mendapatkan lebih sedikit milik Anda. Beberapa kompetisi persahabatan selalu menyenangkan :)
Emigna
1

C # (.NET Core) , 163 byte

(l,s)=>{var o="";int i=0,k=s.Length;for(;i<k;)o+=i<k/2?s[i++]+"\n"+"".PadLeft(i):l[i]+""+s[i++];o+=l[i]+"\n";for(i=k/2;i>0;)o+="".PadLeft(--i)+l[i]+"\n";return o;}

Cobalah online!

Mungkin banyak bermain golf di sini, tapi ini adalah upaya awal non-LINQ. Fungsi Lambda yang mengambil kata yang lebih panjang terlebih dahulu, dan mengembalikan string dengan ouput.

jkelm
sumber
1
Gunakan currying untuk menyimpan byte ( l=>s=>) yaitu Func<input1, Func<input2, output>>.
TheLethalCoder
1

Java 8, 216 byte

Lambda kari: mengambil Stringdan mengembalikan lambda dariString ke String. Parameter ke lambda luar adalah string yang lebih pendek.

Tidak dapat mengindeks ke Stringdalam dengan sintaks array adalah ... disayangkan.

s->t->{int l=s.length(),i=l/2;String o="",p=o,n="\n";for(;i<l;p+="  ")o=o+t.charAt(i)+s.charAt(i++);o=p+o+t.charAt(i)+n;for(;i-->0;)o=p.substring(l-i--)+s.charAt(i/2)+n+o+p.substring(l-i)+t.charAt(i/2)+n;return o;}

Lambda yang tidak tersentuh

s ->
    t -> {
        int
            l = s.length(),
            i = l / 2
        ;
        String
            o = "",
            p = o,
            n = "\n"
        ;
        for (; i < l; p += "  ")
            o = o + t.charAt(i) + s.charAt(i++);
        o = p + o + t.charAt(i) + n;
        for (; i-- > 0; )
            o =
                p.substring(l-i--)
                + s.charAt(i / 2)
                + n
                + o
                + p.substring(l-i)
                + t.charAt(i / 2)
                + n
            ;
        return o;
    }

Penjelasan

ladalah panjang dari input yang lebih pendek dan imerupakan indeks multiguna, diinisialisasi untuk merujuk pada karakter pertama dari bagian kedua dari input yang lebih pendek. omengakumulasi hasilnya, pakhirnya menyimpan ruang untuk pelapis, dann merupakan alias untuk"\n" .

Loop pertama interleaves bagian kedua dari dua string (tidak termasuk karakter terakhir dari input yang lebih panjang) dan membangun p ke jumlah padding yang tepat untuk garis tengah.

Baris berikutnya melengkapi garis tengah output.

Saya ingin meminta maaf kepada James Gosling untuk putaran kedua. Itu menambahkan garis di atas dan di bawah garis tengah dari dalam ke luar. Memasuki loop, iadalah l - 1, jadi satu karakter padding ditambahkan bersama dengan karakter terakhir dari bagian pertama dari string yang lebih pendek.idikurangi sehingga padding berikutnya (ditambahkan ke hasil) adalah karakter yang lebih pendek. Dengan pembagian integer, karakter posisi yang sama dari string yang lebih panjang ditambahkan. Ini berulang, dan hasil yang sudah selesai dikembalikan.

Hal yang keren

Saluran 13 dulu

o+=t.charAt(i)+""+s.charAt(i++);

karena tanpa string kosong, +menambahkan nilai karakter bersama dan menambahkan string numerik. Dengan memperluas penugasan majemuk, gabungan odan t.charAt(i)dievaluasi terlebih dahulu, yang menghasilkan hasil yang diinginkan tanpa perlu string kosong, menghemat 2 byte. Ini adalah pertama kalinya saya melihat tugas majemuk berperilaku berbeda dari ekspansi.

Jakob
sumber
0

Javascript (ES6), 140 137 133 byte

A=(a,b,c=0)=>a[c/2]?` `[d=`repeat`](c+1)+a[0]+`
`+A(a.slice(1),b.slice(1),c+2)+`
`+` `[d](c)+b[0]:` `[d](c)+[...a].map((e,f)=>e+b[f])

Cukup yakin ini bisa bermain golf lebih lanjut

Luke
sumber
Misalnya tidak `<newline>`+` `bisa digabungkan `<newline> `? (Saya tidak tahu JS).
Kaz
@Kaz: tidak, karena kami menjalankan metode repeat hanya pada spasi, dan bukan pada baris + spasi baru.
Lukas
0

Mathematica, 174 byte

(a=(c=Characters)@#;b=c@#2;T=Table;Column[Join[T[T["  ",i]<>a[[i]],{i,g=Length@a/2}],{T["  ",g+1]<>Riffle[b[[-g-1;;]],a[[-g;;]]]},Reverse@T[T["  ",i]<>b[[i+1]],{i,0,g-1}]]])&


Memasukkan

["berritsleting", "paragraf"]

J42161217
sumber
0

TXR Lisp , 126 byte

(defun f(a b :(n 0))(if(<(/ n 2)(length a))` @{""n}@[a 0]\n@(f(cdr a)(cdr b)(+ n 2))\n@{""n}@[b 0]``@{""n}@{(zip b`@a `)""}`))
Kaz
sumber
0

PHP, 149 129 byte

for($r=" ";$x+1<$w=2*$e=strlen($argv[2]);++$x&1||$r[++$i*$w-1]="
")$r[$w*($x&1?$y-1:$e-$y+=$y<$e/2)+$x]=$argv[2-$x%2][$i];echo$r;

Jalankan dengan -nratau coba online .

Titus
sumber
0

Perl 5 , 163 byte

@a=map{$s=.5*length;[/./g]}<>;say(($"x(2*$_)).$a[0][$_])for 0..$s-1;print$"x(2*$s);print$a[0][$_].$a[1][$_]for$s..@{$a[1]};print$/.($"x(1+2*$s)).$a[1][$s]while$s--

Cobalah online!

Mengambil string yang lebih panjang terlebih dahulu.

Xcali
sumber