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


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":


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!).


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


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

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


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!


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


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
}

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)


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>


-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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.