Drücken Sie die Rücktaste und geben Sie eine Liste mit Wörtern ein

38

So drücken Sie die Rücktaste und geben die Zeichenfolge erneut ein:

  1. Beginnen Sie mit der ersten Zeichenfolge.
  2. Entfernen Sie die Zeichen am Ende, bis das Ergebnis ein Präfix der zweiten Zeichenfolge ist. (Dies kann 0 Schritte dauern.)
  3. Fügen Sie am Ende Zeichen hinzu, bis das Ergebnis der zweiten Zeichenfolge entspricht. (Dies kann auch 0 Schritte dauern.)

Zum Beispiel sieht der Pfad von fooabcnach so fooxyzaus:

fooabc
fooab
fooa
foo
foox
fooxy
fooxyz

Aufgabe

Wenn Sie eine Liste von Wörtern haben, schreiben Sie ein Programm, das seinen Weg von der leeren Zeichenfolge mit der Rücktaste und erneuter Eingabe zu allen Wörtern in der Liste nacheinander zurück zur leeren Zeichenfolge führt. Alle Zwischenzeichenfolgen ausgeben.

In Anbetracht der Eingabeliste ["abc", "abd", "aefg", "h"]sollte die Ausgabe beispielsweise wie folgt aussehen:

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

h

Regeln

Sie können eine Liste von Zeichenfolgen oder eine einzelne Zeichenfolge mit einem Trennzeichen Ihrer Wahl zurückgeben oder drucken. Sie können optional die ersten und letzten leeren Zeichenfolgen einfügen. Die Eingabe enthält garantiert mindestens ein Wort, und jedes Wort enthält garantiert nur ASCII-Kleinbuchstaben ( a- z). Bearbeiten: Aufeinanderfolgende Zeichenfolgen in der Eingabe stimmen garantiert nicht überein.

Das ist ; kürzester Code in Bytes gewinnt.

Eine Referenzimplementierung in Python 3: Probieren Sie es online aus!

Lynn
quelle
4
@ rahnema1> schreibe ein Programm, das seinen Weg aus der leeren Zeichenkette
zurücktippt
3
Wie wäre die Ausgabe für ["abc","abc"]?
Kritixi Lithos
1
@Emigna Hoppla, das ist genau das, aber in einer Schleife! Also werde ich weitermachen und sagen, dass dies ein Duplikat davon ist.
Lynn
4
@Lynn Es ist nicht genau dasselbe. Das beinhaltet nicht das Erkennen der gemeinsamen Präfixe, es geht immer nur um ein Zeichen.
Martin Ender
6
Testfall:a,abc,abcde,abc,a,abc,abcde
Zgarb

Antworten:

9

Perl, 43 Bytes

42 Byte Code + -nFlags.

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

Um es auszuführen:

perl -nE 'chop$@,say$@while!s/^$@//;s/./say$@.=$&/ge' <<< "abc
abd
aefg
h"
Dada
quelle
dies druckt abc 3 mal
izabera
@izabera Es gab ein Leerzeichen, nachdem abces dreimal gedruckt wurde (aber beim ersten und dritten Mal fehlte das Leerzeichen). Ich habe es entfernt.
Dada
5

Java 8, 144 Bytes

Diese ähnelt der Referenzimplementierung, kombiniert jedoch die beiden whileSchleifen. Es ist ein Lambda-Ausdruck, der einen String[]Parameter akzeptiert .

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

Danksagung

  • -38 Byte dank Lambda-Vorschlag von CAD97
Jakob
quelle
Ist es nicht billiger zu benutzen class Bals interface B? Sie können von einer paketprivaten Klasse ausführen. Erwägen Sie auch, ein Lambda zu verwenden, da Sie Java8 bereits angegeben haben.
CAD97
@ CAD97 interface B{static void mainist kürzer als class B{public static void main.
Kevin Cruijssen
@ CAD97 Ich konnte mir keine Möglichkeit vorstellen, Lambdas dazu zu bringen, aber ich habe erst gestern davon erfahren. Irgendwelche Ideen?
Jakob
1
Ah, ich bin rostig. Sie sollten in der Lage a->{/*your code*/}sein, eine Variable vom Typ zuzuweisen java.util.function.Consumer<String[]>. Ich kann im Moment jedoch nicht testen.
CAD97
1
@JakobCornell Standardmäßig erlaubt PPCG das Einreichen vollständiger Programme oder Funktionen. Für Sprachen mit anonymen Funktionen (Lambda) ist die anonyme Funktion für sich genommen eine akzeptable Antwort (daher müssen Sie die Variable nicht angeben, in der sie gespeichert werden soll). (Obwohl es in Java-Einsendungen höflich ist, den Lambda-Typ
anzugeben
4

Mathematica, 149 Bytes

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]]&
JungHwan min
quelle
3

Retina , 39 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Probieren Sie es online!

Eingabe und Ausgabe sind durch Zeilenvorschub getrennte Listen. Die Ausgabe enthält die führende und die nachfolgende leere Zeichenfolge.

Martin Ender
quelle
3

Jelly , 31 29 26 Bytes

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

Probieren Sie es online!

Wie es funktioniert

⁷;ç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.
Dennis
quelle
2

Haskell , 102 93 91 90 Bytes

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

Die letzte Zeile ist eine anonyme Funktion, die eine Liste von Zeichenfolgen entgegennimmt und zurückgibt. Probieren Sie es online!

Erläuterung

Meine Lösung ist rekursiv. Erstens ?ist es eine Helfer-Infix-Funktion: a?bGibt die ersten length aZeichen von boder das gesamte bif an, adas länger ist. Als nächstes definiere ich eine Infix-Funktion !. Die Idee ist, dass a!x, wo aeine Zeichenkette und xeine Liste von Zeichenketten ist, der Pfad von azur ersten Zeichenkette in erzeugt wird xund zum Ende von zurückkehrt x. In der letzten Zeile definiere ich eine anonyme Funktion, die die leere Zeichenfolge anfügt und dann !auf die leere Zeichenfolge und die Eingabe angewendet wird .

Erklärung von !:

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.
Zgarb
quelle
2

Python 2, 118 107 103 97 93 92 Bytes

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

Die Eingabe erfolgt als ['abc', 'abcdef', 'abcfed']oder als [ "abc", "abcdef", "abcfed"].

Revision 1: -11 Bytes. Dank geht an @xnor für seinen Beitrag zu Python-Golftipps und an @Lynn, der mir den Tipp gegeben hat, und an mich, weil ich schlau bin. Es wurden zwei Änderungen vorgenommen: Anstelle von not s.startswith(i), habe ich verwendet s.find(i), und an Stelle von, habe i!=sich verwendet i>s.

Revision 2: -4 Bytes. Mir wurde klar, dass ich einen wirklich blöden Fehler gemacht habe. Anstatt Einrückungen mit einem oder zwei Tabulatoren zu verwenden, habe ich Einrückungen mit einem oder zwei Tabulatoren verwendet.

Revision 3: -6 Bytes. Wir danken @ mbomb007 für den Vorschlag, die Whiles in eine einzige Zeile zu setzen. Ich habe auch einen Fehler behoben, indem ich zu geändert s.find(i)habe i.find(s).

Revision 4: -4 Bytes. Dank geht an @xnor, um festzustellen, dass ich die Eingabe nicht in einer Variablen speichern musste.

Revision 5: -1 Byte. Ich verdanke dem Verdienst, dass dies ['']dasselbe ist, als [s]wenn ich es dem Input hinzufüge.

HyperNeutrino
quelle
Setzen Sie die whiles jeweils in eine einzelne Zeile. Sie können auch <1anstelle von verwenden not.
mbomb007
Gute Antwort! Es gibt einen netten Tipp von xnor, wie man das vermeidetstartswith .
Lynn
@Lynn Oh, danke für den Link! Ich fand es sehr hilfreich!
HyperNeutrino
@ mbomb007 Es tut mir leid, aber ich verstehe nicht genau, was Sie meinen, wenn Sie das whiles in eine einzelne Zeile setzen. Meinst du gerne while s.find(i):s=s[:-1];print s? Auch danke für den Vorschlag über <1, aber ich habe dank einer von xnors Tipps auf dem Python-Tipps-Thread zu etwas noch Kürzerem gewechselt.
HyperNeutrino
@AlexL. Ja, legen Sie die Weile so.
mbomb007
1

GNU M4, 228 oder 232 Bytes¹

(¹ je nachdem, ob die Datei beendet werden soll dnl\noder nicht - ich bin noch nicht mit Golfspielen und M4 vertraut)

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),$@)')

Zusätzlich könnten 3 Bytes gespart werden, indem das zweite Argument für substrfrom 0durch die leere Zeichenfolge ersetzt wird. Dies würde jedoch viele Warnungen für stderr auslösen.

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

Verwendung:

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

PHP, 116 111 101 83 Bytes

Hinweis: Verwendet die Windows-1252-Codierung.

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

Laufen Sie wie folgt:

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

Erläuterung

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.

Optimierungen

  • 5 Bytes mit gespeichert trim($c^$w,"\0"), um nach Übereinstimmungen mit der Teilzeichenfolge zu suchen $c&&strpos($w,$c)!==0.
  • Speichert 2 Bytes, indem verwendet wird ~ÿ, um eine Zeichenfolge mit einem NUL-Byte anstelle von zu erhalten"\0"
  • 8 Bytes mit $c=$c.ÿ&$wdem Suffix $cfür das nächste Zeichen von gespeichert$w
  • Es wurden massive 18 Byte gespeichert, indem die Logik der beiden inneren Schleifen in einer einzigen Schleife kombiniert wurde
  • Behebung eines Fehlers mit einem Testfall aus den Kommentaren, keine Änderung der Byteanzahl
aross
quelle
1

Batch, 296 291 Bytes

@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

Die Berechnung des gemeinsamen Präfixes war umständlich.

Neil
quelle
0

PHP, 153 Bytes

furchtbar lang :(

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

Laufen Sie mit php -nr '<ode>' <text1> <text2> ....

Titus
quelle
0

JavaScript (ES6), 135 Byte

Interessante Herausforderung! Verbrauch: g(["abc", "abd", "aefg", "h"]). Ich konnte scheinbar keine Bytes speichern, indem ich dies als eine Funktion schrieb, also sind es zwei. Zeilenumbrüche sind nicht in der Byteanzahl enthalten.

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

Ich bin mir sicher, dass dies viel mehr reduziert werden kann. Fügt später eine ungolfed Version hinzu.

Chris M
quelle
0

Javascript, 98 Bytes

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

Port of Jakobs Java-Antwort

SuperStormer
quelle