Chuỗi xen kẽ


30

Cảm hứng. * Tôi không thể tin rằng chúng tôi chưa từng có thử thách này trước đây:

Bài tập

Cho một hoặc nhiều chuỗi ASCII có thể in, xen kẽ chúng bằng cách lấy một ký tự từ mỗi chuỗi, theo chu kỳ cho đến khi hết ký tự. Nếu một chuỗi hết ký tự trước các chuỗi khác, chỉ cần bỏ qua chuỗi đó từ đó trở đi.

Ví dụ

SIMPLE cho SIMPLE

POLLSEPEESchoPEOPLELESS

LYESAPRONSchoLAYPERSONS

ABCDEa c123 567cung cấp choAa1B 2Cc3D E567

"\n$?*(chuỗi trống) và ,(.)" (dấu cách) cho ",\(n.$)?"* (dấu cách)


* Có các giải pháp APL ngắn hơn.


Vì về cơ bản đây chỉ là một hoạt động chuyển vị, chúng tôi đã có một vài thử thách rất giống nhau, nhưng có thể không có thử thách nào giống hệt nhau.
Martin Ender

7
Tôi đã có câu hỏi này trên CS CT của mình, điều đó có nghĩa là tôi có thể đóng câu hỏi này như một câu hỏi bài tập về nhà không? ; P
Hạ cấp

@EriktheOutgolfer Thật tuyệt! Tôi đã học được một cái gì đó ngày hôm nay.
Adám

Câu trả lời:


23

Thạch , 1 byte

Z

Hãy thử trực tuyến!

Các chuyển đổi được chuyển đổi thành phần cứng được tích hợp sẵn sẽ thực hiện chính xác điều này với một danh sách các chuỗi.


Tôi tò mò, mã sẽ trông như thế nào nếu bạn phải đệm các chuỗi ngắn với khoảng trắng?
Adám

2
Đó sẽ là z⁶. zLà chuyển đổi bên trái, đệm với bên phải; là một không gian.
Lynn

1
@ Adám Jelly hoạt động rất tốt trong danh sách; nơi kết thúc xây dựng và cấu trúc / thiết kế ngôn ngữ bắt đầu?
steenbergh

1
@Lynn Trong Jelly? Bất cứ điều gì trong danh sách Nguyên tử và Nhanh chóng đều được xây dựng.
Adám

2
@ Adám ;"(nối phần tử khôn ngoan) sẽ giải quyết nhiệm vụ mà không cần tích hợp.
Dennis

8

Python 2, 101 89 86 69 byte

Tôi hy vọng tôi có thể đưa nó vào lambda bằng cách nào đó, rút ​​ngắn nó xuống bằng cách làm cho nó đệ quy. Điều đó không lý tưởng bởi vì bạn sẽ hy vọng việc chuyển đổi ngắn hơn, thật không may (từ những gì tôi đã quản lý để đưa ra cho đến nay).

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

Giải pháp cũ:

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

cảm ơn mathmandan vì đã khiến tôi cảm thấy ngớ ngẩn;) đã tiết kiệm cho tôi một loạt byte! (trên một giải pháp cũ)


Bạn không thể làm gì while any(w):? Chuỗi rỗng là falsey trong Python.
mathmandan

@mathmandan Bạn hoàn toàn đúng, không biết tôi đang nghĩ gì ..
Kade

Không có vấn đề gì :) Giải pháp mới của bạn trông rất tuyệt, ngoại trừ tôi nghĩ bạn cần phải trả trước f=.
mathmandan

Bạn có thể []tắt cuộc gọi đệ quy, để lại f(x[1:] for x in s), làm cho nó trở thành một trình hiểu, tạo ra hoạt động giống như một danh sách trong ngữ cảnh này.
bioweasel



7

Pyth - 3 byte

Rất đơn giản, sẽ thêm mở rộng sau này, trên di động.

s.T

Phòng thử nghiệm

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)

4
@Daniel Tôi cũng đang ở trường: P
Maltysen 8/12/2016

Bất kỳ kế hoạch về việc thêm lời giải thích?
John Dvorak

@JanDvorak chắc chắn làm điều đó ngay bây giờ.
Maltysen

6

JavaScript (ES6), 52 46 byte

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

Lấy đầu vào là một chuỗi các chuỗi và đầu ra dưới dạng một chuỗi.

Kiểm tra đoạn

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


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

@Neil Đó là một cách tiếp cận tuyệt vời. Tôi đã tự mình đánh gôn 6 byte :-)
ETHproductions 8/12/2016

6

Haskell, 33 byte

import Data.List
concat.transpose

Hãy thử nó trên Ideone. Sử dụng:

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

Không sử dụng tích hợp: ( 38 34 byte)

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

Hãy thử nó trên Ideone. Giảm 4 byte nhờ Zgarb! Sử dụng:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

1
Bạn có thể loại bỏ tất cả các parens trong phiên bản thay thế. Vẫn sẽ không đánh bại nhập khẩu mặc dù.
Zgarb

Bạn có thực sự cần trường hợp cơ sở?
xnor

Đừng bận tâm, tất nhiên trường hợp cơ sở là cần thiết.
xnor

@xnor Bạn cũng không thể di chuyển trường hợp cơ sở đến cuối và thay thế nó bằng f a=ađể lưu một byte vì cả hai đều []có một loại khác nhau ... rất gần.
Laikoni

5

C, 114 84 byte

-20 byte vì không tính được độ dài.

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

Chấp nhận mảng con trỏ char và yêu cầu mục cuối cùng là con trỏ null (xem phần sử dụng).

Ungolfed và cách sử dụng:

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("");
}

Việc sử dụng printf / sprintf không được phép? : D bạn sẽ giành được khá nhiều byte.
Walfrat

@Walfrat Nếu không in trực tiếp, tôi cần phân bổ một chuỗi, vậy làm thế nào điều này có thể tiết kiệm mọi thứ.
Karl Napf

đó là trước khi chỉnh sửa của bạn, nơi bạn đã thêm ++ b và loại bỏ tính toán độ dài, vì vậy, không thể hoạt động được nữa.
Walfrat

@Walfrat Có, nhưng tôi đã có một mallocreturntrước đó và điều này còn dài hơn cả việc in ấn
Karl Napf

5

PHP, 68 67 byte

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

Vòng lặp trên các đối số dòng lệnh. Chạy với -r.

Sau vòng lặp bên trong, $f1khi tất cả các chuỗi kết thúc, 0khác (bitwise &phôi ""==$cthành int).
Lặp lại tiếp theo của vòng lặp bên ngoài: sao chép $fvào$k (lưu một byte từ $k=0) và chuyển đổi $f:
Khi tất cả các chuỗi được thực hiện, $fbây giờ falsevà vòng lặp bị hỏng.


Không hoạt động với chuỗi đầu vào trống. Hãy xem thử nghiệm cuối cùng
từ

@aross: đã sửa. cảm ơn.
Tít

4

Võng mạc , 13 byte

Số lượng byte giả định mã hóa ISO 8859-1.

O$#`.
$.%`
¶

Hãy thử trực tuyến!

Giải trình

O$#`.
$.%`

Điều này dựa trên kỹ thuật chuyển vị tiêu chuẩn trong Retina. Chúng tôi sắp xếp ( O) tất cả các ký tự không phải là dòng ( .), theo ($# ) số lượng ký tự ở phía trước chúng trên cùng một dòng ( $.%`), tức là vị trí nằm ngang của chúng.

Giai đoạn thứ hai sau đó chỉ cần loại bỏ các nguồn cấp từ đầu vào.


4

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

Ung dung:

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

Đầu ra:

ĐƠN GIẢN

NHÂN DÂN

LAYPERSONS

Aa1B 2Cc3D E567

", (n. $)?" *

Sửa đổi đầu tiên: khai báo chuỗi hợp nhất để lưu một số byte. Loại bỏ import, nó đã được sử dụng bởi main()phương thức (không hiển thị ở đây) cũng cần thiết LinkedList. Nó là ít byte hơn để giới thiệu Queuetrực tiếp.


khởi tạo chuỗi s với chuỗi r có thể tiết kiệm thêm vài lần
Syamesh K

Tôi biết rằng đã gần một năm trước, nhưng bạn có thể chơi gôn một vài 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

Chơi gôn

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

Hàm ẩn danh có một chuỗi các chuỗi.

Tôi chắc chắn rằng điều này có thể được đánh gôn nhiều hơn, nhưng nó sớm. Trên mỗi lần lặp, chúng tôi lấy chữ cái thứ i từ mỗi chuỗi đã cho và nối nó vào chuỗi cuối cùng, mỗi lần một chuỗi. PHP chỉ đưa ra các cảnh báo nếu chúng ta truy cập các chuỗi của chuỗi không tồn tại, vì vậy điều đó tốt. Chúng tôi chỉ dừng lại khi không có thay đổi nào được thực hiện sau khi lặp qua tất cả các chuỗi một lần.

Tôi cảm thấy việc sử dụng $dcó thể được chơi gôn nhiều hơn, nhưng đó là sớm. : P


Làm thế nào chính xác để bạn đặt một chuỗi các chuỗi trong một đối số?
Tít

@Titus. Vâng, tôi chưa bao giờ thực sự nghĩ về nó. Tôi chỉ giả sử bạn có thể.
Xanderhall

3

Thật ra , 7 6 byte

Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

Chỉnh sửa: -1 byte nhờ vào Teal pelican.

a Z♂ΣΣ

Ungolfing

          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.

Bạn không thể loại bỏ # để làm cho nó 6 byte?
Teal pelican

@Tealpelican Welp, bây giờ tôi sẽ phải khai thác thông qua tất cả các câu trả lời cũ Trên thực tế tôi và xem nếu tôi không thể thay đổi Z♂#Σđể Z♂Σtrong tất cả chúng. Cảm ơn vì tiền boa: D
Sherlock9

Lần đầu tiên nhìn vào ngôn ngữ, nó trông rất vui! Vui mừng tôi có thể giúp :))
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>



2

J , 13 byte

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

Hãy thử trực tuyến!

Dựa trên cảm hứng cho câu hỏi này.

Một cách khác để làm nó mất 27 byte nhưng hoạt động bằng cách sử dụng transpose. Hầu hết các byte là để xử lý các số 0 được thêm tự động từ phần đệm.

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

Giải trình

({~/:)&;#\&.>  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

J cấm các mảng hỗn hợp thực sự làm tổn thương bạn ở đây. Hãy thử nó trong APL.
Adám

2

Tiện ích Bash + GNU, 55

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

I / O thông qua STDIN (tách dòng) và STDOUT.

Các sed định dạng mỗi dòng để thay thế quá trình bash . Chúng sau đó được evaled vào pasteđể thực hiện xen kẽ thực tế. trsau đó loại bỏ các dòng và tab không cần thiết.

Ideone.


2

PHP, 63 byte

Lưu ý: sử dụng mã hóa IBM-850

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

Chạy như thế này:

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

Giải trình

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.

IBM-850?! Đó có phải là một mã hóa tự nhiên cho PHP?
Adám

@ Adám bạn có ý gì bởi "tự nhiên"? PHP coi các byte trong phạm vi 128-255 dưới dạng văn bản, do đó được hiểu là một hằng số. Nếu hằng số không được xác định, nó sẽ được hiểu là một chuỗi. Đó là vì vậy tôi có thể làm ~■(nhị phân phủ định 254) thay vì "\x1"(nhị phân 1).
vào

1
Tôi hiểu rồi. Không phải là bạn thực sự cần codepage đó, bạn chỉ cần một byte 254.
Adám

@ Adám có, codepage chỉ làm cho nó trở thành một char có thể in được mà ít gây phiền nhiễu hơn.
từ

Công dụng tuyệt vời của $$!
Tít

2

Python 3, 75 byte

Tôi biết một con Python khác ngắn hơn, nhưng đây là lần đầu tiên tôi sử dụng maptrong đời nên tôi rất tự hào về nó

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

1

C, 75 71 byte

Chỉ có giới hạn là chiều dài đầu ra. Hiện tại là 99, nhưng có thể dễ dàng kéo dài đến 999 (+1 byte).

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

Ung dung:

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

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)

Lấy đầu vào của nó từ một bảng có tên icột a(chứa chuỗi) và o(thứ tự của chuỗi):

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

Giải thích:
Chúng tôi đang khai thác CONNECT BYđể chia các chuỗi thành từng nhân vật tạo nên chúng. PRIOR SYS_GUID()được NOT NULLđảm bảo rằng chúng ta không bị mắc kẹt trong một vòng lặp.
Sau đó chúng tôi ghép các ký tự đơn vớiLISTAGG nhưng chúng tôi xáo trộn chúng bằng một ORDER BYmệnh đề, sắp xếp chúng theo vị trí của chúng trong chuỗi gốc và chỉ sau đó theo chuỗi chúng xuất phát.

Không ngắn như các câu trả lời khác nhưng SQL không thực sự có nghĩa là ngôn ngữ thao tác chuỗi :)


1

Con trăn 2 128 96

Tôi đã hy vọng không phải sử dụng 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])

Ung dung

 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.
       ])

Sẽ đánh giá cao thông tin phản hồi / lời khuyên về việc cải thiện điều này.
Pureferret


1

R , 73 byte

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

Hãy thử trực tuyến!

Giải thích: rất đơn giản (nhưng dài dòng), chỉ cần lặp qua in iký tự thứ của jchuỗi thứ. May mắn thay, substrtrả về một chuỗi rỗng nếu được cung cấp đầu vào ngoài phạm vi.


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

6
Định dạng của bạn thực sự là sai lầm .. nơi nào bạn thậm chí có được xytừ đâu?
Kade

0

Perl 5 , 53 byte

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

Hãy thử trực tuyến!

phương pháp

Tạo một mảng hai chiều trong đó số lượng hàng bằng với độ dài của chuỗi dài nhất và số cột tối đa bằng số lượng chuỗi. Sau đó xuất từng hàng của mảng mà không có khoảng cách.


0

TXR Lisp , 20 byte

(opip weave cat-str)

Chạy:

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.$)? *"

Các weavechức năng là lười biếng, vì vậy nó sẽ trả về một danh sách, đó là lý do chúng ta phải buộc kết quả vào một chuỗi. Là lười biếng, nó có thể dệt chuỗi vô hạn. Chẳng hạn, chúng ta có thể dệt các số tự nhiên chẵn và lẻ, chúng là các danh sách lười biếng vô hạn:

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)

0

K (oK) , 35 29 byte

Dung dịch:

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

Hãy thử trực tuyến!

Thí dụ:

> {`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"

Giải trình:

Sử dụng lập chỉ mục cấp 2 để kéo các chỉ số từ 0 đến tối đa (độ dài của danh sách dẹt) trên tất cả các danh sách đầu vào. Bất kỳ lập chỉ mục nào ngoài giới hạn của danh sách phụ sẽ trả về null. Lật (xoay 90), làm phẳng, và sau đó rút ra kết quả không null.

Ghi chú:

  • Tôi chuyển sang số nguyên ( i$) để chúng tôi nhận được các giá trị null hữu ích, vì khoảng trắng ( ) được coi là null cho danh sách char có nghĩa là bạn không thể nói null từ các khoảng trắng hợp lệ.
  • Ngoài ra, tôi không thể làm cho TIO hoạt động với đầu vào (hoạt động tốt trong thay thế oK) vì vậy liên kết TIO bao gồm ví dụ "ABCDE" ....

0

Jq 1.5 , 49 byte

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

Giải trình

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

Chạy mẫu

$ 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    

Dùng thử trực tuyến

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.