Buatkan saya animasi fade yang buruk ... tolong


15

Tugas Anda adalah, seperti judulnya sarankan, buat animasi fade buruk dari satu kata menjadi kata kedua untuk Anda.

Apa sebenarnya adalah ini "fade animasi" Anda mungkin bertanya?

Untuk membuat animasi fade yang spektakuler (buruk), Anda mengambil dua string yang hanya akan berisi karakter ASCII yang dapat dicetak. Anda mulai dengan mencetak string awal Anda (yang pertama dari keduanya). Kemudian, Anda secara acak memilih karakter di kata aslinya dan mengubahnya ke karakter yang sesuai di kata yang ingin Anda animasikan. Ketika kata-kata memiliki panjang yang tidak sama, Anda harus memberi mereka spasi.

Anda terus melakukan ini sampai semua karakter telah diubah, tetapi Anda tidak akan mengubah karakter pada indeks tertentu lebih dari sekali . Berikut ini adalah contoh 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

Anda harus menulis fungsi atau program lengkap yang mengubah huruf dan kemudian mencetak string baru dengan penambahan satu detik. Format input longgar, tetapi format outputnya ketat.

Ini adalah , jadi kode terpendek dalam byte menang.

Beberapa test case (Formulir:) init -> final:

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

Implementasi referensi dalam 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


Saya tidak berpikir kode python valid? Karena Anda memiliki komentar yang tidak di-komentar?
Conor O'Brien

Adakah batasan panjang tali?
Titus

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

@Itus, apa pun yang bisa ditangani oleh bahasa Anda
Daniel

Jawaban:



5

MATL , 33 byte

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

Cobalah di MATL Online . Anda mungkin perlu me-refresh halaman dan tekan "Run" lagi jika itu tidak berhasil.

Atau, versi ini ( 35 byte ) menghapus layar sebelum setiap string baru ditampilkan, yang menghasilkan output yang "dimodifikasi di tempat":


Apakah ini memiliki jeda satu detik? Itu tidak berjalan di ponsel saya.
Daniel

@Dappapp Ya, final 1Y.adalah jeda di dalam loop. Ini berfungsi untuk saya dari komputer menggunakan Chrome
Luis Mendo

@Dopapp Sistem operasi apa yang Anda gunakan?
Suever

@Suever, iOS 9.
Daniel

1
@Dappapp kami masih menyelesaikan beberapa masalah, jadi beri tahu kami jika Anda memiliki lebih banyak.
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

Kebutuhan -Fdan -lbendera untuk dijalankan, serta -M5.010(atau -E). Perhatikan bahwa jika versi perl Anda agak lama, Anda perlu menambahkan -anpada baris perintah Anda (yang saya akan tambahkan terlalu bawah untuk menunjukkannya, tetapi itu tidak diperlukan). Contohnya :

$ 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

Saya cukup yakin ini bisa lebih pendek, tetapi saya tidak bisa mengetahui caranya ... belum! Namun, saya tidak berpikir ini adalah jawaban yang buruk, dan mudah-mudahan seseorang akan terinspirasi untuk membuatnya lebih pendek (atau punya ide yang sama sekali berbeda!).


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

Kasus uji ada di ideone


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

Tidak disatukan

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

Termasuk +3 untuk -n

Berikan string pada STDIN tanpa baris terakhir

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}

Bekerja seperti yang ditunjukkan, tetapi ganti \xhhdengan karakter literal untuk mendapatkan skor yang diklaim.

Cara menggunakan \Kini baru saya pikir ...


Luar biasa, seperti biasa! Butuh waktu beberapa saat untuk mencari tahu bagaimana ini bekerja! Penggunaannya \Kmemang bagus. Perhatikan bahwa ada dua \0dalam kode Anda dan juga \xffyang dapat diganti oleh karakter literal yang sesuai, sehingga jumlah byte sebenarnya 108. Juga, mungkin Anda tidak melihatnya, tetapi format inputnya gratis, jadi mungkin ada penyortir sesuatu dari `->` sebagai pemisah.
Dada

@ Ah benar. Terima kasih. Saat mengembangkan saya tidak pernah menggunakan karakter literal, jadi mudah kehilangan hal-hal ketika menyesuaikan jumlah byte. Pemisah lain memang bisa mendapatkan hingga 3 byte, tetapi ini adalah perubahan yang tidak menarik, jadi saya akan meninggalkannya
Ton Hospel

Ya tentu saja. Saya tidak menceritakan semua solusi Anda, tetapi hanya ketika saya bereksperimen pada mereka, dan dalam hal itu membuat saya melihat 4 byte yang seharusnya tidak Anda hitung;)
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)

Ide itu!


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

Tidak Disatukan:

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

Sunting: minus 2 byte oleh CAD97

Sunting: minus 17 byte oleh Kevin Cruijssen (Saya sedikit mengubah saran dengan menggunakan jalih-alih membuat variabel baru xuntuk menampung ukuran)

Sunting: minus 9 byte


Anda memiliki ruang kosong yang tidak perlu dalam dua Arrays::copyOfpanggilan Anda
CAD97

Seperti yang dikatakan @ CAD97, Anda dapat menghapus beberapa spasi putih yang tidak perlu; juga di array: String[]sdan char[]a. Juga, Anda dapat golf pertama Anda untuk loop: for(;j<l;i.add(j++);; Anda dapat menghapus Random r=new Random();dan menggunakannya secara langsung new Random().nextInt(i.size()):; Anda juga dapat menambahkan ,xke daftar ints, dan kebetulan loop sementara ke while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}Dan mungkin ada lebih banyak golf yang saya lewatkan.
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]);}

simpan sebagai file, jalankan dengan php <filename> <string1> <string2>(atau php-cgi)

kerusakan

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

Penjelasan:

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

Penundaan hanya berfungsi menggunakan interpreter Java, bukan dalam interpreter online.

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

Cobalah online (tunda disetel ke 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

Disebut menggunakan sintaks kari: f("from this")("to this") .

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

Cuplikan Tes

Membutuhkan brace penutup inputuntuk bekerja di sini.

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

Cobalah online!

Oh baiklah. Tidak ada lagi rick yang bergulir di tautan Try It Online, jika itu yang menyebabkan downvotes. Jika tidak, tolong beri tahu saya apa yang saya lakukan salah

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.