Bana kötü bir animasyon yap ... lütfen


15

Göreviniz, başlığın açıkça belirttiği gibi, bir kelimenin gerçekten sizin için ikinci bir kelimeye dönüşen kötü bir solma animasyonu yapmaktır.

Tam olarak ne olduğunu bu "fade animasyon" diye sorabilirsin?

Etkileyici (ly bad) solma animasyonu yapmak için, yalnızca yazdırılabilir ASCII karakterleri içeren iki dize alırsınız. Başlangıç ​​dizenizi (ikisinin ilki) yazdırarak başlarsınız. Ardından, orijinal sözcükteki rastgele bir karakteri seçer ve animasyon yapmak istediğiniz sözcükteki karşılık gelen karakterle değiştirirsiniz. Kelimeler eşitsiz uzunlukta olduğunda, sen boşluklar kullanılır onları gerekir.

Tüm karakterler değiştirilene kadar bunu yapmaya devam edersiniz , ancak belirli bir dizindeki karakteri bir kereden fazla değiştirmezsiniz . İşte bir örnek 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

Harfi değiştiren ve yeni dizeyi bir saniyelik artışlarla basan bir işlev veya tam program yazmalısınız. Giriş biçimi gevşek, ancak çıkış biçimi katı.

Bu , bayt en kısa kod kazanır.

Bazı test senaryoları (Form:) init -> final:

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

Python 2'de referans uygulaması:

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


Python kodunun geçerli olduğunu düşünmüyorum? Önerilmemiş yorumlarınız olduğu için mi?
Conor O'Brien

Dize uzunluğunda herhangi bir kısıtlama var mı?
Titus

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

@Titus, dilinin üstesinden gelebileceği her şey sanırım
Daniel

Yanıtlar:



5

MATL , 33 bayt

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

Şurada deneyin: MATL Online'da . Sayfayı yenilemeniz ve çalışmazsa "Çalıştır" düğmesine tekrar basmanız gerekebilir.

Alternatif olarak, bu sürüm ( 35 bayt ) her yeni dize görüntülenmeden önce ekranı siler, bu da çıktının "yerinde değiştirilmesine" neden olur:


Bunun bir saniye duraklaması var mı? Telefonumda çalışmıyor.
Daniel

@Dopapp Evet, son 1Y.döngüdeki duraklama. Chrome'u kullanarak bilgisayarımdan çalışıyor
Luis Mendo

@Dopapp Hangi işletim sistemini kullanıyorsunuz?
Suever

@Suever, iOS 9.
Daniel

1
@Dopapp hala bazı sorunları üzerinde çalışıyoruz, bu yüzden daha fazla varsa bize bildirin.
Suever

2

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

@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

İhtiyaç -Fve -lbayrakların yanı sıra -M5.010(veya -E). Perl sürümünüz biraz eski -anise, komut satırınıza eklemeniz gerektiğini unutmayın (bunu göstermek için çok feryat ekleyeceğim, ancak gerekli değil). Örneğin :

$ 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

Bunun daha kısa olabileceğinden eminim, ama nasıl ... henüz bulamadım! Yine de, bunun kötü bir cevap olduğunu düşünmüyorum ve umarım birisi onu kısaltmak için ilham alacak (veya tamamen farklı bir fikre sahip olacak!).


2

Python 2, 171 169 168 163 bayt

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

Test senaryoları ideone'de


2

C # 299 Bayt

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 bayt

İçin +3 içerir -n

Son satırsonu olmadan STDIN'de dizeler verin

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}

Gösterildiği gibi çalışır, ancak \xhhistenen puanı almak için değişmez karakterlerle değiştirin .

Bu şekilde kullanmanın \Kyeni olduğunu düşünüyorum ...


Awsome, her zamanki gibi! Bunun nasıl çalıştığını anlamak için bana biraz zaman ayırdı! \KGerçekten güzel bir kullanım . İki tane olduğunu unutmayın\0Kodunuzda \xffkarşılık gelen değişmez karakterler ile değiştirilebilecek edin , bayt sayısı aslında 108'dir. Ayrıca, belki görmediniz, ancak giriş biçimi ücretsizdir, bu yüzden muhtemelen ayırıcı olarak `` -> `den daha sıradan bir şey.
Dada

@Dada Ah doğru. Teşekkürler. Gelişirken asla gerçek karakterleri kullanmam, bu nedenle bayt sayısını ayarlarken bir şeyleri kaçırmak kolaydır. Başka bir ayırıcı gerçekten 3 bayta kadar kazanabilir, ancak bu ilginç bir değişiklik, bu yüzden onu bırakacağım
Ton Hospel

Evet elbette. Tüm çözümlerinizi anlatmıyorum, ancak sadece bunları denediğimde ve bu durumda
Dada

1

Python 3, 214 bayt

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)

Boşver!


0

Java, 456 454 437 428 bayt

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

Düzenleme: CAD97 tarafından eksi 2 bayt

Düzenleme: eksi 17 byte Kevin Cruijssen (Biraz boyutunu tutmak için jyeni bir değişken oluşturmak yerine yeniden kullanarak öneri değiştirdim x)

Düzenle: eksi 9 bayt


İki Arrays::copyOfgörüşmenizde de gereksiz boşluk var
CAD97

@ CAD97'nin dediği gibi, gereksiz bazı boşlukları kaldırabilirsiniz; ayrıca dizilerde: String[]sve char[]a. Ayrıca, ilk döngü için golf for(;j<l;i.add(j++);:; Random r=new Random();Doğrudan kaldırabilir ve kullanabilirsiniz new Random().nextInt(i.size()):; Ayrıca ,x, ints listesine ve şans ise while-loop'a ekleyebilirsiniz while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}Ve muhtemelen golf için eksik olduğum daha fazlası var.
Kevin Cruijssen

0

PHP, 123 121 bayt

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

dosya olarak kaydet, php <filename> <string1> <string2>(veya php-cgi) ile yürüt

Yıkmak

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

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

Açıklama:

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

Gecikme, çevrimiçi yorumlayıcıda değil, yalnızca Java yorumlayıcısı kullanılarak çalışır.

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

Çevrimiçi deneyin (gecikme 1 ms olarak ayarlandı)


0

JavaScript (ES6) + HTML, 210 bayt

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

Köri sözdizimi kullanılarak çağrılır: f("from this")("to this") .

Temizlendi JS

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 Parçacığı

inputBurada çalışmak için kapatma ayracı gerektirir .

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

Ruby, 106 bayt

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

Çevrimiçi deneyin!

Pekala. Aşağıdakilere neden olan şey buysa, Try It Online bağlantısında rick haddeleme yok. Değilse, lütfen neyi yanlış yaptığımı bildirin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.