Faça-me uma animação desbotada ... por favor

15

Sua tarefa é, como o título sugere discretamente, fazer uma animação desbotada de uma palavra se transformando em uma segunda palavra para a sua verdadeiramente.

O que exatamente é essa "animação fade" que você pode perguntar?

Para criar uma animação desbotada espetacular (péssima), use duas seqüências que conterão apenas caracteres ASCII imprimíveis. Você começa imprimindo sua sequência inicial (a primeira das duas). Em seguida, você escolhe aleatoriamente um caractere na palavra original e o altera para o caractere correspondente na palavra que deseja animar. Quando as palavras tiverem comprimento desigual, você deverá preenchê-las com espaços.

Você continua fazendo isso até que todos os caracteres tenham sido alterados, mas não o mudará em um determinado índice mais de uma vez . Aqui está um exemplo de E / S:

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

Você deve escrever uma função ou programa completo que altere uma letra e depois imprima a nova seqüência de caracteres em incrementos de um segundo. O formato de entrada está solto, mas o formato de saída é rígido.

Isso é , então o código mais curto em bytes vence.

Alguns casos de teste (formulário:) init -> final:

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

Implementação de referência no 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
fonte
7
Loop infinito fedorento é proibido por padrão. Também cheiram bem.
Martin Ender
Eu não acho que o código python é válido? Porque você tem comentários não comentados?
Conor O'Brien
Alguma restrição no comprimento da string?
Titus
@ ConorO'Brien, oh yeah .... oops: p
Daniel
@Titus, qualquer coisa que seu idioma possa suportar, eu acho #
Daniel

Respostas:

5

MATL , 33 bytes

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

Experimente no MATL Online . Pode ser necessário atualizar a página e pressionar "Executar" novamente se não funcionar.

Como alternativa, esta versão ( 35 bytes ) exclui a tela antes que cada nova string seja exibida, o que resulta na saída "modificada no local":

Luis Mendo
fonte
Isso tem uma pausa de um segundo? Não funciona no meu telefone.
Daniel
@Dopapp Sim, a final 1Y.é a pausa dentro do loop. Funciona para mim no meu computador usando o Chrome
Luis Mendo
@Dopapp Qual sistema operacional você está usando?
Suever 11/09/16
@Suever, iOS 9.
Daniel
1
@Dopapp ainda estamos resolvendo alguns dos problemas, então deixe-nos saber se você tem mais.
Suever 12/09/16
2

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

@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

Necessidades -Fe -lsinalizadores para executar, bem como -M5.010(ou -E). Observe que, se a sua versão do perl for um pouco antiga, você precisará adicionar -anna sua linha de comando (que eu adicionarei muito abaixo para mostrá-la, mas não é necessária). Por exemplo :

$ 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

Tenho certeza de que isso poderia ser mais curto, mas não consegui descobrir como ... ainda! Ainda assim, não acho que essa seja uma resposta ruim e espero que alguém seja inspirado a diminuí-la (ou ter uma idéia totalmente diferente!).

dada
fonte
2

Python 2, 171 169 168 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

Os casos de teste são em ideone

Jonathan Allan
fonte
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
fonte
2

Perl, 109 108 99 bytes

Inclui +3 para -n

Dê strings no STDIN sem nova linha final

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}

Funciona como mostrado, mas substitua \xhhpelos caracteres literais para obter a pontuação reivindicada.

Essa maneira de usar \Ké nova, eu acho ...

Ton Hospel
fonte
Impressionante, como sempre! Demorei um pouco para descobrir como isso funciona! Bom uso de \Kfato. Observe que existem dois \0no seu código e \xffque podem ser substituídos pelos caracteres literais correspondentes, portanto, a contagem de bytes é na verdade 108. Além disso, talvez você não tenha visto, mas o formato de entrada é livre, portanto provavelmente há algo mais que `->` como separador.
Dada
@ Dadá Ah certo. Obrigado. Durante o desenvolvimento, nunca uso os caracteres literais, por isso é fácil perder as coisas ao ajustar a contagem de bytes. Outro separador pode de fato ganhar até 3 bytes, mas é uma mudança desinteressante, então vou deixar:
Ton Hospel
Sim, claro. Eu não contar todas as suas soluções, mas só quando eu experimentar sobre eles, e, nesse caso, fez-me ver esses 4 bytes que você não deveria ter contado;)
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 it!

Beta Decay
fonte
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));
    }
}
}

Editar: menos 2 bytes por CAD97

Edit: menos 17 bytes por Kevin Cruijssen (alterei ligeiramente a sugestão reutilizando em jvez de criar uma nova variável xpara manter o tamanho)

Editar: menos 9 bytes

ortis
fonte
Você tem espaço em branco desnecessário nas duas Arrays::copyOfchamadas
CAD97
Como o CAD97 disse, você pode remover alguns espaços em branco desnecessários; também nas matrizes: String[]se char[]a. Além disso, você pode golfe o seu primeiro loop for: for(;j<l;i.add(j++);; Você pode remover Random r=new Random();e usá-lo diretamente new Random().nextInt(i.size()):; Você também pode adicionar ,xà lista de entradas e dar uma chance ao loop while para while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}E provavelmente há mais no golfe que estou perdendo.
Kevin Cruijssen 12/09
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]);}

salve como arquivo, execute com php <filename> <string1> <string2>(ou php-cgi)

demolir

<?=$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
fonte
0

CJam, 44 bytes

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

Explicação:

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

O atraso funciona apenas usando o interpretador Java, não no interpretador online.

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

Experimente online (atraso definido para 1 ms)

Neorej
fonte
0

JavaScript (ES6) + HTML, 210 bytes

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

Chamado usando a sintaxe de curry: f("from this")("to this").

JS limpo

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

Snippet de teste

Requer chave de fechamento no inputpara trabalhar aqui.

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
fonte
-1

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

Experimente online!

Oh tudo bem. Não há mais rick rolling no link Try It Online, se é isso que está causando os votos negativos. Caso contrário, informe-me o que estou fazendo de errado

Value Ink
fonte