String interleave

30

Inspirasi. * Saya tidak percaya kami belum pernah menghadapi tantangan ini sebelumnya:

Tugas

Diberikan satu atau lebih string ASCII yang dapat dicetak, interleave mereka dengan mengambil satu karakter dari setiap string, secara siklis hingga keluar dari karakter. Jika string kehabisan karakter sebelum yang lain, lewati saja karakter itu sejak saat itu.

Contohnya

SIMPLE memberi SIMPLE

POLLSdan EPEESmemberiPEOPLELESS

LYESdan APRONSmemberiLAYPERSONS

ABCDEdan a cdan 123 567memberiAa1B 2Cc3D E567

"\n$?*dan (string kosong) dan ,(.)" (spasi tambahan) memberi ",\(n.$)?"* (spasi tambahan)


* Ada solusi APL yang lebih pendek.

Adm
sumber
Karena ini pada dasarnya hanya operasi transpose, kami memiliki beberapa tantangan yang sangat mirip, tetapi mungkin tidak ada yang persis sama.
Martin Ender
7
Saya memiliki pertanyaan ini di CS HW saya, apakah itu berarti saya dapat menutup ini sebagai pertanyaan pekerjaan rumah? ; P
Downgoat
@EriktheOutgolfer Keren! Saya belajar sesuatu hari ini.
Adám

Jawaban:

23

Jelly , 1 byte

Z

Cobalah online!

Built-in "transpose" akan melakukan ini pada daftar string.

Lynn
sumber
Saya ingin tahu, seperti apa kode itu jika Anda harus membuat string pendek dengan spasi?
Adem
2
Itu pasti z⁶. zadalah "transpos kiri, padding dengan kanan"; adalah sebuah ruang.
Lynn
1
@ Adám Jelly bekerja sangat baik pada daftar; di mana akhir built-in dan konstruksi / desain bahasa dimulai?
steenbergh
1
@ Lynn Di Jelly? Apa pun yang ada di daftar Atom dan Quicks adalah bawaan.
Adm
2
@ Adám ;"( gabungan elemen-bijaksana) akan menyelesaikan tugas tanpa built-in.
Dennis
8

Python 2, 101 89 86 69 byte

Saya berharap saya bisa mendapatkan ini menjadi lambda entah bagaimana, memperpendeknya dengan membuatnya menjadi rekursif. Ini tidak ideal karena Anda berharap transposing lebih pendek, sayangnya itu tidak (dari apa yang saya berhasil sampai sejauh ini).

f=lambda s:' '*any(s)and''.join(x[:1]for x in s)+f([x[1:]for x in s])

Solusi lama:

w=input();o=''
while any(w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

lambda s:''.join(''.join([c,''][c<' ']for c in x)for x in map(None,*[list(y)for y in s]))

w=input();o=''
while any(x>=' 'for x in w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

terima kasih kepada mathmandan karena membuat saya merasa bodoh;) menyelamatkan saya banyak byte! (pada solusi lama)

Kade
sumber
Tidak bisakah kamu melakukannya while any(w):? String kosong adalah falsey dalam Python.
mathmandan
@mathmandan Anda benar sekali, tidak tahu apa yang saya pikirkan ..
Kade
Tidak masalah :) Solusi baru Anda terlihat hebat, kecuali saya pikir Anda perlu menambahkan f=.
mathmandan
Anda bisa []melepas panggilan rekursif, pergi f(x[1:] for x in s), yang membuatnya menjadi pemahaman generator, yang bertindak sama dengan daftar dalam konteks ini.
bioweasel
8

Perl 6 , 34 32 byte

{[~] flat roundrobin |$_».comb}

{roundrobin(|$_».comb).flat.join}

Sebuah lambda yang menggunakan array string sebagai argumen, dan mengembalikan sebuah string.

( Coba online )

seseorang
sumber
Saya akan menggunakan @_sebagai gantinya$_
Brad Gilbert b2gills
7

CJam , 4 byte

qN/z

Cobalah online!

Kami juga dapat menulis fungsi tanpa nama untuk 4 byte, yang mengharapkan daftar string di atas tumpukan:

{zs}

Cobalah online!

Martin Ender
sumber
2
Itu satu byte per menit!
Adem
7

Pyth - 3 byte

Sangat sederhana, akan menambah ekspansi nanti, di ponsel.

s.T

Test Suite

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)
Maltysen
sumber
4
@Daniel saya di sekolah juga: P
Maltysen
Adakah rencana untuk menambahkan penjelasan?
John Dvorak
@JanDvorak pasti melakukannya sekarang.
Maltysen
6

JavaScript (ES6), 52 46 byte

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

Mengambil input sebagai array string dan output sebagai string tunggal.

Cuplikan tes

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

g=a=>console.log("Input:",JSON.stringify(a),"Output:",JSON.stringify(f(a)))

g(["SIMPLE"])
g(["POLLS","EPEES"])
g(["LYES","APRONS"])
g(["ABCDE","a c","123 567"])
g(["\"\\n$?*",",(.)\" "]) // Backslash and quote are escaped, but in/output are correct

Produksi ETH
sumber
f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
Neil
@ Neil Itu pendekatan yang bagus. Saya berhasil bermain golf 6 byte dari milik saya sendiri :-)
ETHproduk
6

Haskell, 33 byte

import Data.List
concat.transpose

Cobalah di Ideone. Pemakaian:

Prelude Data.List> concat.transpose$["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

Tanpa menggunakan built-in: ( 38 34 bytes)

f[]=[]
f x=[h|h:_<-x]++f[t|_:t<-x]

Cobalah di Ideone. 4 byte off berkat Zgarb! Pemakaian:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"
Laikoni
sumber
1
Anda dapat menghapus semua parens di versi alternatif. Tetap tidak akan mengalahkan impor.
Zgarb
Apakah Anda benar-benar membutuhkan kasing?
xnor
Sudahlah, tentu saja base case diperlukan.
xnor
@ xnor Anda juga tidak dapat memindahkan kasing ke ujung dan menggantinya dengan f a=auntuk menyimpan byte karena keduanya []memiliki tipe yang berbeda ... sangat dekat.
Laikoni
5

C, 114 84 byte

-20 byte untuk tidak menghitung panjangnya.

i,b;f(char**s){b=1;while(b){i=-1;b=0;while(s[++i]>0)if(*s[i])putchar(*s[i]++),++b;}}

Menerima array char pointer dan membutuhkan item terakhir menjadi null-pointer (lihat penggunaan).

Tidak digabungkan dan digunakan:

i,b;f(char**s){
 b=1;
 while(b){
  i=-1;
  b=0;
  while(s[++i]>0)
   if(*s[i])
    putchar(*s[i]++),++b;
 }
}


int main(){
 char*a[]={ 
//  "POLLS","EPEES"
//  "LYES","APRONS"
 "ABCDE","a c","123 567"
 ,0};
 f(a);
 puts("");
}
Karl Napf
sumber
Apakah penggunaan printf / sprintf tidak diizinkan? : D Anda akan memenangkan beberapa byte.
Walfrat
@ Walfrat Tanpa mencetak langsung saya harus mengalokasikan string, jadi bagaimana ini bisa menghemat apa pun.
Karl Napf
itu sebelum edit Anda di mana Anda menambahkan ++ b dan menghapus penghitungan panjang, jadi ya tidak bisa bekerja lagi.
Walfrat
@ Walfrat Ya, tapi saya punya mallocdan returnsebelumnya dan ini lebih lama dari sekadar mencetak
Karl Napf
5

PHP, 68 67 byte

for(;$f=!$k=$f;$i++)for(;y|$v=$argv[++$k];$f&=""==$c)echo$c=$v[$i];

Loop atas argumen baris perintah. Jalankan dengan -r.

Setelah loop dalam, $fadalah 1ketika semua string selesai, yang 0lain (bitwise &cast ""==$cke int).
Iterasi berikutnya dari loop luar: salin $fke $k(menyimpan satu byte dari $k=0) dan beralih $f:
Ketika semua string selesai, $fsekarang falsedan loop rusak.

Titus
sumber
Tidak berfungsi dengan string input kosong. Lihatlah testcase terakhir
aross
@ aross: diperbaiki. Terima kasih.
Titus
4

Retina , 13 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

O$#`.
$.%`
¶

Cobalah online!

Penjelasan

O$#`.
$.%`

Ini didasarkan pada teknik transposisi standar di Retina. Kami mengurutkan ( O) semua karakter non-linefeed ( .), dengan ( $#) jumlah karakter di depannya pada baris yang sama ( $.%`), yaitu posisi horizontal mereka.

Tahap kedua kemudian cukup menghapus umpan baris dari input.

Martin Ender
sumber
4

Jawa, 19 + 155 = 174 160

String f(java.util.Queue<String> q){String s,r="";while(!q.isEmpty()){s=q.poll();r+=s.isEmpty()?"":s.charAt(0);if(s.length()>1)q.add(s.substring(1));}return r;}

Tidak Disatukan:

  String f(java.util.Queue<String> q) {
    String s, r = "";
    while (!q.isEmpty()) {
      s = q.poll();
      r += s.isEmpty() ? "" : s.charAt(0);
      if (s.length() > 1) {
        q.add(s.substring(1));
      }
    }
    return r;
  }

Keluaran:

SEDERHANA

ORANG-ORANG

LAYPERSONS

Aa1B 2Cc3D E567

", (n. $)?" *

Modifikasi pertama: deklarasi string digabungkan untuk menyimpan beberapa byte. Dihapus import, itu digunakan oleh main()metode (tidak ditampilkan di sini) yang juga diperlukan LinkedList. Ini lebih sedikit byte untuk dirujuk Queuesecara langsung.


sumber
inisialisasi string s dengan string r dapat menghemat lebih sedikit
Syamesh K
Saya tahu ini sudah hampir setahun yang lalu, tetapi Anda dapat bermain golf beberapa byte:String f(java.util.Queue<String>q){String s,r="";for(;!q.isEmpty();r+=s.isEmpty()?"":s.charAt(0))if((s=q.poll()).length()>1)q.add(s.substring(1));return r;}
Kevin Cruijssen
3

PHP, 77 byte

Golf

function($a){for($d=1;$d!=$s;$i++){$d=$s;foreach($a as$v)$s.=$v[$i];}echo$s;}

Fungsi anonim yang mengambil array string.

Saya yakin ini bisa bermain golf lebih banyak, tapi ini masih awal. Pada setiap iterasi, kami mengambil huruf ke-i dari setiap string yang diberikan dan menambahkannya ke string terakhir kami, satu per satu. PHP hanya memberikan peringatan jika kita mengakses bit dari string yang tidak ada, jadi tidak masalah. Kami hanya berhenti ketika tidak ada perubahan yang dilakukan setelah mengulang semua string sekali.

Saya merasa penggunaannya $dbisa lebih banyak bermain golf, tapi ini masih awal. : P

Xanderhall
sumber
Bagaimana tepatnya Anda meletakkan array string dalam satu argumen?
Titus
@Titus. Kau tahu, aku tidak pernah benar-benar memikirkannya. Aku hanya berasumsi kamu bisa.
Xanderhall
3

Sebenarnya , 7 6 byte

Selamat datang saran bermain golf! Cobalah online!

Sunting: -1 byte berkat Teal pelican.

a Z♂ΣΣ

Tidak melakukanolf

          Implicit input each string.
a         Invert the stack so that the strings are in the correct order.
<space>   Get the number of items on the stack, len(stack).
Z         Zip all len(stack) strings into one, transposing them.
♂Σ        sum() every transposed list of chars into strings.
Σ         sum() again to join the strings together.
Sherlock9
sumber
Tidak bisakah Anda menghapus # untuk membuatnya 6 byte?
Teal pelican
@Tealpelican Welp, sekarang aku akan harus menggali melalui semua lama saya Sebenarnya jawaban dan melihat apakah saya tidak dapat mengubah Z♂#Σke Z♂Σdalam semua mereka. Terima kasih atas tipnya: D
Sherlock9
Pertama kali melihat ke dalam bahasa, itu terlihat sangat menyenangkan! Senang saya bisa membantu :))
Teal pelican
3

JavaScript (ES6), 46 byte

f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
<textarea oninput=o.textContent=f(this.value.split`\n`)></textarea><div id=o>

Neil
sumber
3

Python 2 , 58 byte

lambda*m:''.join(map(lambda*r:''.join(filter(None,r)),*m))

Cobalah online!

Keerthana Prabhakaran
sumber
Tidak bisakah Anda menghapus ruang lambda *m?
Erik the Outgolfer
Saya baru saja melakukannya! Terima kasih!
Keerthana Prabhakaran
2

J , 13 byte

({~/:)&;#\&.>

Cobalah online!

Berdasarkan inspirasi untuk pertanyaan ini.

Cara lain untuk melakukannya membutuhkan 27 byte tetapi beroperasi menggunakan transpose. Sebagian besar byte adalah untuk menangani nol yang ditambahkan secara otomatis dari padding.

[:u:0<:@-.~[:,@|:(1+3&u:)&>

Penjelasan

({~/:)&;#\&.>  Input: list of boxed strings S
          &.>  For each boxed string x in S
        #\       Get the length of each prefix from shortest to longest
                 This forms the range [1, 2, ..., len(x)]
                 Rebox it
(    )         Operate on S and the prefix lengths
      &;         Raze both
   /:            Grade up the raze of the prefix lengths
 {~              Index into the raze of S using the grades
               Return
mil
sumber
Larangan campuran J benar-benar melukai Anda di sini. Cobalah di APL.
Adem
2

Utilitas Bash + GNU, 55

 eval paste `sed "s/.*/<(fold -1<<<'&')/g"`|tr -d \\n\\t

I / O via STDIN (dipisahkan jalur) dan STDOUT.

The sedformat setiap baris ke substitusi proses pesta . Ini kemudian evaldiedit pasteuntuk melakukan interleaving yang sebenarnya. trlalu hapus baris dan tab baru yang tidak perlu.

Ideone.

Trauma Digital
sumber
2

PHP, 63 byte

Catatan: menggunakan pengkodean IBM-850

for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];

Jalankan seperti ini:

php -r 'for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];' "\"\n\$?*" "" ",(.)\" " 2>/dev/null;echo
> ",\(n.$)?"* 

Penjelasan

for(                       # Iterate over string index.
  ;
  $s ^= 1;                 # Continue until $s (stop iterating) is 1.
                           # Flip $s so each iteration starts with $s
                           # being 1.
  $i++                     # Increment string index.
)
  for(
    ;
    "n" | $w=$argv[++$$i]; # Iterate over all input strings. OR with "n"
                           # to allow for empty strings.
    $s &= $x<~■            # If last character printed was greater than
                           # \x0 (all printable chars), set $s to 0,
                           # causing the loop to continue.
  )
    echo $x = $w[$i];      # Print char $i of current string.
aross
sumber
IBM-850 ?! Apakah itu penyandian alami untuk PHP?
Adem
@ Adám apa yang Anda maksud dengan "alami"? PHP memperlakukan byte dalam kisaran 128-255 sebagai teks, yang karenanya ditafsirkan sebagai konstanta. Jika konstanta tidak terdefinisi, konstanta itu akan ditafsirkan sebagai string. Ini agar saya bisa melakukan ~■(biner 254) bukan "\x1"(biner 1).
aross
1
Saya melihat. Bukannya Anda benar-benar membutuhkan codepage itu, Anda hanya perlu 254 byte.
Adem
@ Adám ya, codepage ini hanya membuatnya menjadi karakter yang bisa dicetak yang sedikit tidak mengganggu.
aross
Penggunaan hebat $$!
Titus
2

Python 3, 75 Bytes

Saya tahu yang lain Python lebih pendek, tapi ini adalah pertama kalinya saya pernah menggunakan mapdalam hidup saya jadi saya cukup bangga karenanya

lambda n:''.join(i[k]for k in range(max(map(len,n)))for i in n if len(i)>k)
bioweasel
sumber
1

C, 75 71 byte

Satu-satunya batasan adalah panjang output. Saat ini 99, tetapi dapat dengan mudah diregangkan ke 999 (+1 byte).

i;main(a,b)char**b;{a--;for(;i<99;i++)*b[i%a+1]&&putchar(*b[i%a+1]++);}

Tidak Disatukan:

i;
main( a, b )
char **b;
{
    a--;
    for( ; i < 99; i++ )
        *b[i % a + 1] && putchar( *b[i % a + 1]++ );
}
Jacajack
sumber
1

Oracle SQL, 195 byte

    select listagg(b,'') within group(order by l,o) from(select substr(a,level,1) b,level l,o from i start with length(a)>0 connect by prior a=a and level<=length(a) and prior sys_guid() is not null)

Mengambil inputnya dari tabel idengan kolom a(berisi string) dan o(urutan string):

    create table i (a varchar2(4000), a integer)

Penjelasan:
Kami mengeksploitasi CONNECT BYuntuk memecah string menjadi masing-masing karakter yang membuatnya. PRIOR SYS_GUID()sedang NOT NULLmemastikan kita tidak terjebak dalam satu lingkaran.
Kami kemudian menggabungkan karakter tunggal dengan LISTAGGtetapi kami mengocoknya denganORDER BY klausa, memesannya terlebih dahulu dengan posisi mereka di string asli dan hanya kemudian oleh string mereka berasal.

Tidak sesingkat jawaban yang lain tetapi SQL tidak benar-benar dimaksudkan sebagai bahasa manipulasi string :)

Demonblack
sumber
1

Python 2, 128 96

Saya berharap tidak harus menggunakan itertools

a=lambda a:"".join([i for i in reduce(lambda: b,c:b+c, map(None,*map(lambda m:list(m),a)) if i])

Tidak disatukan

 a=lambda a:                              #Start a lambda taking in a
    "".join(                              #Join the result together with empty string
        [i for i in reduce(               #For every item, apply the function and 'keep'
           lambda: b,c:b+c,               #Add lists from...
                map(None,*map(            #None = Identity function, over a map of...
                    lambda m:list(m), a)  #list made for mthe strings m
                   ) if i                 #truthy values only (otherwise the outer map will padd with None.
       ])
Pureferret
sumber
Sangat menghargai umpan balik / saran untuk meningkatkan ini.
Pureferret
1

R , 73 byte

for(i in 1:max(nchar(s<-scan(,""))))for(j in seq(s))cat(substr(s[j],i,i))

Cobalah online!

Penjelasan: sangat sederhana (tetapi verbose), hanya loop melalui pencetakan ikarakter jth th string. Untungnya, substrmengembalikan string kosong jika diberi input di luar jangkauan.

pengguna2390246
sumber
0

Python, 112 byte

i=len(x)if len(x)>len(y) else len(y) h=0 a="" while h<i: if h<len(x) a+=x[h] if h<len(y): a += y[h] h+=1 print a
jacksonecac
sumber
6
Format Anda benar-benar kacau .. dari mana Anda dapatkan xdan ydari mana?
Kade
0

Perl 5 , 53 byte

$i=0,map{push@{$a[$i++]},$_}/./g for<>;print@$_ for@a

Cobalah online!

metode

Membuat array dua dimensi di mana jumlah baris sama dengan panjang string terpanjang dan jumlah maksimum kolom sama dengan jumlah string. Kemudian output setiap baris array tanpa spasi.

Xcali
sumber
0

TXR Lisp , 20 byte

(opip weave cat-str)

Menjalankan:

1> (opip weave cat-str)
#<intrinsic fun: 0 param + variadic>
2> [*1 "LYES" "APRONS"]
"LAYPERSONS"
3> [*1 "ABCDE" "a c" "" "123 567"]
"Aa1B 2Cc3D E567"
4> [*1 "\"\\n$?*" "" ",(.) "]
"\",\\(n.$)? *"

The weavefungsi malas, sehingga mengembalikan daftar, itulah sebabnya mengapa kita harus memaksa hasilnya ke string. Menjadi malas, itu dapat menenun urutan yang tak terbatas. Sebagai contoh, kita dapat menenun bilangan alami genap dan ganjil, yang merupakan daftar malas tak terbatas:

5> (take 20 (weave (range 2 : 2) (range 1 : 2)))
(2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19)
Kaz
sumber
0

K (oK) , 35 29 byte

Larutan:

{`c$r@&~^r:,/+(`i$x)[;!#,/x]}

Cobalah online!

Contoh:

> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("ABCDE";"a c";"123 567")
"Aa1B 2Cc3D E567"
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("\n$?*";"";",(.)\" ")
"\n,$(?.*)\" "
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("POLLS";"EPEES")
"PEOPLELESS"

Penjelasan:

Gunakan pengindeksan tingkat 2 untuk mengeluarkan indeks dari 0 hingga maks (panjang daftar rata) di semua daftar input. Pengindeksan apa pun di luar batas sub-daftar akan menghasilkan nol. Balik (putar 90), ratakan, lalu tarik hasil yang bukan nol.

Catatan:

  • Saya melakukan cast ke integer ( i$) sehingga kita mendapatkan null yang berguna, sebagai spasi ( ) dianggap null untuk daftar char yang berarti Anda tidak bisa memberi tahu nol dari spasi yang valid.
  • Juga saya tidak bisa mendapatkan TIO untuk bekerja dengan input (berfungsi dengan baik di oK repl) sehingga tautan TIO menyertakan "ABCDE" ... contoh.
streetster
sumber
0

Jq 1,5 , 49 byte

map(explode)|transpose|map(map(values)[])|implode

Penjelasan

                      # example input:          ["LYES","APRONS"]
  map(explode)        # make list of ordinals   [[76,89,69,83],[65,80,82,79,78,83]]
| transpose           # zip lists               [[76,65],[89,80],[69,82],[83,79],[null,78],[null,83]]
| map(map(values)[])  # rm nulls and flatten    [76,65,89,80,69,82,83,79,78,83]
| implode             # convert back to string  "LAYPERSONS"

Contoh Jalankan

$ paste input <(jq -Mrc 'map(explode)|transpose|map(map(values)[])|implode' input)
["SIMPLE"]                  SIMPLE
["POLLS","EPEES"]           PEOPLELESS
["LYES","APRONS"]           LAYPERSONS
["ABCDE", "a c", "123 567"] Aa1B 2Cc3D E567
["\"\\n$?*", "", ",(.)\" "] ",\(n.$)?"* 

$ echo -n 'map(explode)|transpose|map(map(values)[])|implode' | wc -c
  49    

Cobalah online

jq170727
sumber