使我成为糟糕的淡入淡出动画……请


15

正如标题所谨慎建议的那样,您的任务是使一个单词的淡入淡出动画变成真正的第二个单词。

您可能会问这个“淡入淡出动画” 到底什么?

要制作壮观的(非常糟糕的)淡入淡出动画,请使用两个仅包含可打印ASCII字符的字符串。首先打印起始字符串(两个中的第一个)。然后,您随机选择原始单词中的一个字符,然后将其更改为要为其设置动画的单词中的相应字符。当单词的长度不相等时,必须用空格垫他们。

您将继续执行此操作,直到所有字符都被更改为止,但是您将不会多次更改某个索引处的字符。这是一个示例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

您必须编写一个函数或完整程序来更改字母,然后以一秒为增量打印新字符串。输入格式宽松,但输出格式严格。

这是,因此以字节为单位的最短代码获胜。

一些测试用例(表格:)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代码无效?因为您没有评论?
科纳·奥布莱恩

字符串长度有限制吗?
泰特斯(Titus)

@ ConorO'Brien,哦,是的。...oops:p
Daniel Daniel

@Titus,我想您的语言可以处理的任何事情
Daniel

Answers:



5

MATL,33字节

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

MATL Online上尝试。如果该页面不起作用,则可能需要刷新该页面,然后再次按“运行”。

或者,此版本35个字节)在显示每个新字符串之前删除屏幕,这导致输出被“就地修改”:


请问有一秒钟的停顿吗?它无法在我的手机上运行。
丹尼尔(Daniel)

@Dopapp是的,最后1Y.是循环中的暂停。它为我从我使用Chrome电脑
路易斯Mendo

@Dopapp您正在使用什么操作系统?
Suever 2016年

@Suever,iOS的9
丹尼尔

1
@Dopapp我们仍在解决一些问题,因此,如果您还有其他问题,请告诉我们。
Suever 2013年

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

Python 2中,171个169 168 163字节

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

测试用例在ideone上


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您的代码中有两个\xff,并且可以用相应的文字字符替换,所以字节数实际上是108。此外,也许您没有看到它,但是输入格式是免费的,所以可能有比`->`作为分隔符的排序器。
达达

@达达嗯,对。谢谢。在开发过程中,我从不使用文字字符,因此在调整字节数时很容易错过一些东西。另一个分隔符确实可以获取最多3个字节,但这是一个无趣的更改,因此我将其保留
Ton Hospel 16/09/27

是的,当然。我没有介绍您所有的解决方案,但仅当我尝试它们时,这种情况才让我看到您不应该算在内的那4个字节;)
Dada

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

编辑:减2字节乘CAD97

编辑:由凯文·克鲁伊森(Kevin Cruijssen)减去17个字节(我通过重用j而不是创建一个新变量x来保存大小来稍微更改了建议)

编辑:负9字节


您的两个Arrays::copyOf呼叫中有多余的空格
CAD97

如@ CAD97所说,您可以删除一些不必要的空格;也在数组:String[]schar[]a。另外,您可以打第一个循环高尔夫球for(;j<l;i.add(j++);;您可以删除Random r=new Random();,并直接使用它:new Random().nextInt(i.size()); 您还可以将,x整数添加到int列表中,并有机会在while循环中加入while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...},可能还有更多我想念的高尔夫运动。
凯文·克鲁伊森

0

PHP 123字节

<?=$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毫秒)


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

使用curry语法调用: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

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

在线尝试!

哦那好吧。如果是在线投票失败的原因,那么在“在线试用”链接中不会出现太多麻烦。如果没有,请让我知道我在做什么错

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.