Hazme una mala animación de desvanecimiento ... por favor

15

Su tarea es, como sugiere discretamente el título, hacer una animación de una palabra que se convierta en una segunda palabra para la suya.

¿Qué es exactamente esta "animación de desvanecimiento" que puede preguntar?

Para hacer una animación de desvanecimiento espectacular (muy mala), toma dos cadenas que contendrán solo caracteres ASCII imprimibles. Empiezas imprimiendo tu cadena inicial (la primera de las dos). Luego, elige aleatoriamente un carácter en la palabra original y lo cambia al carácter correspondiente en la palabra que desea animar. Cuando las palabras son de longitud desigual, se debe a rellenar con espacios.

Sigue haciendo esto hasta que se hayan cambiado todos los caracteres, pero no cambiará el carácter en un determinado índice más de una vez . Aquí hay un ejemplo 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

Debe escribir una función o un programa completo que cambie una letra y luego imprima la nueva cadena en incrementos de un segundo. El formato de entrada es suelto, pero el formato de salida es estricto.

Esto es , por lo que gana el código más corto en bytes.

Algunos casos de prueba (Formulario init -> final):

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

Implementación de referencia en 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
fuente
77
Los bucles infinitos apestosos están prohibidos por defecto. Los que huelen bien también.
Martin Ender
¿No creo que el código de Python sea válido? ¿Porque tienes comentarios sin comentarios?
Conor O'Brien
¿Alguna restricción en la longitud de la cuerda?
Tito
@ ConorO'Brien, oh sí ... oops: p
Daniel
@Titus, supongo que cualquier cosa que pueda manejar tu idioma
Daniel

Respuestas:

5

MATL , 33 bytes

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

Pruébalo en MATL Online . Es posible que deba actualizar la página y presionar "Ejecutar" nuevamente si no funciona.

Alternativamente, esta versión ( 35 bytes ) elimina la pantalla antes de que se muestre cada nueva cadena, lo que da como resultado que la salida se "modifique en su lugar":

Luis Mendo
fuente
¿Esto tiene pausas de un segundo? No funciona en mi teléfono.
Daniel
@Dopapp Sí, la final 1Y.es la pausa dentro del bucle. Me funciona desde mi computadora usando Chrome
Luis Mendo
@Dopapp ¿Qué sistema operativo está utilizando?
Suever
@Suever, iOS 9.
Daniel
1
@Dopapp todavía estamos resolviendo algunos de los problemas, así que avísanos si tienes más.
Suever
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

Necesidades -Fy -lbanderas para ejecutar, así como -M5.010(o -E). Tenga en cuenta que si su versión de perl es un poco antigua, deberá agregarla -ana su línea de comando (que agregaré demasiado abajo para mostrarla, pero no es necesaria). Por ejemplo :

$ 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

Estoy bastante seguro de que esto podría ser más corto, pero no pude descubrir cómo ... ¡todavía! Aún así, no creo que esta sea una mala respuesta, y espero que alguien se inspire para hacerlo más corto (¡o tenga una idea totalmente diferente!).

Dada
fuente
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

Los casos de prueba están en ideona

Jonathan Allan
fuente
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);}}

Sin golf

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
fuente
2

Perl, 109 108 99 bytes

Incluye +3 para -n

Dar cadenas en STDIN sin nueva línea 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 se muestra, pero reemplaza \xhh por los caracteres literales para obtener la puntuación reclamada.

Esta forma de usar \Kes nueva, creo ...

Ton Hospel
fuente
Impresionante, como siempre! ¡Me tomó un tiempo descubrir cómo funciona esto! Buen uso de \Khecho. Tenga en cuenta que hay dos \0en su código y \xffque pueden reemplazarse por los caracteres literales correspondientes, por lo que el recuento de bytes es en realidad 108. Además, tal vez no lo haya visto, pero el formato de entrada es libre, por lo que probablemente haya algo más clasificador que `->` como separador.
Dada
@ Dada Ah, cierto. Gracias. Durante el desarrollo, nunca uso los caracteres literales, por lo que es fácil pasar por alto cosas al ajustar el recuento de bytes. Otro separador puede ganar hasta 3 bytes, pero es un cambio poco interesante, así que lo dejaré
Ton Hospel
Si, por su puesto. No cuento todas sus soluciones, pero solo cuando experimento con ellas, y en ese caso me hizo ver esos 4 bytes que no debería haber 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!

Decaimiento Beta
fuente
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));}}}

Sin golf:

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

Edición: menos 17 bytes por Kevin Cruijssen (modifiqué ligeramente la sugerencia reutilizando en jlugar de crear una nueva variable xpara contener el tamaño)

Editar: menos 9 bytes

ortis
fuente
Tiene espacios en blanco innecesarios en sus dos Arrays::copyOfllamadas
CAD97,
Como dijo @ CAD97, puede eliminar algunos espacios en blanco innecesarios; también en las matrices: String[]sy char[]a. Además, se puede jugar golf su primer ciclo for: for(;j<l;i.add(j++);; Puede eliminarlo Random r=new Random();y usarlo directamente new Random().nextInt(i.size()):; También puede agregar ,xa la lista de entradas, y arriesgar el ciclo while a while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}Y probablemente hay más en el golf que me estoy perdiendo.
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]);}

guardar como archivo, ejecutar con php <filename> <string1> <string2>(o php-cgi)

Descompostura

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

CJam, 44 bytes

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

Explicación:

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

El retraso solo funciona utilizando el intérprete de Java, no en el intérprete en línea.

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

Pruébelo en línea (retraso establecido en 1 ms)

Neorej
fuente
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

Llamado usando la sintaxis de curry: f("from this")("to this") .

JS limpiado

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

Fragmento de prueba

Requiere cerrar el aparato ortopédico inputpara trabajar aquí.

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

Pruébalo en línea!

Oh, todo bien. No más rick rodando en el enlace Pruébelo en línea, si eso es lo que está causando los votos negativos. Si no, por favor avíseme qué estoy haciendo mal

Tinta de valor
fuente