Зробіть мені погану згасаючу анімацію ... будь ласка


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 є дійсним? Тому що у вас є незаперечні коментарі?
Conor O'Brien

Будь-яке обмеження по довжині рядка?
Тит

@ ConorO'Brien, о так .... oops: p
Даніель

@Titus, будь-що, з чим може справитись ваша мова, я думаю
Даніель,

Відповіді:



5

MATL , 33 байти

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

Спробуйте в MATL Online . Можливо, вам доведеться оновити сторінку і знову натиснути «Виконати», якщо вона не працює.

Крім того, ця версія ( 35 байт ) видаляє екран перед відображенням кожної нової рядки, що призводить до того, що результат буде "змінено на місці":


Це має одну секунду пауз? Він не працює на моєму телефоні.
Даніель

@Dopapp Так, остаточним 1Y.є пауза в циклі. Це працює для мене з мого комп’ютера за допомогою Chrome
Луїс Мендо

@Dopapp Яку операційну систему ви використовуєте?
Сьювер

@Suever, iOS 9.
Даніель

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

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. Також, можливо, ви цього не бачили, але формат введення вільний, тому, ймовірно, є щось сортування, ніж `->` як роздільник.
Дада

@Dada Ah правильно. Спасибі. Під час розробки я ніколи не використовую буквальні символи, тому легко пропускати речі, коригуючи кількість байтів. Інший роздільник дійсно може набрати до 3 байтів, але це нецікаві зміни, тому я просто залишу його
Тон Євангелія

Так, звичайно. Я не переказую всі ваші рішення, але лише коли я експериментую над ними, і в такому випадку це змусило мене побачити ті 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));
    }
}
}

Редагувати: мінус 2 байти за CAD97

Редагувати: мінус 17 байт Kevin Cruijssen (я трохи змінив пропозицію, повторно використовуючи jзамість створення нової змінної xдля утримання розміру)

Редагувати: мінус 9 байт


У вас є зайві пробіли у двох Arrays::copyOfдзвінках
CAD97,

Як сказав @ CAD97, ви можете видалити кілька непотрібних пробілів; також у масивах: String[]sі char[]a. Крім того , ви можете грати в гольф ваш перший для циклу: for(;j<l;i.add(j++);; Ви можете видалити Random r=new Random();та використовувати його безпосередньо new Random().nextInt(i.size()):; Ви також можете додати ,xдо списку вкладень і шанси пройти цикл в той час, while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}і, мабуть, більше для гольфу, чого мені не вистачає.
Кевін Кройсейсен

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 мс)


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

Спробуйте в Інтернеті!

О, гаразд. Немає більше прокатки рикків за посиланням "Спробуйте в Інтернеті", якщо саме це спричиняє сутінки. Якщо ні, будь ласка, дайте мені знати, що я роблю не так

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.