Backspace-và-gõ lại một danh sách các từ


38

Đây là cách để backspace-and-gõ lại từ chuỗi này sang chuỗi khác:

  1. Bắt đầu từ chuỗi đầu tiên.
  2. Xóa các ký tự ở cuối cho đến khi kết quả là tiền tố của chuỗi thứ hai. (Điều này có thể mất 0 bước.)
  3. Thêm các ký tự ở cuối cho đến khi kết quả bằng chuỗi thứ hai. (Điều này cũng có thể mất 0 bước.)

Ví dụ: đường dẫn từ fooabcđến fooxyztrông giống như:

fooabc
fooab
fooa
foo
foox
fooxy
fooxyz

Bài tập

Đưa ra một danh sách các từ, viết một chương trình backspace-and-retypes theo cách của nó từ chuỗi trống, đến tất cả các từ trong danh sách liên tiếp, trở lại chuỗi trống. Đầu ra tất cả các chuỗi trung gian.

Ví dụ, được đưa ra danh sách đầu vào ["abc", "abd", "aefg", "h"], đầu ra phải là:

a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a

h

Quy tắc

Bạn có thể trả về hoặc in danh sách các chuỗi hoặc một chuỗi với một số dấu phân cách lựa chọn. Bạn có thể tùy ý bao gồm các chuỗi trống ban đầu và cuối cùng. Đầu vào được đảm bảo chứa ít nhất một từ và mỗi từ được đảm bảo chỉ chứa các chữ cái ASCII chữ thường ( a- z). Chỉnh sửa: các chuỗi liên tiếp trong đầu vào được đảm bảo không bằng nhau.

Đây là ; mã ngắn nhất trong byte thắng.

Một triển khai tham chiếu trong Python 3: Dùng thử trực tuyến!


4
@ rahnema1> viết một chương trình backspace-and-retypes theo cách
Kritixi Lithos

3
Làm thế nào đầu ra sẽ được cho ["abc","abc"]?
Kritixi Lithos

1
@Emigna Rất tiếc, đây chính xác là một vòng lặp! Vì vậy, tôi sẽ tiếp tục và nói rằng đây là một bản sao của điều đó.
Lynn

4
@Lynn Nó không hoàn toàn giống nhau. Cái đó không bao gồm nhận ra các tiền tố phổ biến, nó luôn đi xuống một ký tự.
Martin Ender

6
Trường hợp thử nghiệm:a,abc,abcde,abc,a,abc,abcde
Zgarb

Câu trả lời:



9

Perl, 43 byte

42 byte mã + -ncờ.

chop$@,say$@while!s/^$@//;s/./say$@.=$&/ge

Để chạy nó:

perl -nE 'chop$@,say$@while!s/^$@//;s/./say$@.=$&/ge' <<< "abc
abd
aefg
h"

bản in này abc 3 lần
izabera

@izabera Có một khoảng trắng sau khi abckhiến nó được in 3 lần (nhưng thực tế, lần đầu tiên và lần thứ ba là không có khoảng trống). Tôi đã gỡ bỏ nó.
Dada

5

Java 8, 144 byte

Điều này tương tự như việc thực hiện tham chiếu nhưng kết hợp hai whilevòng lặp. Đó là một biểu thức lambda chấp nhận một String[]tham số.

a->{String c="";int l=0,i;for(String w:a)while((i=w.indexOf(c))!=0||!c.equals(w))System.out.println(c=i!=0?c.substring(0,--l):c+w.charAt(l++));}

Bị đánh cắp

a -> {
    String c = "";
    int l = 0, i;
    for (String w : a)
        while ((i = w.indexOf(c)) != 0 || !c.equals(w))
            System.out.println(c = i != 0 ? c.substring(0, --l) : c + w.charAt(l++));
}

Lời cảm ơn

  • -38 byte nhờ đề xuất lambda của CAD97

Nó không rẻ hơn để sử dụng class Bthay vì interface B? Bạn có thể chạy từ một lớp riêng-gói. Ngoài ra, hãy xem xét sử dụng lambda như bạn đã chỉ định Java8.
CAD97

@ CAD97 interface B{static void mainngắn hơn class B{public static void main.
Kevin Cruijssen

@ CAD97 Tôi không thể nghĩ ra cách nào để đưa lambdas vào đây, nhưng tôi chỉ mới biết về chúng ngày hôm qua. Có ý kiến ​​gì không?
Jakob

1
À, tôi đang hoen gỉ. Bạn sẽ có thể làm a->{/*your code*/}, mà sẽ gán cho một biến loại java.util.function.Consumer<String[]>. Tôi không thể kiểm tra tại thời điểm này, tuy nhiên.
CAD97

1
@JakobCornell Theo mặc định PPCG cho phép gửi toàn bộ chương trình hoặc chức năng. Đối với các ngôn ngữ có chức năng ẩn danh (lambda), chính chức năng ẩn danh là một câu trả lời chấp nhận được (do đó bạn không phải bao gồm biến để lưu trữ nó). (Mặc dù trong các bài nộp Java, thật lịch sự khi cung cấp loại lambda.)
CAD97

4

Toán học, 149 byte

Reap[Fold[n=NestWhile;s=StringMatchQ;r=StringReplace;n[k=#2;Sow@r[k,#~~a_~~___:>#<>a]&,n[Sow@r[#,a___~~_:>a]&,#,!s[k,#~~___]&],k!=#&]&,"",#]][[2,1]]&

3

Võng mạc , 39 byte

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

M!&r`.+
%)`\G.
¶$`$&
+`((.*).¶)\2¶\1
$1

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

Đầu vào và đầu ra là các danh sách được phân tách theo dòng. Đầu ra không bao gồm chuỗi rỗng hàng đầu và dấu.


3

Thạch , 31 29 26 byte

⁷œ|;\
ÇṚðfḢṭḟ;ḟ@ḊðÇ}
⁷;ç2\

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

Làm thế nào nó hoạt động

⁷;ç2\           Main link. Argument: A (string array)

⁷;              Prepend a linefeed to A. 
                This is cheaper than prepending an empty string.
  ç2\           Reduce all overlapping pairs by the second helper link.


ÇṚðfḢṭḟ;ḟ@ḊðÇ}  Second helper link. Arguments: s, t (strings)

Ç               Call the first helper link with argument s.
 Ṛ              Reverse the results.
            Ç}  Call the first helper link with argument t.
  ð        ð    Combine everything in between into a dyadic chain, and call it
                with the results to both sides as arguments.
                Let's call the arguments S and T.
   f            Filter; get the common strings of S and T.
    Ḣ           Head; select the first one.
      ḟ         Filterfalse; get the strings in S that do not appear in T.
     ṭ          Tack; append the left result to the right one.
        ḟ@      Filterfalse swap; get the strings in T that do not appear in S.
       ;        Concatenate the results to both sides.
          Ḋ     Dequeue; remove the first string.


⁷œ|;\           First helper link. Argument: s (string)

⁷œ|             Linefeed multiset union; prepend a linefeed to s unless it already
                has a linefeed in it (the first string does).
   ;\           Concatenate cumulative reduce; generate all prefixes of the result.

2

Haskell , 102 93 91 90 byte

(?)=take.length
a!x@(b:c)|a==b=b!c|a/=a?b=a:init a!x|d<-'?':a=a:d?b!x
_!x=x
(""!).(++[""])

Dòng cuối cùng là một hàm ẩn danh, nhận và trả về một danh sách các chuỗi. Hãy thử trực tuyến!

Giải trình

Giải pháp của tôi là đệ quy. Đầu tiên, ?là một hàm trợ giúp của hàm trợ giúp: a?bcung cấp các length aký tự đầu tiên bhoặc toàn bộ bnếu adài hơn. Tiếp theo tôi định nghĩa một hàm infix !. Ý tưởng là a!x, nơi alà một chuỗi và xmột danh sách các chuỗi, tạo ra đường dẫn từ ađến chuỗi đầu tiên trong xvà đệ quy đến đuôi của x. Trên dòng cuối cùng tôi xác định một hàm ẩn danh nối thêm chuỗi trống, sau đó áp dụng !cho chuỗi trống và đầu vào.

Giải thích về !:

a!x@(b:c)        -- a!x, where x has head b and tail c:
  |a==b          -- If a equals b,
    =b!c         -- recurse to x.
  |a/=a?b        -- If a is not a prefix of b,
    =a:          -- produce a and
    init a!x     -- continue with one shorter prefix of a.
  |              -- Otherwise a is a proper prefix of b.
   d<-'?':a      -- Let d be a with an extra dummy element,
    =a:          -- produce a and
    d?b!x        -- continue with one longer prefix of b.
_!x=x            -- If x is empty, return x.

2

Python 2, 118 107 103 97 93 92 byte

s=''
for i in input()+[s]:
 while i.find(s):s=s[:-1];print s
 while i>s:s+=i[len(s)];print s

Đầu vào được đưa ra là ['abc', 'abcdef', 'abcfed'], hoặc là [ "abc", "abcdef", "abcfed"].

Bản sửa đổi 1: -11 byte. Tín dụng gửi tới @xnor cho bài đăng của anh ấy về các mẹo chơi gôn của Python và @Lynn vì đã tìm ra mẹo cho tôi và cho tôi là thông minh. Hai thay đổi đã được thực hiện: Thay vì not s.startswith(i), tôi đã sử dụng s.find(i)và thay vì i!=stôi đã sử dụng i>s.

Bản sửa đổi 2: -4 byte. Tín dụng cho tôi nhận ra tôi đã phạm một sai lầm thực sự ngu ngốc. Thay vì sử dụng thụt lề một tab và hai tab, tôi đã sử dụng thụt lề một không gian và một tab.

Sửa đổi 3: -6 byte. Tín dụng đến @ mbomb007 vì đã đề xuất đặt các khoản tiền trên một dòng. Tôi cũng đã sửa một lỗi bằng cách thay đổi s.find(i)thành i.find(s).

Sửa đổi 4: -4 byte. Tín dụng đến @xnor để nhận ra rằng tôi không cần lưu trữ đầu vào trong một biến.

Sửa đổi 5: -1 byte. Tín dụng cho tôi nhận ra đó ['']là điều tương tự như [s]khi thêm nó vào đầu vào.


Đặt whilemỗi s trên một dòng duy nhất. Ngoài ra, bạn có thể sử dụng <1thay vì not.
mbomb007

Câu trả lời tốt đẹp! Có một mẹo hay của xnor về cách tránhstartswith .
Lynn

@Lynn ơi, cảm ơn vì đường link! Tôi thấy nó thực sự hữu ích!
HyperNeutrino

@ mbomb007 Tôi xin lỗi, tôi không hiểu ý bạn là gì khi đặt whiles trên một dòng duy nhất. Bạn có ý nghĩa như thế while s.find(i):s=s[:-1];print snào? Ngoài ra, cảm ơn về gợi ý về <1, nhưng tôi đã thay đổi thành một thứ thậm chí còn ngắn hơn nhờ một trong những mẹo của xnor về chuỗi mẹo của Python.
HyperNeutrino

@AlexL. Vâng, đặt trong khi đó là như thế.
mbomb007

1

GNU M4, 228 hoặc 232 byte¹

(Tùy thuộc vào việc kết thúc tập tin có dnl\nhay không. Tôi vẫn còn mới đối với cả chơi golf và M4)

define(E,`ifelse(index($2,$1),0,`T($1,$2)',`$1
E(substr($1,0,decr(len($1))),$2)')')define(T,`ifelse($1,$2,,`$1
T(substr($2,0,incr(len($1))),$2)')')define(K,`ifelse($2,,$1,`E($1,$2)K(shift($@))')')define(M,`K(substr($1,0,1),$@)')

Ngoài ra, 3 byte có thể được lưu bằng cách thay thế đối số thứ hai substrtừ 0chuỗi trống, nhưng điều đó sẽ tạo ra rất nhiều cảnh báo trên thiết bị lỗi chuẩn.

Ung dung:

define(erase_til_prefix, `dnl arguments: src dst; prints src and chops one char off of it until src == dst, at which point it calls type_til_complete instead
ifelse(dnl
index($2, $1), 0, `type_til_complete($1, $2)',dnl
`$1
erase_til_prefix(substr($1, 0, decr(len($1))), $2)dnl
')')dnl
define(type_til_complete, `dnl arguments: src dst; types src, does not type `dst' itself
ifelse(dnl
$1, $2, ,dnl
`$1
type_til_complete(substr($2, 0, incr(len($1))), $2)'dnl
)')dnl
define(main_, `dnl
ifelse(dnl
$2, , $1, dnl no arguments left
`erase_til_prefix($1, $2)main_(shift($@))'dnl
)')dnl
define(main, `main_(substr($1, 0, 1), $@)')dnl

Sử dụng:

$ m4 <<<"include(\`backspace-golfed.m4')M(abc, abd, aefg, abcdefg, h)"

1

PHP, 116 111 101 83 byte

Lưu ý: sử dụng mã hóa Windows-1252.

for(;$w=$argv[++$i];)for(;$c!=$w;)echo$c=($c^$c^$w)==$c?$c.ÿ&$w:substr($c,0,-1),~õ;

Chạy như thế này:

php -r 'for(;$w=$argv[++$i];)for(;$c!=$w;)echo$c=($c^$c^$w)==$c?$c.ÿ&$w:substr($c,0,-1),~õ;' -- abc abd aefg h 2>/dev/null
> a
> ab
> abc
> ab
> abd
> ab
> a
> ae
> aef
> aefg
> aef
> ae
> a
>
> h

Giải trình

for(                       # Outer loop.
  ;
  $w=$argv[++$i];          # Loops over the input words.
)
  for(                     # Second inner loop.
    ;
    $c!=$w;                # Loop until the word was output.
  )
    echo $c=
      ($c^$c^$w)==$c?      # Check if last output string is a substring
                           # match with the next word to output.
        $c.ÿ&$w:           # ... If yes, suffix the string with the next
                           # char of the word, and output the result.
        substr($c,0,-1),   # ... If not, remove a char and output.
      ~õ;                  # Output newline.

Tinh chỉnh

  • Đã lưu 5 byte bằng cách sử dụng trim($c^$w,"\0")để kiểm tra sự phù hợp của chuỗi con thay vì $c&&strpos($w,$c)!==0.
  • Đã lưu 2 byte bằng cách sử dụng ~ÿđể tạo ra một chuỗi có byte NUL thay vì"\0"
  • Đã lưu 8 byte bằng cách sử dụng $c=$c.ÿ&$whậu tố $cvới char tiếp theo$w
  • Đã lưu 18 byte lớn bằng cách kết hợp logic của 2 vòng bên trong trong một vòng lặp
  • Đã sửa lỗi với một testcase từ các bình luận, không thay đổi số byte

1

Hàng loạt, 296 291 byte

@echo off
set f=
set t=%1
:t
set f=%f%%t:~,1%
set t=%t:~1%
echo(%f%
if not "%t%"=="" goto t
shift
set t=%1
set s=%f%
set p=
:h
if %s:~,1%==%t:~,1% set p=%p%%t:~,1%&set s=%s:~1%&set t=%t:~1%&goto h
:b
set f=%f:~,-1%
echo(%f%
if not "%f%"=="%p%" goto b
if not "%1"=="" goto t

Tính toán tiền tố phổ biến là cồng kềnh.


0

PHP, 153 byte

dài khủng khiếp :(

for($s=$argv[$k=1];$t=$argv[++$k];){for(;$s>""&&strstr($t,$s)!=$t;$s=substr($s,0,-1))echo"$s
";for($i=strlen($s);$s<$t;$s.=$t[$i++])echo"$s
";echo"$s
";}

Chạy với php -nr '<ode>' <text1> <text2> ....


0

JavaScript (ES6), 135 byte

Thử thách thú vị! Cách sử dụng : g(["abc", "abd", "aefg", "h"]). Tôi dường như không thể lưu bất kỳ byte nào bằng cách viết hàm này thành một hàm, vì vậy nó là hai. Dòng mới không bao gồm trong số byte.

f=a=>console.log(([,...z]=[x,y]=a)[0])||
y?f(a=(x==y.slice(0,-1))?z:([y.match(x)
?x+y[x.length]:x.slice(0,-1),...z])):1;
g=a=>f(['',...a])

Tôi chắc chắn rằng điều này có thể được giảm hơn rất nhiều. Sẽ thêm phiên bản vô chủ sau.


0

Javascript, 98 byte

a=>{c="",l=0;for(w of a)while((i=w.indexOf(c))!=0||c!=w)alert(c=i!=0?c.substring(0,--l):c+w[l++])}

Câu trả lời Java của cảng Jakob

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.