Làm cho tôi một phim hoạt hình phai xấu


15

Nhiệm vụ của bạn là, như tiêu đề kín đáo gợi ý, tạo ra một hình ảnh động mờ của một từ biến thành một từ thứ hai cho bạn thực sự.

Chính xác thì "hoạt hình mờ" này bạn có thể yêu cầu là gì?

Để tạo một hiệu ứng mờ dần (ly xấu) ngoạn mục, bạn lấy hai chuỗi sẽ chỉ chứa các ký tự ASCII có thể in được. Bạn bắt đầu bằng cách in chuỗi bắt đầu của bạn (đầu tiên của hai). Sau đó, bạn chọn ngẫu nhiên một ký tự trong từ gốc và thay đổi nó thành ký tự tương ứng trong từ bạn muốn tạo hiệu ứng. Khi các từ có độ dài không bằng nhau, bạn phải đệm chúng bằng khoảng trắng.

Bạn tiếp tục làm điều này cho đến khi tất cả các nhân vật đã được thay đổi, nhưng bạn sẽ không thay đổi nhân vật ở một chỉ số nhất định nhiều lần . Dưới đây là một ví dụ 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

Bạn phải viết một hàm hoặc chương trình đầy đủ thay đổi một chữ cái và sau đó in chuỗi mới với gia số của một giây. Các định dạng đầu vào là lỏng lẻo, nhưng định dạng đầu ra là nghiêm ngặt.

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.

Một số trường hợp thử nghiệm (Mẫu init -> final:):

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

Tham chiếu thực hiện trong 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


Tôi không nghĩ mã trăn là hợp lệ? Bởi vì bạn có những bình luận thiếu sót?
Conor O'Brien

Bất kỳ hạn chế về độ dài chuỗi?
Tít

@ ConorO'Brien, oh yeah .... oops: p
Daniel

@Titus, bất cứ điều gì ngôn ngữ của bạn có thể xử lý tôi đoán
Daniel

Câu trả lời:



5

MATL , 33 byte

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

Hãy thử nó tại MATL Online . Bạn có thể cần làm mới trang và nhấn "Chạy" lại nếu nó không hoạt động.

Ngoài ra, phiên bản này ( 35 byte ) xóa màn hình trước khi mỗi chuỗi mới được hiển thị, dẫn đến kết quả đầu ra bị "sửa đổi tại chỗ":


Điều này có tạm dừng một giây? Nó không chạy trên điện thoại của tôi.
Daniel

@Dopapp Có, cuối cùng 1Y.là tạm dừng trong vòng lặp. Nó hoạt động với tôi từ máy tính của tôi bằng Chrome
Luis Mendo

@Dopapp Bạn đang sử dụng hệ điều hành nào?
Suever

@Suever, iOS 9.
Daniel

1
@Dopapp chúng tôi vẫn đang giải quyết một số vấn đề vì vậy hãy cho chúng tôi biết nếu bạn còn bất kỳ vấn đề nào nữa.
Suever

2

Perl, 131 + 4 ( -F -l) = 135 byte

@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

Nhu cầu -F-lcờ để chạy, cũng như -M5.010(hoặc -E). Lưu ý rằng nếu phiên bản perl của bạn hơi cũ, bạn sẽ cần thêm -anvào dòng lệnh của mình (mà tôi sẽ thêm quá dưới đây để hiển thị nó, nhưng không cần thiết). Ví dụ :

$ 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

Tôi khá chắc chắn rằng điều này có thể ngắn hơn, nhưng tôi không thể tìm ra cách ... chưa! Tuy nhiên, tôi không nghĩ rằng đây là một câu trả lời tồi và hy vọng ai đó sẽ được truyền cảm hứng để làm cho nó ngắn hơn (hoặc có một ý tưởng hoàn toàn khác!).


2

Python 2, 171 169 168 163 byte

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

Các trường hợp thử nghiệm là trên ideone


2

C # 299 byte

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

Ung dung

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 byte

Bao gồm +3 cho -n

Cung cấp chuỗi trên STDIN mà không có dòng mới

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}

Hoạt động như được hiển thị, nhưng thay thế \xhhbằng các ký tự theo nghĩa đen để có được số điểm yêu cầu.

Cách sử dụng \Knày là mới tôi nghĩ ...


Tuyệt vời, như mọi khi! Mất một lúc để tìm hiểu làm thế nào điều này hoạt động! Đẹp sử dụng \Kthực sự. Lưu ý rằng có hai \0mã trong mã của bạn cũng như \xffcó thể được thay thế bằng các ký tự bằng chữ tương ứng, vì vậy số byte thực sự là 108. Ngoài ra, có thể bạn không nhìn thấy nó, nhưng định dạng đầu vào là miễn phí, vì vậy có lẽ có một cái gì đó sắp xếp hơn `->` như một dấu phân cách.
Dada

@Dada À đúng rồi. Cảm ơn. Trong khi phát triển, tôi không bao giờ sử dụng các ký tự theo nghĩa đen, vì vậy thật dễ dàng bỏ lỡ mọi thứ khi điều chỉnh số byte. Một trình phân tách khác thực sự có thể đạt tới 3 byte, nhưng đó là một thay đổi không thú vị, vì vậy tôi sẽ chỉ để lại nó
TonMedel

Tất nhiên rồi. Tôi không kể lại tất cả các giải pháp của bạn, nhưng chỉ khi tôi thử nghiệm chúng, và trong trường hợp đó, tôi đã thấy 4 byte mà bạn không nên đếm;)
Dada

1

Python 3, 214 byte

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)

Nghĩa là nó!


0

Java, 456 454 437 428 byte

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

Ung dung:

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

Chỉnh sửa: trừ 2 byte bằng CAD97

Chỉnh sửa: trừ 17 byte bởi Kevin Cruijssen (Tôi đã thay đổi một chút đề xuất bằng cách sử dụng lạij thay vì tạo một biến mới xđể giữ kích thước)

Chỉnh sửa: trừ 9 byte


Bạn có khoảng trắng không cần thiết trong hai Arrays::copyOfcuộc gọi của mình
CAD97

Như @ CAD97 đã nói, bạn có thể loại bỏ một số khoảng trắng không cần thiết; cũng tại các mảng: String[]schar[]a. Ngoài ra, bạn có thể chơi gôn vòng lặp đầu tiên của mình : for(;j<l;i.add(j++);; Bạn có thể loại bỏ Random r=new Random();và sử dụng nó trực tiếp : new Random().nextInt(i.size()); Bạn cũng có thể thêm ,xvào danh sách các số nguyên while((x=i.size())>0){...j=(int)i.remove(new Random().nextInt(x));...}và có thể có vòng lặp trong vòng Và có thể có nhiều thứ hơn để chơi golf mà tôi đang thiếu.
Kevin Cruijssen

0

PHP, 123 121 byte

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

lưu dưới dạng tệp, thực thi với php <filename> <string1> <string2>(hoặcphp-cgi )

phá vỡ

<?=$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 byte

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

Giải trình:

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

Độ trễ chỉ hoạt động khi sử dụng trình thông dịch Java, không phải trong trình thông dịch trực tuyến.

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

Dùng thử trực tuyến (độ trễ được đặt thành 1 ms)


0

JavaScript (ES6) + HTML, 210 byte

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

Được gọi bằng cú pháp cà ri: f("from this")("to this") .

Dọn dẹp 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()
}

Kiểm tra đoạn trích

Yêu cầu đóng nẹp trên inputđể làm việc ở đây.

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 byte

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

Hãy thử trực tuyến!

Ồ, được rồi. Không còn rick lăn trong liên kết Dùng thử trực tuyến, nếu đó là những gì gây ra downvote. Nếu không, xin vui lòng cho tôi biết những gì tôi đang làm sai

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.