Faites-moi une mauvaise animation de fondu… s'il vous plaît

15

Votre tâche consiste à, comme le titre le suggère discrètement, faire une mauvaise animation de fondu d'un mot se transformant en un deuxième mot pour le vôtre.

Quelle est exactement cette "animation de fondu" que vous pouvez demander?

Pour créer une animation de fondu spectaculaire (vraiment mauvaise), vous prenez deux chaînes qui ne contiendront que des caractères ASCII imprimables. Vous commencez par imprimer votre chaîne de départ (la première des deux). Ensuite, vous choisissez au hasard un caractère dans le mot d'origine et le remplacez par le caractère correspondant dans le mot que vous souhaitez animer. Lorsque les mots sont de longueur inégale, vous devez les garnir d'espaces.

Vous continuez ainsi jusqu'à ce que tous les personnages aient été modifiés, mais vous ne changerez pas le personnage à un certain index plus d'une fois . Voici un exemple d'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

Vous devez écrire une fonction ou un programme complet qui modifie une lettre, puis imprime la nouvelle chaîne par incréments d'une seconde. Le format d'entrée est lâche, mais le format de sortie est strict.

C'est le , donc le code le plus court en octets l'emporte.

Quelques cas de test (formulaire:) init -> final:

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

Implémentation de référence dans 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
la source
7
Les boucles infinies puantes sont interdites par défaut. Celles qui sentent bon aussi.
Martin Ender
Je ne pense pas que le code python soit valide? Parce que vous avez des commentaires non commentés?
Conor O'Brien
Une restriction sur la longueur de la chaîne?
Titus
@ ConorO'Brien, oh ouais .... oups: p
Daniel
@Titus, tout ce que votre langue peut gérer, je suppose
Daniel

Réponses:

5

MATL , 33 octets

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

Essayez-le sur MATL Online . Vous devrez peut-être actualiser la page et appuyer à nouveau sur "Exécuter" si cela ne fonctionne pas.

Alternativement, cette version ( 35 octets ) supprime l'écran avant que chaque nouvelle chaîne ne soit affichée, ce qui a pour résultat que la sortie est "modifiée sur place":

Luis Mendo
la source
Cela a-t-il une pause d'une seconde? Il ne fonctionne pas sur mon téléphone.
Daniel
@Dopapp Oui, la finale 1Y.est la pause dans la boucle. Cela fonctionne pour moi depuis mon ordinateur en utilisant Chrome
Luis Mendo
@Dopapp Quel système d'exploitation utilisez-vous?
Suever
@Suever, iOS 9.
Daniel
1
@Dopapp, nous travaillons toujours sur certains des problèmes, alors faites-nous savoir si vous en avez d'autres.
Suever
2

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

@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

Besoins -Fet -lindicateurs à exécuter, ainsi que -M5.010(ou -E). Notez que si votre version de perl est un peu ancienne, vous devrez l'ajouter -ansur votre ligne de commande (que j'ajouterai trop ci-dessous pour l'afficher, mais ce n'est pas nécessaire). Par exemple :

$ 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

Je suis sûr que cela pourrait être plus court, mais je n'ai pas pu savoir comment ... pour le moment! Pourtant, je ne pense pas que ce soit une mauvaise réponse, et j'espère que quelqu'un sera inspiré pour le raccourcir (ou avoir une idée totalement différente!).

Dada
la source
2

Python 2, 171 169 168 163 163 octets

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

Les cas de test sont sur idéone

Jonathan Allan
la source
2

C # 299 octets

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

Non 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
la source
2

Perl, 109 108 99 octets

Comprend +3 pour -n

Donner des chaînes sur STDIN sans nouvelle ligne 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}

Fonctionne comme indiqué, mais remplacez-le \xhhpar les caractères littéraux pour obtenir le score revendiqué.

Cette façon d'utiliser \Kest nouvelle je pense ...

Ton Hospel
la source
Génial, comme toujours! Cela m'a pris un certain temps pour comprendre comment cela fonctionne! Belle utilisation en \Keffet. Notez qu'il y en a deux \0dans votre code et que \xffceux-ci peuvent être remplacés par les caractères littéraux correspondants, donc le nombre d'octets est en fait 108. De plus, vous ne l'avez peut-être pas vu, mais le format d'entrée est libre, donc il y a probablement quelque chose de plus que `->` comme séparateur.
Dada
@Dada Ah oui. Merci. Pendant le développement, je n'utilise jamais les caractères littéraux, il est donc facile de manquer des choses lors du réglage du nombre d'octets. Un autre séparateur peut en effet gagner jusqu'à 3 octets, mais c'est un changement sans intérêt, donc je vais le laisser
Ton Hospel
Oui bien sur. Je ne raconte pas toutes vos solutions, mais seulement lorsque je les expérimente, et dans ce cas cela m'a fait voir ces 4 octets que vous n'auriez pas dû compter;)
Dada
1

Python 3, 214 octets

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
la source
0

Java, 456 454 437 428 octets

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

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

Modifier: moins 2 octets par CAD97

Edit: moins 17 octets par Kevin Cruijssen (j'ai légèrement modifié la suggestion en réutilisant jau lieu de créer une nouvelle variable xpour contenir la taille)

Modifier: moins 9 octets

ortis
la source
Vous avez des espaces inutiles dans vos deux Arrays::copyOfappels
CAD97
Comme l'a dit @ CAD97, vous pouvez supprimer certains espaces inutiles; également au niveau des tableaux: String[]set char[]a. En outre, vous pouvez jouer au golf votre première boucle for: for(;j<l;i.add(j++);; Vous pouvez le supprimer Random r=new Random();et l'utiliser directement new Random().nextInt(i.size()):; Vous pouvez également ajouter ,xà la liste des ints et tenter la boucle while. while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}Et il y a probablement plus au golf que je manque.
Kevin Cruijssen
0

PHP, 123 121 octets

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

enregistrer en tant que fichier, exécuter avec php <filename> <string1> <string2>(ouphp-cgi )

panne

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

CJam, 44 octets

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

Explication:

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

Le délai ne fonctionne qu'en utilisant l'interpréteur Java, pas dans l'interpréteur en ligne.

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

Essayez-le en ligne (délai réglé sur 1 ms)

Neorej
la source
0

JavaScript (ES6) + HTML, 210 octets

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

Appelé en utilisant la syntaxe de curry: f("from this")("to this").

JS nettoyé

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

Extrait de test

Nécessite un renfort de fermeture sur le inputpour travailler ici.

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
la source
-1

Rubis, 106 octets

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

Essayez-le en ligne!

Ah très bien. Plus besoin de rouler dans le lien Try It Online, si c'est ce qui cause les downvotes. Sinon, faites-moi savoir ce que je fais mal

Encre de valeur
la source