Cùng điền vào chỗ trống


11

Đưa ra một đầu vào của hai chuỗi với chuỗi các dấu gạch dưới đại diện cho các từ tương ứng, xuất ra các câu với "khoảng trống" được điền vào.

Cách tốt nhất để mô tả thách thức này là ví dụ. Đây là một ví dụ đầu vào:

programming _____________ and code golf
programming puzzles ______ code ____

Và đây là đầu ra tương ứng:

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

Đối với mục đích của thử thách này, một "từ" được định nghĩa là một chuỗi gồm một hoặc nhiều chữ cái viết thường và "trống" được định nghĩa là một hoặc nhiều dấu gạch dưới (đầu vào sẽ luôn chỉ chứa các chữ cái viết thường, dấu cách và dấu gạch dưới) . Các từkhoảng trống trong các chuỗi đầu vào được phân tách bằng các khoảng trắng đơn và tổng số lượng từkhoảng trống trong các câu sẽ luôn bằng nhau.

Mục tiêu của thử thách là lấp đầy tất cả các khoảng trống bằng các từ đúng , đó là các từ chiếm cùng một chỉ mục trong chuỗi khác khi được phân tách bằng khoảng trắng.

  • Từ này phải được tập trung vào chỗ trống, như được hiển thị với từ "câu đố" trong ví dụ ở trên, một số dấu gạch dưới bằng nhau vẫn còn ở hai bên.

  • Nếu từ không thể được căn giữa chính xác, dấu gạch dưới có thể đi ở bên trái hoặc bên phải (ví dụ: từ "và" trong ví dụ trên).

  • Sẽ luôn có đủ dấu gạch dưới cho từ phù hợp, nhưng có thể có chính xác bằng độ dài của từ (ví dụ: từ "golf" trong ví dụ trên).

  • Sẽ không bao giờ có một khoảng trống ở cùng một vị trí trong cả hai chuỗi.

Đầu vào / đầu ra có thể là một trong những điều sau đây (đầu vào / đầu ra không nhất thiết phải thông qua cùng một phương thức):

  • một chuỗi được phân tách bằng bất kỳ ký tự nào không phải là chữ cái, dấu cách hoặc dấu gạch dưới (ví dụ: chuỗi mới hoặc chuỗi được phân tách bằng dấu phẩy)

  • một mảng / danh sách / vv. của hai chuỗi

  • hai đối số dòng lệnh / hàm (chỉ nhập)

Vì đây là , mã ngắn nhất tính bằng byte sẽ giành chiến thắng.

Ví dụ trên có thể được sử dụng như một trường hợp thử nghiệm. Dưới đây là trường hợp thử nghiệm lớn hơn (chuỗi thứ hai trong đầu ra có thể thay đổi đôi chút do hành vi định tâm khác nhau):

lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum

lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

Thử thách hai chiều đẹp.
Rɪᴋᴇʀ

Câu trả lời:


5

Bình thường, 30

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q

Lấy đầu vào và đầu ra dưới dạng danh sách hai chuỗi. Sử dụng một phương pháp chia tách cơ bản khá tốt, chia sẻ bản đồ đôi.

Hãy thử nó ở đây

Mở rộng:

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q   ##
                          cR;Q   ##  split
                         C       ##  zip
    mm                           ##  double map
      |*}J\_k.[lkhx#JdJkd        ##  centre
   C                             ##  zip
jL;                              ##  join

Tôi sẽ giải thích thêm một lần nữa, tôi thực sự hài lòng rằng tôi không thể đánh gôn thêm nữa, mặc dù nó khá rõ ràng, do tính phổ biến của cách tiếp cận chia tách zip zip đôi và trung tâm.


8
Ahhh, cách tiếp cận cổ điển tách-zip-đôi-trung tâm-zip-tham gia. Tôi thích nhớ nó đang được sử dụng như một ví dụ giới thiệu trong bài giảng Thuật toán 101 của tôi.
Martin Ender

3
@ MartinBüttner Vâng, tôi có một số ký ức tồi tệ về nó bởi vì tôi đã ngủ qua lớp đó, phải giải quyết các vấn đề trong bài kiểm tra bằng cách sử dụng phương pháp tiếp cận trùng lặp-append-lookback-match-add-centre.
FryAmTheEggman

4
Tôi sẽ đi bôi một ít nước lạnh vào vết bỏng.
Martin Ender

7

Võng mạc , 102 100 93 88 byte

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

$
!¶$`
m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2
(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Các chuỗi sẽ được phân tách bằng một nguồn cấp. Nếu có một số lẻ các dấu gạch dưới còn lại, số không liên quan sẽ nằm sau từ.

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

Giải trình

Tôi đoán đây là "cách tiếp cận trùng lặp-append-lookback-match-add-centre", hoặc một cái gì đó gần gũi ...

$
!¶$`

Chúng tôi bắt đầu bằng cách sao chép đầu vào (được phân tách bằng một !và một nguồn cấp dữ liệu). Mục đích của việc này là sau đó chúng ta có thể xử lý cả hai dòng bằng cách tìm nạp các từ từ dòng tiếp theo (thay vì phải xử lý riêng dòng thứ hai).

m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2

Điều này chuẩn bị từ đúng cho mỗi khoảng cách. Chúng tôi bắt đầu bằng cách đếm vị trí từ hiện tại với lookbehind (?<=^(\w+ )*)(vị trí được lưu trữ dưới dạng độ sâu của nhóm 1). Sau đó, lookahead a) đảm bảo rằng ta đang ở đầu một khoảng cách bằng phù hợp _, sau đó bỏ qua để dòng tiếp theo với .*¶, phù hợp với số lượng chính xác của các từ có (?<-1>\w+ )*để đến đúng vị trí, và sau đó phù hợp với từ tìm thấy ở đó với (\w+)thành nhóm 2.

(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Giai đoạn này thực hiện ba điều:

  • Nó loại bỏ các dấu gạch dưới tương ứng với mỗi độ dài từ. Này được thực hiện bằng cách đếm chiều dài từ vào nhóm 2với ([a-z])+và sau đó phù hợp với nhiều dấu gạch dưới (mà không bao giờ được viết lại).
  • Nó chuyển từ này đến trung tâm của khoảng trống bằng cách bắt một nửa số dấu gạch dưới còn lại (_*)\3và viết $3$1$3lại.
  • Nó loại bỏ đầu vào trùng lặp bằng cách khớp !\D+và thay thế nó bằng không có gì.

4

Con trăn 2, 109

def f(a,b):exec"print' '.join([x,y][x<'`'].center(len(x),'_')for x,y in zip(a.split(),b.split()));a,b=b,a;"*2

Hàm lấy hai chuỗi làm đối số và in đầu ra như trong các ví dụ. Nó sử dụng một cách tiếp cận nhàm chán, với str.center(width, fillchar)hầu hết các công việc.

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


1
Tôi không nghĩ bạn cần z, trừ khi tôi thiếu thứ gì đó, bạn chỉ có thể thực hiện trao đổi sau khi in và nội tuyến z.
FryAmTheEggman

@FryAmTheEggman vâng, bạn nói đúng. Cảm ơn :)
grc

2

Ruby, 111 109 ký tự

->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_
c}.transpose.map{|s|s*' '}}

Đầu vào: mảng 2 chuỗi; đầu ra: mảng 2 chuỗi.

Chạy mẫu:

2.1.5 :001 > puts ->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_;c}.transpose.map{|s|s*' '}}[[
2.1.5 :002 >       'programming _____________ and code golf',
2.1.5 :003 >       'programming puzzles ______ code ____',
2.1.5 :004 >       ]]
programming ___puzzles___ and code golf
programming puzzles _and__ code golf

1

JavaScript, 194 185 byte

f=(m,n)=>(m=m.split` `,n=n.split` `,G=(x,i,a)=>x[0]!='_'?x:(b=(a?n:m)[i],s=x.length-b.length,(k='_'.repeat(s/2))+b+k+(s%2?'_':'')),H=(e,y)=>e.map((x,i)=>G(x,i,y)).join` `,[H(m,1),H(n)])

Lấy hai chuỗi làm tham số và xuất ra hai chuỗi dưới dạng mảng / danh sách


1

Toán học 223

Phải có một cách ngắn hơn để làm điều này.

k=StringLength;m=StringSplit;
g=Partition[Riffle[m@#,m@#2],2]/.{{a_,a_}:> a<>" ",{a_,b_/; StringTake[b,1]=="_"}:> a<>" ",
{a_,b_}:>Table["_",Ceiling[z=(k@a-k@b)/2]]<>b<>""<>Table["_",Floor@z]<>" "}&;
s_~h~t_:={""<>g[s,t],""<>g[t,s]}

Chạy mẫu

h["programming _____________ and code golf", "programming puzzles ______ code ____"]

nhập mô tả hình ảnh ở đây


0

Gema, 208 203 ký tự

\B=@set{i;0}
<I>=@push{${v;f};$0}@incr{i}
\n=@set{v;s}@set{i;0}
 =
\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S

Chỉ vì Gema có chức năng hoàn hảo cho nhiệm vụ này : .@fill-center{background;value}

Đầu vào: 2 dòng mới tách dòng (không có dòng mới cuối cùng); đầu ra: 2 dòng phân tách dòng mới (có dấu cách - dường như không bị cấm).

Chạy mẫu:

bash-4.3$ echo -ne 'programming _____________ and code golf\nprogramming puzzles ______ code ____' |
> gema '\B=@set{i;0};<I>=@push{${v;f};$0}@incr{i};\n=@set{v;s}@set{i;0}; =;\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S'
programming ___puzzles___ and code golf 
programming puzzles _and__ code golf 

0

C, 197 byte

#define c(w,y)l=strspn(w,"_"),r=strcspn(y," "),memcpy(w+(l-r)/2,y,r),w+=l,y+=r;
main(l,v,w,y,r)char**v,*w,*y;{for(w=v[1],y=v[2];*w;w++,y++)if(*w^*y)if(*w^95)c(y,w)else c(w,y)puts(v[1]);puts(v[2]);}

Đầu ra

$ ./a.out "lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum" "lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum"
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

0

ES6, 122 byte

a=>a.map(s=>s.split` `).map((s,n,a)=>s.map((w,i)=>w<'a'?(l=w.length,t=w+a[n^1][i]+w,t.substr(t.length-l>>1,l)):w).join` `)

Lấy một mảng gồm hai chuỗi dưới dạng một tham số và trả về một mảng khác của hai chuỗi.

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.