Zrób mi złą animację zanikania… proszę

15

Twoim zadaniem jest, jak dyskretnie sugeruje tytuł, wykonanie złej animacji zanikania jednego słowa, zmieniając się naprawdę w drugie.

Czym dokładnie jest ta „animacja zanikania”, o którą możesz zapytać?

Aby stworzyć spektakularną (kiepską) animację zanikania, bierzesz dwa ciągi znaków, które będą zawierały tylko znaki ASCII do wydrukowania. Zaczynasz od wydrukowania łańcucha początkowego (pierwszego z dwóch). Następnie losowo wybierasz znak w oryginalnym słowie i zmieniasz go na odpowiedni znak w słowie, który chcesz animować. Gdy słowa są nierównej długości, ty musi pad je spacjami.

Robisz to dalej, dopóki wszystkie postacie nie zostaną zmienione, ale nie zmienisz postaci pod pewnym indeksem więcej niż jeden raz . Oto przykład we / wy:

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

Musisz napisać funkcję lub pełny program, który zmienia literę, a następnie drukuje nowy ciąg co 1 sekundę. Format wejściowy jest luźny, ale format wyjściowy jest ścisły.

To jest , więc wygrywa najkrótszy kod w bajtach.

Niektóre przypadki testowe (Form:) init -> final:

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

Odwołanie do implementacji w 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
źródło
Nie sądzę, że kod python jest prawidłowy? Ponieważ masz nieskomentowane komentarze?
Conor O'Brien,
Jakieś ograniczenie długości łańcucha?
Tytus
@ ConorO'Brien, o tak tak .... oops: p
Daniel
@Titus, chyba wszystko, co twój język sobie poradzi
Daniel

Odpowiedzi:

5

MATL , 33 bajty

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

Wypróbuj w MATL Online . Może być konieczne odświeżenie strony i ponowne naciśnięcie przycisku „Uruchom”, jeśli nie działa.

Alternatywnie ta wersja ( 35 bajtów ) usuwa ekran przed wyświetleniem każdego nowego ciągu, co powoduje, że dane wyjściowe są „modyfikowane na miejscu”:

Luis Mendo
źródło
Czy to ma jedną sekundę przerwy? Nie działa na moim telefonie.
Daniel
@Dopapp Tak, końcowy 1Y.to pauza w pętli. Działa dla mnie z mojego komputera z Chrome
Luis Mendo,
@Dopapp Z jakiego systemu operacyjnego korzystasz?
Suever,
@Suever, iOS 9.
Daniel
1
@Dopapp wciąż pracujemy nad niektórymi problemami, więc daj nam znać, jeśli masz więcej.
Suever
2

Perl, 131 + 4 ( -F -l) = 135 bajtów

@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

Potrzebuje -Fi -lflagi do uruchomienia, a także -M5.010(lub -E). Zauważ, że jeśli twoja wersja perla jest nieco stara, musisz dodać ją -anw linii poleceń (którą dodam zbyt poniżej, aby ją pokazać, ale nie jest potrzebna). Na przykład :

$ 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

Jestem pewien, że może to być krótsze, ale nie mogłem się dowiedzieć, jak ... jeszcze! Mimo to nie sądzę, że to zła odpowiedź i mam nadzieję, że ktoś zostanie zainspirowany, aby ją skrócić (lub mieć zupełnie inny pomysł!).

Dada
źródło
2

Python 2, 171 169 168 163 bajtów

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

Przypadki testowe są na ideone

Jonathan Allan
źródło
2

C # 299 bajtów

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

Nie golfił

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
źródło
2

Perl, 109 108 99 bajtów

Obejmuje +3 za -n

Podaj ciągi znaków na STDIN bez końcowej nowej linii

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}

Działa tak, jak pokazano, ale należy zastąpić \xhhliteralnymi znakami, aby uzyskać wynik.

Ten sposób korzystania \Kjest nowy, myślę ...

Ton Hospel
źródło
Niesamowite, jak zawsze! Zajęło mi trochę czasu, aby dowiedzieć się, jak to działa! \KRzeczywiście niezłe wykorzystanie . Zauważ, że \0w twoim kodzie są dwa, \xffktóre można zastąpić odpowiednimi literalnymi znakami, więc liczba bajtów wynosi w rzeczywistości 108. Może i nie widziałeś tego, ale format wejściowy jest darmowy, więc prawdopodobnie jest coś sortującego niż `->` jako separator.
Dada
@Dada Ah racja. Dzięki. Podczas programowania nigdy nie używam literalnych znaków, więc łatwo jest przeoczyć różne rzeczy podczas dostosowywania liczby bajtów. Kolejny separator rzeczywiście może zyskać do 3 bajtów, ale jest to nieciekawa zmiana, więc po prostu go zostawię
Ton Hospel
Tak, oczywiście. Nie przeliczam wszystkich twoich rozwiązań, ale tylko wtedy, gdy eksperymentuję na nich, w takim przypadku zobaczyłem te 4 bajty, których nie powinieneś policzyć;)
Dada
1

Python 3, 214 bajtów

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 to!

Rozpad beta
źródło
0

Java, 456 454 437 428 bajtów

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

Nie golfowany:

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

Edycja: minus 2 bajty przez CAD97

Edycja: minus 17 bajtów Kevin Cruijssen (nieznacznie zmieniłem sugestię, ponownie wykorzystując jzamiast tworzyć nową zmienną xdo przechowywania wielkości)

Edycja: minus 9 bajtów

ortis
źródło
Masz niepotrzebne białe znaki w swoich dwóch Arrays::copyOfpołączeniach
CAD97
Jak powiedział @ CAD97, możesz usunąć niepotrzebne białe znaki; także na tablicach: String[]si char[]a. Ponadto, można golf Twoja pierwsza dla pętli: for(;j<l;i.add(j++);; Możesz go usunąć Random r=new Random();i używać bezpośrednio new Random().nextInt(i.size()):; Możesz także dodać ,xdo listy ints i spróbować pętli while do. while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}Prawdopodobnie brakuje mi więcej golfa.
Kevin Cruijssen
0

PHP, 123 121 bajtów

<?=$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]);}

zapisz jako plik, uruchom za pomocą php <filename> <string1> <string2>(lub php-cgi)

awaria

<?=$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
}
Tytus
źródło
0

CJam, 44 bajty

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

Wyjaśnienie:

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

Opóźnienie działa tylko przy użyciu interpretera Java, a nie w tłumaczu online.

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

Wypróbuj online (opóźnienie ustawione na 1 ms)

Neorej
źródło
0

JavaScript (ES6) + HTML, 210 bajtów

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

Wywoływany przy użyciu składni curry: f("from this")("to this") .

Oczyszczono JS

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()
}

Test Snippet

Wymaga zamknięcia klamry inputdo pracy tutaj.

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
źródło
-1

Rubinowy, 106 bajtów

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

Wypróbuj online!

Oh, dobrze. Nigdy więcej rikowania w łączu Try It Online, jeśli to właśnie powoduje negatywne opinie. Jeśli nie, daj mi znać, co robię źle

Wartość tuszu
źródło