สตริงสอดแทรก


30

แรงบันดาลใจ * ฉันไม่อยากเชื่อว่าเราไม่เคยมีความท้าทายนี้มาก่อน:

งาน

กำหนดสตริง ASCII ที่พิมพ์ได้หนึ่งหรือมากกว่าให้สอดแทรกโดยใช้อักขระหนึ่งตัวจากแต่ละสตริงจนกระทั่งครบจำนวนอักขระ หากสตริงไม่มีอักขระอยู่ก่อนอักขระอื่นให้ข้ามสตริงนั้นไปก่อน

ตัวอย่าง

SIMPLE จะช่วยให้ SIMPLE

POLLSและEPEESให้PEOPLELESS

LYESและAPRONSให้LAYPERSONS

ABCDEและa cและ123 567ให้Aa1B 2Cc3D E567

"\n$?*และ(สตริงว่าง) และ,(.)" (พื้นที่ต่อท้าย) ให้",\(n.$)?"* (พื้นที่ต่อท้าย)


* มีโซลูชั่น APL ที่สั้นกว่า


เนื่องจากนี่เป็นเพียงการปฏิบัติการขนย้ายเราจึงมีความท้าทายเล็กน้อยที่คล้ายคลึงกันมาก แต่อาจไม่มีเลยที่เหมือนกันทั้งหมด
Martin Ender

7
ฉันมีคำถามนี้ใน CS HW ของฉันนั่นหมายความว่าฉันสามารถปิดนี่เป็นคำถามทำการบ้านได้หรือไม่? ; P
Downgoat

@EriktheOutgolfer เจ๋งมาก! ฉันเรียนรู้บางอย่างในวันนี้
อดัม

คำตอบ:


23

เยลลี่ขนาด 1 ไบต์

Z

ลองออนไลน์!

บิวด์อิน "transpose" จะทำสิ่งนี้กับรายการสตริงทั้งหมด


ฉันอยากรู้อยากเห็นรหัสจะมีลักษณะอย่างไรถ้าคุณต้องใช้สายอักขระสั้น ๆ ด้วยช่องว่าง?
อดัม

2
z⁶ที่จะเป็น zคือ "เปลี่ยนไปทางซ้ายรองด้วยขวา"; เป็นพื้นที่
ลินน์

1
@ Adám Jelly ทำงานได้ดีในรายการ จุดสิ้นสุดของบิวด์อินและการสร้าง / ออกแบบภาษาเริ่มต้นที่ใด
steenbergh

1
@ ลินน์ในเจลลี่? ทุกสิ่งในรายการ Atoms และ Quicks คือ buildt-ins
อดัม

2
@ Adám ;"(การต่อข้อมูลแบบองค์ประกอบที่ชาญฉลาด) จะแก้ปัญหาได้โดยไม่ต้องมีการติดตั้งในตัว
Dennis

8

Python 2, 101 89 86 69 ไบต์

ฉันหวังว่าฉันจะเอามันมาเป็นแลมบ์ดาได้ แต่ทำให้มันสั้นลงด้วยการทำให้มันวนซ้ำ มันไม่เหมาะเพราะคุณหวังว่าการขนย้ายจะสั้นลง แต่น่าเสียดายที่มันไม่ได้เป็น

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

โซลูชั่นเก่า:

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

ขอบคุณ mathmandan ที่ทำให้ฉันรู้สึกงี่เง่า;) ช่วยให้ฉันได้รับ bytes! (บนโซลูชันเก่า)


คุณทำwhile any(w):ไม่ได้เหรอ สตริงว่างจะปลอมแปลงใน Python
mathmandan

@Mathmandan คุณพูดถูกฉันไม่รู้ว่าฉันกำลังคิดอะไรอยู่ ..
Kade

ไม่มีปัญหา :) ทางออกใหม่ของคุณดูดียกเว้นฉันคิดว่าคุณต้องf=เสริม
คณิตศาสตร์

คุณสามารถ[]ถอดสายเรียกซ้ำออกไปf(x[1:] for x in s)ซึ่งทำให้เกิดความเข้าใจของตัวสร้างซึ่งทำหน้าที่เหมือนกับรายการในบริบทนี้
bioweasel


7

CJam , 4 ไบต์

qN/z

ลองออนไลน์!

นอกจากนี้เรายังสามารถเขียนฟังก์ชันที่ไม่มีชื่อสำหรับ 4 ไบต์ซึ่งคาดว่าจะมีรายการสตริงที่ด้านบนของสแต็ก:

{zs}

ลองออนไลน์!


2
นั่นคือหนึ่งไบต์ต่อนาที!
อดัม

7

Pyth - 3 ไบต์

ง่ายมากจะเพิ่มการขยายในภายหลังบนมือถือ

s.T

ชุดทดสอบ

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

4
@Daniel ฉันอยู่ในโรงเรียนด้วย: P
Maltysen

มีแผนใด ๆ ในการเพิ่มคำอธิบายหรือไม่
John Dvorak

@JanDvorak แน่ใจว่าทำตอนนี้
Maltysen

6

JavaScript (ES6), 52 46 ไบต์

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

รับอินพุตเป็นอาร์เรย์ของสตริงและเอาต์พุตเป็นสตริงเดี่ยว

ตัวอย่างการทดสอบ

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 นั่นเป็นวิธีที่ดี ฉันจัดการเพื่อกอล์ฟ 6 ไบต์จาก :-) ของตัวเอง
ETHproductions

6

Haskell, 33 ไบต์

import Data.List
concat.transpose

ลองใช้กับ Ideone การใช้งาน:

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

โดยไม่ต้องใช้ build-in: ( 38 34 bytes)

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

ลองใช้กับ Ideone ปิด 4 ไบต์ด้วย Zgarb! การใช้งาน:

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

1
คุณสามารถลบ parens ทั้งหมดในเวอร์ชั่นทางเลือกได้ แต่ก็ยังไม่ชนะการนำเข้า
Zgarb

คุณต้องการเคสพื้นฐานหรือไม่?
xnor

ไม่เป็นไรแน่นอนจำเป็นต้องใช้เคสพื้นฐาน
xnor

@xnor คุณยังไม่สามารถย้ายเคสพื้นฐานไปยังจุดสิ้นสุดและแทนที่ด้วยf a=aเพื่อบันทึกไบต์เนื่องจากทั้งสอง[]มีประเภทที่แตกต่างกัน ... ปิดดังนั้น
Laikoni

5

C, 114 84 ไบต์

-20 ไบต์สำหรับการไม่คำนวณความยาว

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

ยอมรับอาร์เรย์ของตัวชี้ถ่านและต้องการให้รายการสุดท้ายเป็นตัวชี้ null (ดูการใช้งาน)

Ungolfed และการใช้งาน:

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

ไม่อนุญาตให้ใช้งาน printf / sprintf : D คุณจะชนะค่อนข้างไบต์
Walfrat

@ Walrat โดยไม่ต้องพิมพ์โดยตรงฉันจำเป็นต้องจัดสรรสตริงดังนั้นวิธีนี้สามารถบันทึกอะไร
Karl Napf

ก่อนหน้าการแก้ไขที่คุณเพิ่ม ++ b และลบการคำนวณความยาวดังนั้นใช่ไม่สามารถทำงานได้อีกต่อไป
Walfrat

@Walfrat ใช่ แต่ฉันมีmallocและreturnก่อนและนี่ก็เป็นเวลานานกว่าเพียงแค่พิมพ์
คาร์ล Napf

5

PHP, 68 67 ไบต์

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

วนซ้ำอาร์กิวเมนต์บรรทัดคำสั่ง -rทำงานด้วย

หลังจากวงใน$fคือ1เมื่อทุกสายเสร็จแล้ว0อื่น (bitwise &casts ""==$cเพื่อ int)
การวนซ้ำถัดไปของลูปภายนอก: คัดลอก$fไปที่$k(บันทึกหนึ่งไบต์จาก$k=0) และสลับ$f:
เมื่อสตริงทั้งหมดเสร็จสิ้น$fอยู่ในขณะนี้falseและลูปจะแตก


ไม่ทำงานกับสตริงอินพุตว่าง ลองดูที่บททดสอบสุดท้าย
aross

@aross: แก้ไขแล้ว ขอบคุณ
ติตัส

4

เรติน่า 13 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

O$#`.
$.%`
¶

ลองออนไลน์!

คำอธิบาย

O$#`.
$.%`

สิ่งนี้ขึ้นอยู่กับเทคนิคการขนย้ายมาตรฐานใน Retina เราจัดเรียง ( O) อักขระทั้งหมดที่ไม่ใช่ linefeed ( .) โดย ( $#) จำนวนอักขระที่อยู่ข้างหน้าพวกเขาในบรรทัดเดียวกัน ( $.%`) คือตำแหน่งแนวนอน

ขั้นตอนที่สองจะทำการลบ linefeeds ออกจากอินพุต


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

Ungolfed:

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

เอาท์พุท:

SIMPLE

PEOPLELESS

บุคคลทั่วไป

Aa1B 2Cc3D E567

", (n. $)?" *

การปรับเปลี่ยนครั้งแรก: การประกาศสตริงที่ผสานเพื่อบันทึกบางไบต์ ลบออกimportมันถูกใช้โดยmain()วิธีการ (ไม่แสดงที่นี่) LinkedListที่ยังจำเป็น ไบต์น้อยลงในการอ้างอิงQueueโดยตรง


เริ่มต้นสตริง s กับสตริง r สามารถประหยัดอีกไม่กี่
Syamesh K

ฉันรู้ว่ามันเกือบหนึ่งปีที่แล้ว แต่คุณสามารถเล่นกอล์ฟได้สองสามไบต์: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 ไบต์

แข็งแรงเล่นกอล์ฟ

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

ฟังก์ชั่นไม่ระบุชื่อที่ใช้อาร์เรย์ของสตริง

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้ แต่มันเร็วเกินไป ในการทำซ้ำแต่ละครั้งเราจะคว้าตัวอักษรที่ i จากแต่ละสตริงที่กำหนดและต่อท้ายสตริงสุดท้ายของเราทีละตัว PHP แค่ส่งคำเตือนถ้าเราเข้าถึงบิตของสตริงที่ไม่มีอยู่ดังนั้นก็ดี เราหยุดเมื่อไม่มีการเปลี่ยนแปลงหลังจากวนลูปผ่านสตริงทั้งหมดเพียงครั้งเดียว

ฉันรู้สึกว่าการใช้งาน$dสามารถเล่นกอล์ฟได้มากขึ้น แต่มันเร็วเกินไป : P


คุณใส่อาเรย์ของสตริงในอาร์กิวเมนต์เดียวได้อย่างไร?
ติตัส

@Titus ใช่ฉันไม่เคยคิดถึงมันจริงๆ ฉันแค่คิดว่าคุณทำได้
Xanderhall

3

อันที่จริง , 7 6 ไบต์

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! ลองออนไลน์!

แก้ไข: -1 ไบต์ขอบคุณนกกระทุง Teal

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.

คุณไม่สามารถลบ # เพื่อให้มีขนาด 6 ไบต์ได้หรือไม่
นกกระทุงนกเป็ดน้ำ

@Tealpelican Welp, now I'm going to have to dig through all of my old Actually answers and see if I can't change Z♂#Σ to Z♂Σ in all of them. Thanks for the tip :D
Sherlock9

First time looking into the language, it looks so much fun! Glad I could help :))
Teal pelican



2

J, 13 bytes

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

Try it online!

Based on the inspiration for this question.

Another way to do it takes 27 bytes but operates using transpose. Most of the bytes are to handle the automatically added zeroes from padding.

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

Explanation

({~/:)&;#\&.>  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's prohibiting mixed arrays really hurts you here. Try it in APL.
Adám


2

PHP, 63 bytes

Note: uses IBM-850 encoding

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

Run like this:

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

Explanation

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?! Is that a natural encoding for PHP?
Adám

@Adám what do you mean by "natural"? PHP treats bytes in the range 128-255 as text, which is therefore interpreted as a constant. If the constant is undefined, it will be interpreted as a string. It's so I can do ~■ (negated binary 254) instead of "\x1" (binary 1).
aross

1
I see. It isn't that you actually need that codepage, you just need a 254 byte.
Adám

@Adám yes, the codepage just makes it a printable char which is a little less annoying.
aross

Great use of $$!
Titus

2

Python 3, 75 Bytes

I know the other Python one is shorter, but this is the first time I've used map ever in my life so I'm pretty proud of it

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 bytes

Only limitation is the output length. Currently it's 99, but can be easily stretched to 999 (+1 byte).

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

Ungolfed:

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

1

Oracle SQL, 195 bytes

    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)

Takes its input from a table named i with columns a (containing the string) and o (order of the string):

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

Explanation:
We're exploiting CONNECT BY to break up the strings into each of the characters making them up. PRIOR SYS_GUID() being NOT NULL ensures we don't end up stuck in a loop.
We then concatenate the single characters with LISTAGG but we shuffle them around with an ORDER BY clause, ordering them first by their position in the original string and only then by the string they came from.

Not as short as the other answers but SQL isn't really meant as a string manipulation language :)


1

Python 2, 128 96

I was hoping not to have to use 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])

Ungolfed

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

Would appreciate feedback/advice on improving this.
Pureferret


1

R, 73 bytes

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

Try it online!

Explanation: very simple (but verbose), just loop through printing ith character of the jth string. Fortunately, substr returns an empty string if given an out-of-range input.


0

Python, 112 bytes

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
Your formatting is really messed up.. where do you even get x and y from?
Kade

0

Perl 5, 53 bytes

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

Try it online!

Method

Creates a two dimensional array where the number of rows is equal to the length of the longest string and the maximum number of columns is equal to the number of strings. Then output each row of the array without spacing.


0

TXR Lisp, 20 bytes

(opip weave cat-str)

Run:

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 weave function is lazy, so it returns a list, which is why we have to force the result to a string. Being lazy, it can weave infinite sequences. For instance, we can weave the even and odd natural numbers, which are themselves infinite lazy lists:

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 bytes

Solution:

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

Try it online!

Example:

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

Explanation:

Use 2nd-level indexing to pull out indices from 0 to max (length of flattened list) across all input lists. Any indexing beyond the bound of the sub-list will return a null. Flip (rotates 90), flatten, and then pull out the non-null results.

Notes:

  • I cast to integer (i$) so that we get useful nulls, as space () is considered null for a char list which means you cant tell nulls from valid spaces.
  • Also I couldnt get the TIO to work with input (worked fine in the oK repl) so the TIO link includes the "ABCDE"... example.

0

Jq 1.5, 49 bytes

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

Explanation

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

Sample Run

$ 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    

Try it online

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.