나를 나쁜 페이드 애니메이션으로 만들어주세요…


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

문자를 변경 한 다음 1 초 단위로 새 문자열을 인쇄하는 함수 또는 전체 프로그램을 작성해야합니다. 입력 형식이 느슨하지만 출력 형식이 엄격합니다.

입니다 바이트의 승리에 너무 짧은 코드.

일부 테스트 사례 (형식 :) init -> final:

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

파이썬 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


파이썬 코드가 유효하지 않다고 생각합니까? 주석 처리되지 않은 의견이 있으십니까?
코너 O'Brien

문자열 길이에 제한이 있습니까?
Titus

@ ConorO'Brien, oh yeah .... 죄송합니다 : p
Daniel

@Titus, 귀하의 언어로 처리 할 수있는 모든 것
Daniel

답변:



5

MATL , 33 바이트

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

MATL Online 에서 사용해보십시오 . 페이지를 새로 고침하고 작동하지 않으면 "실행"을 다시 눌러야 할 수도 있습니다.

또는 이 버전 ( 35 바이트 )은 각각의 새 문자열이 표시되기 전에 화면을 삭제하여 결과가 "제자리에서 수정"됩니다.


1 초의 일시 정지가 있습니까? 휴대 전화에서 실행되지 않습니다.
다니엘

@Dopapp 예, 마지막 1Y.은 루프 내에서의 일시 중지입니다. Chrome을 사용하는 컴퓨터에서 작동합니다.
Luis Mendo

@Dopapp 어떤 운영 체제를 사용하고 있습니까?
Suever

@Suever, iOS 9
다니엘

1
@Dopapp 우리는 여전히 일부 문제를 해결하고 있으므로 더 이상 알려주십시오.
Suever

2

펄, 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, 171169168163 바이트

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

테스트 사례는 아이디어입니다


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

펄, 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입니다. 또한 보지 못했지만 입력 형식은 무료이므로 아마도 `->`보다 작은 분류기.
Dada

@ 아다 아. 감사. 개발하는 동안 리터럴 문자를 사용하지 않으므로 바이트 수를 조정할 때 쉽게 놓칠 수 있습니다. 또 다른 구분 기호는 실제로 최대 3 바이트를 얻을 수 있지만 흥미롭지 않은 변경 사항이므로 그대로 두겠습니다
Ton Hospel

물론입니다. 모든 솔루션을 계산하지는 않지만 실험을 할 때만 해당됩니다.이 경우 4 바이트를 계산해서는 안됩니다.)
Dada

1

파이썬 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

자바, 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 바이트 (재사용하여 제안을 약간 변경했습니다.jx 크기를 유지하기 위해 새 변수 를 만드는 대신 )

편집 : 마이너스 9 바이트


두 번의 Arrays::copyOf호출 에 불필요한 공백이 있습니다
CAD97

@ CAD97이 말했듯이 불필요한 공백을 제거 할 수 있습니다. 또한 배열에서 : String[]schar[]a. 또한 첫 번째 for-loop를 골프화 할 수 있습니다. for(;j<l;i.add(j++);; Random r=new Random();직접 제거 하여 사용할 수 있습니다. new Random().nextInt(i.size()); 당신은 또한 ,xint의 목록에 추가 하고 while 루프를 할 수 있습니다. while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}그리고 내가 놓친 골프에 더 많은 것이있을 것입니다.
Kevin Cruijssen

0

PHP, 123121 바이트

<?=$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"'

온라인으로 시도 (지연 1ms로 설정)


0

자바 스크립트 (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}}

온라인으로 사용해보십시오!

아, 알겠습니다 Downvotes를 유발하는 원인이라면 온라인 사용해보기 링크에서 더 이상 구르지 않아도됩니다. 그렇지 않은 경우 내가 뭘 잘못하고 있는지 알려주세요

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.