Сделайте мне плохую анимацию исчезновения ... пожалуйста

15

Ваша задача состоит в том, чтобы, как следует из названия, сделать плохую анимацию исчезновения одного слова, превращающегося во второе слово для вас по-настоящему.

Что именно является это «замирание анимации» вы можете спросить?

Чтобы создать эффектную (довольно плохую) анимацию затухания, вы берете две строки, которые будут содержать только печатные символы ASCII. Вы начинаете с печати вашей стартовой строки (первой из двух). Затем вы случайным образом выбираете символ в исходном слове и заменяете его на соответствующий символ в слове, которое хотите анимировать. Когда слова имеют неравную длину, вы должны дополнить их пробелами.

Вы продолжаете делать это до тех пор, пока все символы не будут изменены, но вы не будете менять персонажа с определенным индексом более одного раза . Вот пример ввода / вывода:

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
Даниил
источник
7
Вонючие бесконечные циклы по умолчанию запрещены. Приятно пахнущие тоже.
Мартин Эндер
Я не думаю, что код Python является действительным? Потому что у вас есть комментарии без комментариев?
Конор О'Брайен
Есть ли ограничения на длину строки?
Тит
@ ConorO'Brien, о да .... упс: р
Даниэль
@Titus, ничего ваш язык может работать , я думаю
Daniel

Ответы:

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

Ungolfed

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

Ява, 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));}}}

Ungolfed:

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 байт Кевин Круйссен (я немного изменил предложение, повторно используя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
}
Titus
источник
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 мс)

Neorej
источник
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}}

Попробуйте онлайн!

О хорошо Больше не нужно катиться по ссылке «Попробуй онлайн», если это то, что вызывает отрицательные отзывы. Если нет, пожалуйста, дайте мне знать, что я делаю неправильно

Значение чернил
источник