Fammi una brutta animazione in dissolvenza ... per favore


15

Il tuo compito è, come suggerisce discretamente il titolo, realizzare una brutta animazione di una parola che si trasforma in una seconda parola per la tua.

Che cosa esattamente è questo "l'animazione fade" si può chiedere?

Per realizzare un'animazione di dissolvenza spettacolare (molto scadente), prendi due stringhe che conterranno solo caratteri ASCII stampabili. Si inizia stampando la stringa iniziale (la prima delle due). Quindi, scegli casualmente un carattere nella parola originale e lo cambi nel carattere corrispondente nella parola in cui vuoi animare. Quando le parole hanno una lunghezza diversa, è necessario riempirle di spazi.

Continui a farlo fino a quando tutti i personaggi non sono stati cambiati, ma non cambierai il personaggio in un determinato indice più di una volta . Ecco un esempio di 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

È necessario scrivere una funzione o un programma completo che modifica una lettera e quindi stampa la nuova stringa con incrementi di un secondo. Il formato di input è lento, ma il formato di output è rigoroso.

Questo è , quindi vince il codice più breve in byte.

Alcuni casi di test (modulo:) init -> final:

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

Implementazione di riferimento 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


Non penso che il codice Python sia valido? Perché hai commenti non commentati?
Conor O'Brien,

Qualche restrizione sulla lunghezza della stringa?
Tito,

@ ConorO'Brien, oh yeah .... oops: p
Daniel

@Titus, qualunque cosa la tua lingua possa gestire, suppongo
Daniel,

Risposte:



5

MATL , 33 byte

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

Provalo su MATL Online . Potrebbe essere necessario aggiornare la pagina e premere nuovamente "Esegui" se non funziona.

In alternativa, questa versione ( 35 byte ) elimina lo schermo prima che ogni nuova stringa venga visualizzata, il che comporta che l'output viene "modificato in posizione":


Questo ha le pause di un secondo? Non funziona sul mio telefono.
Daniel,

@Dopapp Sì, la finale 1Y.è la pausa all'interno del loop. Funziona per me dal mio computer usando Chrome
Luis Mendo l'

@Dopapp Quale sistema operativo stai usando?
Suever,

@Suever, iOS 9.
Daniel,

1
@Dopapp stiamo ancora risolvendo alcuni dei problemi, quindi facci sapere se ne hai ancora.
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

Necessità -Fe -lflag per l'esecuzione, nonché -M5.010(o -E). Nota che se la tua versione di perl è un po 'vecchia, dovrai aggiungerla -ansulla tua riga di comando (che aggiungerò troppo sotto per mostrarla, ma non è necessaria). Per esempio :

$ 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

Sono abbastanza sicuro che questo potrebbe essere più breve, ma non sono riuscito a scoprire come ... ancora! Tuttavia, non penso che questa sia una cattiva risposta, e spero che qualcuno sarà ispirato a renderlo più breve (o avere un'idea totalmente diversa!).


2

Python 2, 171 169 168 163 byte

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

I casi di test sono su ideone


2

C # 299 byte

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

2

Perl, 109 108 99 byte

Include +3 per -n

Dare stringhe su STDIN senza newline finale

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}

Funziona come mostrato, ma sostituiscilo \xhhcon i caratteri letterali per ottenere il punteggio richiesto.

Questo modo di usare \Kè nuovo, penso ...


Splendido, come sempre! Mi ci è voluto un po 'per capire come funziona! Bell'uso di \Kdavvero. Nota che ci sono due \0nel tuo codice e \xffche possono essere sostituiti dai corrispondenti caratteri letterali, quindi il conteggio dei byte è in realtà 108. Inoltre, forse non l'hai visto, ma il formato di input è gratuito, quindi probabilmente lo è qualcosa di più triste di `->` come separatore.
Dada,

@Dada Ah giusto. Grazie. Durante lo sviluppo non uso mai i caratteri letterali, quindi è facile perdere le cose quando si regola il conteggio dei byte. Un altro separatore può effettivamente guadagnare fino a 3 byte, ma è un cambiamento poco interessante, quindi lo lascerò e basta
Ton Hospel,

Sì certo. Non conto tutte le tue soluzioni, ma solo quando le faccio esperimenti, e in quel caso mi ha fatto vedere quei 4 byte che non avresti dovuto contare;)
Dada,

1

Python 3, 214 byte

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


0

Java, 456 454 437 428 byte

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

Modifica: meno 2 byte con CAD97

Modifica: meno 17 byte di Kevin Cruijssen (ho leggermente modificato il suggerimento riutilizzando jinvece di creare una nuova variabile xper contenere la dimensione)

Modifica: meno 9 byte


Hai spazi bianchi non necessari nelle tue due Arrays::copyOfchiamate
CAD97

Come diceva @ CAD97, è possibile rimuovere alcuni spazi bianchi non necessari; anche agli array: String[]se char[]a. Inoltre, si può golf vostro primo ciclo for: for(;j<l;i.add(j++);; Puoi rimuoverlo Random r=new Random();e usarlo direttamente new Random().nextInt(i.size()):; Puoi anche aggiungere ,xall'elenco di ints e tentare il ciclo while in while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}E probabilmente c'è molto altro nel golf che mi manca.
Kevin Cruijssen,

0

PHP, 123 121 byte

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

salva come file, esegui con php <filename> <string1> <string2>(o php-cgi)

abbattersi

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

0

CJam, 44 byte

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

Spiegazione:

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

Il ritardo funziona solo utilizzando l'interprete Java, non nell'interprete online.

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

Provalo online (ritardo impostato su 1 ms)


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

Chiamato utilizzando la sintassi di curry: f("from this")("to this").

JS pulito

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

Richiede una parentesi graffa di chiusura inputper funzionare qui.

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>


-1

Rubino, 106 byte

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

Provalo online!

Va bene. Niente più rick roll nel link Provalo online, se questo è ciò che sta causando i voti negativi. Altrimenti, per favore fatemi sapere cosa sto facendo di sbagliato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.