Backspace และพิมพ์รายการคำอีกครั้ง


38

ต่อไปนี้เป็นวิธีการถอยกลับและพิมพ์อีกครั้งจากสตริงหนึ่งไปยังอีกสตริงหนึ่ง:

  1. เริ่มจากสตริงแรก
  2. ลบอักขระที่ท้ายจนผลลัพธ์เป็นส่วนนำหน้าของสตริงที่สอง (ขั้นตอนนี้อาจใช้เวลา 0 ขั้น)
  3. เพิ่มอักขระที่ท้ายจนผลลัพธ์เท่ากับสตริงที่สอง (ขั้นตอนนี้อาจใช้ 0 ขั้นตอนเช่นกัน)

ตัวอย่างเช่นเส้นทางจากfooabcไปยังfooxyzมีลักษณะดังนี้:

fooabc
fooab
fooa
foo
foox
fooxy
fooxyz

งาน

ระบุรายการคำให้เขียนโปรแกรมที่backspace-and-retypesมาจากสตริงที่ว่างไปยังทุกคำในรายการอย่างต่อเนื่องกลับไปที่สตริงว่าง เอาต์พุตสตริงกลางทั้งหมด

ตัวอย่างเช่นเมื่อกำหนดรายการอินพุต["abc", "abd", "aefg", "h"]เอาต์พุตควรเป็น:

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

h

กฎระเบียบ

คุณอาจส่งคืนหรือพิมพ์รายการสตริงหรือสตริงเดี่ยวที่มีตัวคั่นบางตัวเลือก คุณอาจเลือกที่จะรวมสตริงว่างเริ่มต้นและสุดท้าย อินพุตมีการรับประกันว่ามีอย่างน้อยหนึ่งคำและแต่ละคำรับประกันว่าจะมีตัวอักษร ASCII ตัวพิมพ์เล็ก ( a- z) เท่านั้น แก้ไข:สตริงที่ต่อเนื่องกันในอินพุตมีการรับประกันว่าจะไม่เท่ากัน

นี่คือ ; โค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

การใช้งานอ้างอิงใน Python 3: ลองออนไลน์!


4
@ rahnema1> เขียนโปรแกรมที่ backspace-and-retypes มาจากสตริงว่าง
Kritixi Lithos

3
ผลลัพธ์จะเป็น["abc","abc"]อย่างไร
Kritixi Lithos

1
@Emigna โอ๊ะนี่คือสิ่งนั้น แต่อยู่ในวง! ดังนั้นฉันจะไปข้างหน้าและบอกว่านี่เป็นสิ่งที่ซ้ำกัน
ลินน์

4
@ ลินน์มันไม่เหมือนกันทุกประการ อันนั้นไม่รวมถึงการจดจำคำนำหน้าทั่วไปมันจะลงไปที่ตัวละครตัวหนึ่งเสมอ
Martin Ender

6
กรณีทดสอบ:a,abc,abcde,abc,a,abc,abcde
Zgarb

คำตอบ:



9

Perl, 43 ไบต์

42 ไบต์ของรหัสเมือง + -nธง

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

วิธีเรียกใช้:

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

พิมพ์นี้ abc 3 ครั้ง
izabera

@izabera มีช่องว่างหลังจากabcทำให้พิมพ์ 3 ครั้ง (แต่จริงๆแล้วเป็นครั้งแรกและครั้งที่สามที่ไม่มีช่องว่าง) ฉันลบมัน
Dada

5

Java 8, 144 ไบต์

อันนี้คล้ายกับการใช้งานอ้างอิง แต่รวมทั้งสองwhileลูป มันเป็นนิพจน์แลมบ์ดาที่ยอมรับString[]พารามิเตอร์

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

Ungolfed

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

กิตติกรรมประกาศ

  • -38 ไบต์ขอบคุณคำแนะนำแลมบ์ดาของ CAD97

ไม่ถูกกว่าการใช้class Bแทนinterface Bใช่ไหม คุณสามารถเรียกใช้จากคลาสแพคเกจส่วนตัว ลองพิจารณาใช้แลมบ์ดาตามที่คุณระบุ Java8 แล้ว
CAD97

@ CAD97 สั้นกว่าinterface B{static void main class B{public static void main
Kevin Cruijssen

@ CAD97 ฉันไม่สามารถคิดวิธีนำลูกแกะมาสู่ที่นี่ได้ แต่ฉันเพิ่งเรียนรู้เกี่ยวกับพวกเขาเมื่อวานนี้ ความคิดใด ๆ
Jakob

1
อาฉันเป็นสนิม คุณควรจะสามารถที่จะทำซึ่งจะกำหนดให้กับตัวแปรประเภทa->{/*your code*/} java.util.function.Consumer<String[]>อย่างไรก็ตามฉันไม่สามารถทดสอบได้ในขณะนี้
CAD97

1
@JakobCornell โดยค่าเริ่มต้น PPCG อนุญาตให้ส่งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ สำหรับภาษาที่มีฟังก์ชั่นที่ไม่ระบุชื่อ (แลมบ์ดา) ฟังก์ชั่นที่ไม่ระบุชื่อเป็นของตัวเองเป็นคำตอบที่ยอมรับได้ (ดังนั้นคุณไม่จำเป็นต้องรวมตัวแปรเพื่อจัดเก็บไว้) (แม้ว่าในการส่งจาวาก็มีความสุภาพที่จะจัดหาแลมบ์ดาชนิดนี้)
CAD97


3

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

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

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

ลองออนไลน์!

อินพุตและเอาต์พุตเป็นรายการที่คั่นด้วย linefeed เอาท์พุทรวมถึงสตริงว่างชั้นนำและต่อท้าย


3

เยลลี่ , 31 29 26 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

⁷;ç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 ไบต์

(?)=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
(""!).(++[""])

บรรทัดสุดท้ายคือฟังก์ชันที่ไม่ระบุตัวตนซึ่งรับและส่งคืนรายการสตริง ลองออนไลน์!

คำอธิบาย

ทางออกของฉันซ้ำ ครั้งแรก?เป็นฟังก์ชั่นผู้ช่วยมัด: a?bให้length aตัวอักษรตัวแรกของbหรือทั้งหมดbถ้าaมีความยาว !ต่อไปฉันกำหนดฟังก์ชั่นมัด แนวคิดก็คือว่าa!xที่aเป็นสตริงและxรายการของสตริงที่ผลิตจากเส้นทางaที่จะสายแรกในxและ recurses xถึงหางของ ในบรรทัดสุดท้ายฉันกำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ผนวกสตริงว่างจากนั้นนำ!ไปใช้กับสตริงว่างและการป้อนข้อมูล

คำอธิบายของ!:

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 ไบต์

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

การป้อนข้อมูลจะได้รับเป็น['abc', 'abcdef', 'abcfed']หรือเป็น "abc", "abcdef", "abcfed"][

รุ่นที่ 1: -11 ไบต์ เครดิตไปที่ @xnor สำหรับโพสต์ของเขาบนเคล็ดลับการเล่นกอล์ฟ Python และไปที่ @Lynn เพื่อค้นหาคำแนะนำสำหรับฉันและสำหรับฉันที่ฉลาด สองการเปลี่ยนแปลงที่ทำ: แทนที่จะnot s.startswith(i)ผมใช้s.find(i)และแทนที่จะผมใช้i!=si>s

รุ่นที่ 2: -4 ไบต์ เครดิตไปหาฉันโดยที่ฉันรู้ตัวว่าฉันทำผิดพลาดจริง ๆ แทนที่จะใช้การเยื้องแบบแท็บเดี่ยวและสองแท็บฉันใช้การเว้นวรรคแบบเดี่ยวและแบบแท็บเดียว

รุ่นที่ 3: -6 ไบต์ เครดิตไปที่ @ mbomb007 เพื่อแนะนำให้ใส่ whiles ในบรรทัดเดียว ฉันยังแก้ไขข้อบกพร่องโดยการเปลี่ยนไปs.find(i)i.find(s)

รุ่นที่ 4: -4 ไบต์ เครดิตไปที่ @xnor เพื่อรับรู้ว่าฉันไม่จำเป็นต้องเก็บข้อมูลไว้ในตัวแปร

รุ่นที่ 5: -1 ไบต์ เครดิตไปถึงฉันสำหรับการตระหนักว่า['']เป็นสิ่งเดียวกับ[s]เมื่อเพิ่มลงในอินพุต


วางwhileแต่ละอันไว้ในบรรทัดเดียว นอกจากนี้คุณยังสามารถใช้แทน<1 not
mbomb007

คำตอบที่ดี! มีเคล็ดลับดีโดย XNOR เกี่ยวกับวิธีการคือหลีกเลี่ยง startswith
ลินน์

@ ลินน์โอ้ขอบคุณสำหรับลิงค์! ฉันพบว่ามันมีประโยชน์จริง ๆ !
HyperNeutrino

@ mbomb007 ฉันขอโทษฉันไม่ได้รับสิ่งที่คุณหมายถึงโดยการวางwhileสายในบรรทัดเดียว คุณหมายถึงชอบwhile s.find(i):s=s[:-1];print s? นอกจากนี้ขอขอบคุณสำหรับข้อเสนอแนะเกี่ยวกับ<1แต่ฉันได้เปลี่ยนเป็นบางสิ่งบางอย่างที่สั้นลงขอบคุณคำแนะนำของ xnor ในเธรดเคล็ดลับ Python
HyperNeutrino

@AlexL ใช่ใส่ในขณะนั้น
mbomb007

1

GNU M4, 228 หรือ 232 ไบต์¹

(¹ขึ้นอยู่กับว่าจะจบไฟล์ด้วยdnl\nหรือไม่ - ฉันยังใหม่กับทั้งการเล่นกอล์ฟและ 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),$@)')

นอกจากนี้ 3 ไบต์สามารถบันทึกได้โดยแทนที่อาร์กิวเมนต์ที่สองสำหรับsubstrจาก0เป็นสตริงว่าง แต่จะสร้างคำเตือนจำนวนมากบน stderr

Ungolfed:

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

การใช้งาน:

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

1

PHP, 116 111 101 83 ไบต์

หมายเหตุ: ใช้การเข้ารหัส Windows-1252

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

ทำงานแบบนี้:

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

คำอธิบาย

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.

การปรับแต่ง

  • ที่บันทึกไว้ 5 ไบต์โดยใช้trim($c^$w,"\0")เพื่อตรวจสอบ substring $c&&strpos($w,$c)!==0แข่งขันแทน
  • บันทึก 2 ไบต์โดยใช้~ÿเพื่อสร้างสตริงที่มี NUL ไบต์แทน"\0"
  • บันทึก 8 ไบต์โดยใช้$c=$c.ÿ&$wเพื่อต่อท้าย$cด้วยอักขระถัดไปของ$w
  • บันทึกขนาดใหญ่ถึง 18 ไบต์ด้วยการรวมตรรกะของวงในทั้งสองเข้าด้วยกันในวงเดียว
  • แก้ไขข้อบกพร่องด้วย testcase จากความคิดเห็นไม่มีการเปลี่ยนแปลงจำนวนไบต์

1

รุ่นที่296 291 ไบต์

@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

การคำนวณคำนำหน้าทั่วไปนั้นยุ่งยาก


0

PHP, 153 ไบต์

ยาวมาก :(

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

php -nr '<ode>' <text1> <text2> ...ทำงานด้วย


0

JavaScript (ES6), 135 ไบต์

ความท้าทายที่น่าสนใจ! การใช้งาน: g(["abc", "abd", "aefg", "h"]). ฉันดูเหมือนจะไม่สามารถบันทึกไบต์ใด ๆ โดยการเขียนนี้เป็นฟังก์ชั่นเดียวดังนั้นมันเป็นสอง บรรทัดใหม่ไม่รวมอยู่ในจำนวนไบต์

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

ฉันแน่ใจว่าสิ่งนี้สามารถลดได้มากขึ้น จะเพิ่มเวอร์ชันที่ไม่อัปโหลดในภายหลัง


0

Javascript, 98 ไบต์

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++])}

คำตอบของพอร์ตของจาคอบ

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