悪いフェードアニメーションを作成してください。


15

あなたの仕事は、タイトルが慎重に示唆しているように、1つの単語が本当にあなたのために2番目の単語に変わるフェードアニメーションを作成することです。

正確に何であるあなたが求めることができる。この「フェードアニメーションは」?

壮観な(かなり悪い)フェードアニメーションを作成するには、印刷可能なASCII文字のみを含む2つの文字列を使用します。最初の文字列(2つのうちの最初の文字列)を印刷することから始めます。次に、元の単語の文字をランダムに選択し、アニメートする単語の対応する文字に変更します。言葉の長さが等しくないとき、あなたはスペースでパッドにそれらをしなければなりません。

すべての文字が変更されるまでこれを続けますが、特定のインデックスの文字を複数回変更することはありません。以下に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

文字を変更し、1秒単位で新しい文字列を出力する関数または完全なプログラムを作成する必要があります。入力形式は緩やかですが、出力形式は厳密です。

これはなので、バイト単位の最短コードが優先されます。

いくつかのテストケース(フォーム:)init -> final

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

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


Pythonコードは有効ではないと思いますか?コメントされていないコメントがあるからですか?
コナーオブライエン

文字列の長さに制限はありますか?
タイタス

@ ConorO'Brien、そうそう...おっと:p
ダニエル

@タイタス、あなたの言語が処理できるものは何でも
ダニエル

回答:



5

MATL、33バイト

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

MATL Online試しください。ページが更新されない場合は、「実行」をもう一度押す必要があります。

または、このバージョン35バイト)は、新しい文字列が表示される前に画面を削除します。その結果、出力は「その場で変更」されます。


これには1秒の一時停止がありますか?私の電話では動きません。
ダニエル

@Dopappはい、最後1Y.はループ内の一時停止です。Chromeを使用してコンピューターから動作します
ルイスメンドー

@Dopapp使用しているオペレーティングシステムは何ですか?
-Suever

@ Suever、iOS9。–
ダニエル

1
@Dopappはまだいくつかの問題を解決しているので、まだあるかどうかをお知らせください。
-Suever

2

Perl、131 + 4(-F -l)= 135バイト

@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

実行する必要性-F-lフラグ、および-M5.010(または-E)。perlのバージョンが少し古い場合は-an、コマンドラインに追加する必要があることに注意してください(表示するには以下を追加しますが、必要ではありません)。例えば ​​:

$ 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

これはもっと短くなる可能性があると確信していますが、どのように...まだ見つけられませんでした!それでも、私はこれが悪い答えだとは思いませんし、うまくいけば誰かがそれを短くするように促されます(またはまったく異なるアイデアを持っています!)。



2

C#299バイト

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

非ゴルフ

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バイト

+3を含む -n

最終改行なしでSTDINに文字列を与える

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}

図のように機能しますが、置き換えます \xhhれているとおりに機能しますが、要求されたスコアを取得するためにリテラル文字にます。

この使い方\Kは新しいと思います...


いつものように素晴らしい!これがどのように機能するかを理解するためにしばらく時間がかかりました!\K確かに素晴らしい使用。\0コードには2つあり\xff、対応するリテラル文字で置き換えることができるため、バイト数は実際には108 であることに注意してください。また、表示されなかったかもしれませんが、入力形式は無料なので、おそらくセパレータとしての `->`よりもソートされたもの。
ダダ

@ダダああそう。ありがとう。開発中はリテラル文字を使用しないため、バイトカウントを調整する際に見落としがちです。もう一つのセパレータは、確かに3つのバイトまで獲得することができますが、私はちょうどそれを残しておきますので、それは、つまらない変更だ
トンHospel

もちろんです。すべてのソリューションを再集計するわけではありませんが、それらを試してみて、その場合、カウントしてはいけない4バイトが表示されるようになりました;)
ダダ

1

Python 3、214バイト

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)

できた!


0

Javaの、456の 454 437 428バイト

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

ゴルフをしていない:

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

編集: CAD97でマイナス2バイト

編集: Kevin Cruijssenによるマイナス17バイト(サイズを保持jするために新しい変数xを作成する代わりに再利用することで提案をわずかに変更しました)

編集:マイナス9バイト


2つのArrays::copyOf呼び出しに不要な空白がある
-CAD97

@ CAD97が言ったように、いくつかの不要な空白を削除できます。配列でも:String[]schar[]a。また、最初のforループをゴルフできますfor(;j<l;i.add(j++);Random r=new Random();直接削除して使用できnew Random().nextInt(i.size())ます。また,x、intのリストに追加して、while-loopにアクセスすることもできます。while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}そして、ゴルフにはまだ足りないものがあります。
ケビンCruijssen

0

PHP、123 121バイト

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

ファイルとして保存、実行php <filename> <string1> <string2>(またはphp-cgi

壊す

<?=$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バイト

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

説明:

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

遅延は、Javaインタープリターを使用した場合にのみ機能し、オンラインインタープリターでは機能しません。

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

オンラインで試してください(1 msに設定された遅延)


0

JavaScript(ES6)+ HTML、210バイト

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

カレー構文を使用して呼び出されます: f("from this")("to this")

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

テストスニペット

inputここで動作するには、上括弧を必要とします。

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

ルビー、106バイト

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

オンラインでお試しください!

いいよ。それがダウン投票の原因である場合、Try It Onlineリンクでこれ以上のトリックはありません。そうでない場合は、私が間違っていることを教えてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.