Mach mir eine schlechte Fade-Animation ... bitte

15

Ihre Aufgabe ist es, wie der Titel diskret andeutet, aus einem Wort eine schlechte Fade-Animation zu machen, die sich in ein zweites Wort für Sie verwandelt.

Was genau ist diese "Fade-Animation", die Sie vielleicht fragen?

Um eine spektakuläre (ziemlich schlechte) Fade-Animation zu erstellen, verwenden Sie zwei Zeichenfolgen, die nur druckbare ASCII-Zeichen enthalten. Sie beginnen, indem Sie Ihre Startzeichenfolge (die erste der beiden) drucken. Anschließend wählen Sie zufällig ein Zeichen im ursprünglichen Wort aus und ändern es in das entsprechende Zeichen im Wort, zu dem Sie animieren möchten. Wenn die Wörter ungleich lang sind, müssen Sie sie mit Leerzeichen auffüllen.

Sie machen so weiter, bis alle Zeichen geändert wurden, aber Sie werden das Zeichen an einem bestimmten Index nicht mehr als einmal ändern . Hier ist ein Beispiel I / O:

Hey -> Peeps
Hey    # original string
Hey s  # replace char at index 4
Hey s  # replace char at index 1
Pey s  # replace char at index 0
Pee s  # replace char at index 2
Peeps  # replace char at index 3

Sie müssen eine Funktion oder ein vollständiges Programm schreiben, das einen Buchstaben ändert, und dann die neue Zeichenfolge in Schritten von einer Sekunde drucken. Das Eingabeformat ist locker, aber das Ausgabeformat ist streng.

Das ist , also gewinnt der kürzeste Code in Bytes.

Einige Testfälle (Formular:) init -> final:

Stringy -> Blingy
Banana -> Republic
United -> States
Make America -> Tissue box
I like walls -> I have small hands
Hello, -> world!

Referenzimplementierung in Python 2:

import random
import time
def F(c,f):
    print c                                      # before we do stuff
    if len(c)>len(f):f+=" "*(len(c)-len(f))      # add padding part 1
    if len(f)>len(c):c+=" "*(len(f)-len(c))      # add padding part 2
    c, f = list(c), list(f)
    ai = [i for i in range(len(c))]              # a list for keeping track 
    while len(ai) > 0:                           #  of available indices
        time.sleep(1)                            # 1 second pause...
        i = ai.pop(random.randint(0,len(ai)-1))  # get a random index and remove
        c[i] = f[i]                              #   it from the list
        print ''.join(c)                         # print the new string
Daniel
quelle
Ich glaube nicht, dass der Python-Code gültig ist? Weil du unkommentierte Kommentare hast?
Conor O'Brien
Irgendeine Beschränkung der Zeichenkettenlänge?
Titus
@ ConorO'Brien, oh yeah .... oops: p
Daniel
@ Titus, alles, was deine Sprache kann, denke ich
Daniel

Antworten:

5

MATL , 33 Bytes

cn2/XKZ@!Oyhg*XR"GcK:@mK:Eq+)D1Y.

Probieren Sie es bei MATL Online aus . Möglicherweise müssen Sie die Seite aktualisieren und erneut auf "Ausführen" klicken, wenn dies nicht funktioniert.

Alternativ löscht diese Version ( 35 Bytes ) den Bildschirm, bevor jeder neue String angezeigt wird, was dazu führt, dass die Ausgabe "an Ort und Stelle geändert" wird:

Luis Mendo
quelle
Hat das die eine Sekunde Pause? Es läuft nicht auf meinem Handy.
Daniel
@Dopapp Ja, das Finale 1Y.ist die Pause innerhalb der Schleife. Es funktioniert für mich von meinem Computer mit Chrome
Luis Mendo
@Dopapp Welches Betriebssystem verwenden Sie?
Suever
@ Suever, iOS 9.
Daniel
1
@Dopapp Wir arbeiten noch an einigen Problemen. Lassen Sie uns wissen, wenn Sie weitere haben.
Suever
2

Perl, 131 + 4 ( -F -l) = 135 Byte

@T=@F if!$i++}$T[$_]||=$",$F[$_]||=$"for 0..$#F,0..$#T;say@T;{$==rand@T;redo if$h{$=}++;$T[$=]=$F[$=];sleep 1;say@T;redo if++$v!=@T

Needs -Fund -lFlags laufen, sowie -M5.010(oder -E). Beachten Sie, dass Sie, wenn Ihre Version von Perl ein bisschen alt ist, -anIhre Befehlszeile hinzufügen müssen (die ich zu unten anfügen werde, um sie anzuzeigen, aber sie wird nicht benötigt). Zum Beispiel :

$ cat fade.pl
@T=@F if!$i++}$T[$_]||=$",$F[$_]||=$"for 0..$#F,0..$#T;say@T;{$==rand@T;redo if$h{$=}++;$T[$=]=$F[$=];sleep 1;say@T;redo if++$v!=@T
$ perl -F -anl -M5.010 fade.pl <<< "Hey
Peeps"
Hey  
Pey  
Pee  
Pee s
Pee s
Peeps

Ich bin mir ziemlich sicher, dass dies kürzer sein könnte, aber ich konnte nicht herausfinden, wie ... noch! Trotzdem halte ich dies nicht für eine schlechte Antwort und hoffe, dass jemand dazu inspiriert wird, sie zu verkürzen (oder eine ganz andere Idee zu haben!).

Dada
quelle
2

Python 2, 171 169 168 163 Bytes

import time,random as r
def f(a,b):
 d=len(a)-len(b);a+=' '*-d;b+=' '*d;o=range(len(a));r.shuffle(o);print a
 for i in o:time.sleep(1);a=a[:i]+b[i]+a[i+1:];print a

Testfälle sind auf ideone

Jonathan Allan
quelle
2

C # 299 Bytes

void f(string a,string b){var m=Math.Max(a.Length,b.Length);var t=new Collections.Generic.HashSet<int>();while(t.Count<m)t.Add(new Random().Next()%m);var s=a.PadRight(m).ToCharArray();Console.WriteLine(s);foreach(var x in t){Threading.Thread.Sleep(1000);s[x]=b.PadRight(m)[x];Console.WriteLine(s);}}

Ungolfed

void f(string a, string b)
{
    var m = Math.Max(a.Length, b.Length);
    var t = new Collections.Generic.HashSet<int>();
    while(t.Count < m) t.Add(new Random().Next()%m);
    var s=a.PadRight(m).ToCharArray();

    Console.WriteLine(s);
    foreach (var x in t)
    {
        Threading.Thread.Sleep(1000);
        s[x] = b.PadRight(m)[x];
        Console.WriteLine(s);
    }
}
pinkfloydx33
quelle
2

Perl, 109 108 99 Bytes

Beinhaltet +3 für -n

Gib Strings auf STDIN ohne letzte Newline

echo -n "Make -> Tissue box" | perl -M5.010 fade.pl

fade.pl:

#!/usr/bin/perl -n
/ -> /;$_=$`^$`^$'^$';{$==rand(y/\x00//)+sleep say+($`&~$_|$'&$_)=~y/\x00/ /r;s%(.*?\K\x00){$=}%\xff%&&redo}

Funktioniert wie abgebildet, wird jedoch \xhhdurch die Buchstaben ersetzt, um die angeforderte Punktzahl zu erhalten.

Diese Art der Nutzung \Kist meiner Meinung nach neu ...

Tonne Hospel
quelle
Super, wie immer! Ich habe eine Weile gebraucht, um herauszufinden, wie das funktioniert! Nizza Verwendung in der \KTat. Beachten Sie, dass \0Ihr Code zwei enthält und \xffdass diese durch die entsprechenden Literalzeichen ersetzt werden können, sodass die Anzahl der Bytes 108 beträgt. Vielleicht haben Sie es auch nicht gesehen, aber das Eingabeformat ist frei, also wahrscheinlich Etwas Sortierbareres als "->" als Trennzeichen.
Dada
@Dada Ah richtig. Vielen Dank. Während der Entwicklung verwende ich niemals die wörtlichen Zeichen, daher kann es leicht passieren, dass beim Anpassen der Byteanzahl Dinge übersehen werden. Ein anderes Trennzeichen kann zwar bis zu 3 Byte groß werden, aber es ist eine uninteressante Änderung. Ich lasse es einfach
Ton Hospel,
Ja natürlich. Ich erzähle nicht alle Ihre Lösungen, sondern nur, wenn ich mit ihnen experimentiere, und in diesem Fall habe ich diese 4 Bytes gesehen, die Sie nicht hätten zählen sollen;)
Dada
1

Python 3, 214 Bytes

import time,random
o,f=list(input()),list(input())
F=len(f);O=len(o);o+=[" "]*(F-O);f+=[" "]*(O-F);p=-1;l=[p]
while o!=f:
 while p in l:p=random.randrange(max(F,O))
 l+=[p];o[p]=f[p];print(''.join(o));time.sleep(1)

Ideone es!

Beta-Zerfall
quelle
0

Java, 456 454 437 428 Bytes

import java.util.*;public class c{public static void main(String[]s)throws Exception{char[]a=s[0].toCharArray(),b=s[1].toCharArray();int l,j=0;if(a.length<b.length){l=b.length;a=Arrays.copyOf(a,l);}else{l=a.length;b=Arrays.copyOf(b,l);}Vector i=new Vector();for(;j<l;i.add(j++));System.out.println(s[0]);while(l>0){Thread.sleep(1000);j=(int)i.remove(new Random().nextInt(l--));a[j]=b[j];System.out.println(String.valueOf(a));}}}

Ungolfed:

import java.util.*;

public class c
{

public static void main(String[] s) throws Exception
{
    char[] a = s[0].toCharArray(), b = s[1].toCharArray();
    int l, j = 0;
    if (a.length < b.length)
    {
        l = b.length;
        a = Arrays.copyOf(a, l);
    }
    else
    {
        l = a.length;
        b = Arrays.copyOf(b, l);
    }

    Vector i = new Vector();

    for (; j < l; i.add(j++));

    System.out.println(s[0]);

    while (l > 0)
    {
        Thread.sleep(1000);
        j = (int) i.remove(new Random().nextInt(l--));
        a[j] = b[j];
        System.out.println(String.valueOf(a));
    }
}
}

Edit: minus 2 Byte von CAD97

Edit: minus 17 Byte von Kevin Cruijssen (Ich habe den Vorschlag leicht geändert, indem ich ihn wiederverwendete, janstatt eine neue Variable xzu erstellen , um die Größe zu halten)

Edit: minus 9 Byte

ortis
quelle
Sie haben unnötige Leerzeichen in Ihren beiden Arrays::copyOfAnrufen
CAD97
Wie @ CAD97 bereits sagte, können Sie einige unnötige Leerzeichen entfernen. auch bei den Arrays: String[]sund char[]a. Sie können auch Ihre erste For-Loop spielen for(;j<l;i.add(j++);:; Sie können entfernen Random r=new Random();und verwenden Sie es direkt: new Random().nextInt(i.size()); Sie können auch ,xdie Liste der Ints erweitern und die while-Schleife zu while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}und es gibt wahrscheinlich mehr zu Golf, die ich vermisse.
Kevin Cruijssen
0

PHP, 123 121 Bytes

<?=$a=$argv[1];for($b=str_split(str_pad($argv[2],strlen($a)));$b;print"
$a"){$a[$i=array_rand($b)]=$b[$i];unset($b[$i]);}

als Datei speichern, mit php <filename> <string1> <string2>(oder php-cgi) ausführen

Nervenzusammenbruch

<?=$a=$argv[1];                         // 0. print original
for(
    $b=str_split(                       // 2. split to array of single characers
        str_pad($argv[2],strlen($a))    // 1. pad 2nd argument to length of 1st argument
    );
    $b;                                 // 3. while $b has characters left
    print"\n$a"                         // 6. print altered string
){
    $a[$i=array_rand($b)]=$b[$i];       // 4. pick random index from $b, copy character to $a
    unset($b[$i]);                      // 5. remove character from $b
}
Titus
quelle
0

CJam, 44 Bytes

q~{_,@\Se]s}2*1$peemr{es{_es-zA3#<}g;~t_p}/;

Erläuterung:

q~                                            get input
  {_,@\Se]s}2*                                pad each string to the length of the other
              1$p                             print starting string
                 eemr{                   }/   for each randomly shuffled enum of target string
                      es{_es-zA3#<}g;         1 second waiting loop    
                                     ~t_p     replace one character and print new string
                                           ;  clear stack

Die Verzögerung funktioniert nur mit dem Java-Interpreter, nicht mit dem Online-Interpreter.

 java -jar cjam.jar badfade.cjam <<< '"banana" "republic"'

Online ausprobieren (Verzögerung auf 1 ms eingestellt)

Neorej
quelle
0

JavaScript (ES6) + HTML, 210 Byte

s=>e=>{s=[...s],e=[...e],d=e[k="length"]-s[k],(d>0?s:e).push(..." ".repeat(d>0?d:-d)),a=[...e.keys()],u=_=>{O.value=s.join``,s[i=a.splice(Math.random()*a[k]|0,1)[0]]=e[i],i+1&&setTimeout(u,1e3)},u()}
<input id=O

Genannt Curry - Syntax: f("from this")("to this").

JS aufgeräumt

s => e => {
    s = [...s],
    e = [...e],
    d = e[ k="length" ] - s[k],
    (d>0 ? s : e).push(..." ".repeat(d>0 ? d : -d)),
    a = [...e.keys()],
    u = _ => {
        O.value = s.join``,
        s[ i = a.splice(Math.random()*a[k]|0, 1)[0] ] = e[i],
        i+1 && setTimeout(u, 1e3)
    },
    u()
}

Testschnipsel

Erfordert eine schließende Klammer input, um hier zu arbeiten.

f=
s=>e=>{s=[...s],e=[...e],d=e[k="length"]-s[k],(d>0?s:e).push(..." ".repeat(d>0?d:-d)),a=[...e.keys()],u=_=>{O.value=s.join``,s[i=a.splice(Math.random()*a[k]|0,1)[0]]=e[i],i+1&&setTimeout(u,1e3)},u()}
<style>*{font-family:Consolas;}</style>
Starting String: <input id="A" type="text"><br>&nbsp;
Ending String: <input id="B" type="text">
<button onclick="f(A.value)(B.value)">Run</button>
<br><br>

<input id=O>

Justin Mariner
quelle
-1

Rubin, 106 Bytes

->a,b{puts a=a.ljust(l=[a.size,b.size].max);b=b.ljust l
[*0...l].shuffle.map{|i|sleep 1;a[i]=b[i];puts a}}

Probieren Sie es online!

Oh, alles klar. Kein Wackeln mehr im Try It Online-Link, wenn das die Ablehnung verursacht. Wenn nicht, lassen Sie mich bitte wissen, was ich falsch mache

Wert Tinte
quelle