Mô phỏng thẻ tuần hoàn bitwise


11

Thử thách

Cho hai chuỗi ở bất kỳ định dạng I / O mặc định nào, hãy làm như sau:

LƯU Ý: Thử thách sẽ đề cập đến chuỗi đầu tiên là "dữ liệu" và chuỗi thứ hai được gọi là "chương trình".

  1. Thay đổi chương trình thành một chuỗi vô hạn, đó chỉ là chương trình được lặp lại vô hạn (ví dụ 10-> 1010101010...). Thách thức sẽ gọi đây là "chương trình vô hạn"
  2. Trong khi dữ liệu không trống, hãy thực hiện các thao tác sau trong khi lặp qua chương trình vô hạn:

    a. Nếu lệnh hiện tại là "0", hãy xóa bit ngoài cùng bên trái trong dữ liệu. Nếu dữ liệu trống, "0" không làm gì cả.

    b. Nếu lệnh hiện tại là "1", hãy thêm ký tự tiếp theo trong chương trình vào dữ liệu nếu bit ngoài cùng bên trái trong dữ liệu là một.

    c. Nếu bây giờ dữ liệu không trống, hãy xuất dữ liệu.

Các trường hợp thử nghiệm

Dữ liệu là phía bên trái của đầu vào và chương trình là phía bên phải.

100, 0 --> 00, 0
1111, 1 --> 11111, 111111, 1111111, ...
10, 011 --> 0, 0, 0
1110, 011 --> 110, 1101, 11010, 1010...

Ghi chú

  • Dữ liệu và chương trình sẽ chỉ bao gồm 0 và 1
  • Đối với dữ liệu / chương trình không dừng lại, chương trình của bạn không cần dừng lại.
  • Dữ liệu và chương trình sẽ không trống trong đầu vào.
  • Bạn có thể có nhiều dòng mới và hàng đầu
  • Lỗ hổng tiêu chuẩn bị cấm
  • Bạn có thể sử dụng bất kỳ định dạng I / O thuận tiện

Như mọi khi với , mã ngắn nhất sẽ thắng !


@Sanchises Có vẻ như một đường biên trùng lặp với điều đó, nhưng bạn phải nhận được kết quả ở một thế hệ nhất định và đó là cho bất kỳ hệ thống thẻ tuần hoàn nào.
MilkyWay90

trong trường hợp thử nghiệm đầu tiên, 100đi đến 10cmd 0, với định nghĩa là "xóa bit trái nhất trong dữ liệu." sẽ không bit tận cùng bên trái của 100được 1?
Giô-na

@Jonah Oh, đã bỏ lỡ điều đó
MilkyWay90

trong trường hợp (b), nếu bạn thực hiện nối thêm, con trỏ lệnh có di chuyển đúng một hoặc hai ký tự không?
Sparr

@Sparr Nó di chuyển đúng một. Xem phần có nhãn Thử thách.
MilkyWay90

Câu trả lời:


4

Haskell, 77 71 62 byte

f@(d:e)#(p:q)=f:[e,f++take d q]!!p#q
_#_=[]
a!b=tail$a#cycle b

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

Chỉnh sửa: -9 byte nhờ @xnor.


1
Trong dòng đầu tiên, bạn có thể làm f:[e,f++take d q]!!p#q.
xnor

2

C # (Trình biên dịch tương tác Visual C #) , 82 byte

m=>n=>{for(int i=0;m!="";Print(m=n[i++]<49?m.Substring(1):m[0]>48?m+n[i]:m))n+=n;}

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


tầm quan trọng của 48 và 49, vì tò mò?
Giô-na

1
@Jonah 48 là giá trị ASCII của 0và 49 là giá trị ASCII của1
Hiện thân của sự thiếu hiểu biết

bạn không nên sử dụng 0 và 1 thay vào đây: P
ASCII-only

@ ASCII-chỉ tôi đang sử dụng một chuỗi, không phải là một mảng.
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance tại sao không sử dụng một ListSkip, hoặc một cái gì đó tương tự
ASCII-chỉ

1

J , 65 byte

(([:(][echo)(}.@[)`([,{.@[#1{],])@.({.@]));1|.])&>/^:(0<0#@{>)^:5

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

Tôi có thể chơi golf này sau này. Lưu ý 5cuối cùng sẽ là vô hạn _trong chương trình thực tế, nhưng tôi đã để nó ở đó để làm cho việc chạy các ví dụ không tạm dừng dễ dàng hơn.



1

05AB1E , 24 21 byte

[¹Nèi¬i¹N>è«}ë¦}DõQ#=

Lấy chương trình làm đầu vào đầu tiên và dữ liệu làm đầu vào thứ hai.

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

Giải trình:

[             # Start an infinite loop:
 ¹Nè          #  Get the N'th digit of the first (program) input
              #  (NOTES: N is the index of the infinite loop;
              #          indexing in 05AB1E automatically wraps around)
    i         #  If this digit is 1:
     ¬        #   Push the head of the current data (without popping it)
              #   (will take the second (data) input implicitly if it's the first iteration)
      i     } #   If this head is 1:
       ¹N   #    Get the (N+1)'th digit of the first (program) input
           «  #    And append it to the current data
    ë }       #  Else (the digit is a 0 instead):
     ¦        #   Remove the first digit from the current data
              #   (will take the second input (data) implicitly if it's the first iteration)
 DõQ          #  If the current data is an empty string:
    #         #   Stop the infinite loop
 =            #  Print the current data with trailing newline (without popping it)

1

Ruby , 62 59 byte

->c,d{p(d)while(a,*c=c;b,*d=d;c<<a;[]!=d=[b]*a+d+c[0,a*b])}

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

Làm sao

  • Nhận bit đầu tiên từ mã cvà dữ liệu d, gọi cho họ ab. Đặt alại vào cuối c.
  • Đặt lại bvào đầu dnếu a==1. Điều này có thể được rút ngắn để[b]*a
  • Đặt byte đầu tiên cở cuối dif a==1 and b==1. Điều này có thể được rút ngắn để c[0,a*b].
  • Nếu chúng ta có nhiều dữ liệu hơn, hãy in và lặp lại.


0

Thạch , 40 byte

;€Ø2œịxØ1œị$Ʋ$Ḋ€2,1œị$?1¦ṙ€1$2¦µ⁺1ịGṄƲ¿Ḣ

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

Tôi đã giả sử các dòng mới theo dõi là ok. Tôi cũng đã đi với một danh sách hai danh sách số không và số một làm đầu vào và đầu ra cho thiết bị xuất chuẩn.


0

Python 1 , 75 byte

a,b=input()
while a:b=b[1:]+b[:1];a=[a[1:],a+b[:1]*a[0]][b[0]];print a or''

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


Đẹp! Một niggle: đối với dữ liệu '100', chương trình '0', điều này sẽ in chuỗi trống một lần: nhưng quy tắc c nói "Nếu bây giờ dữ liệu không trống , hãy xuất dữ liệu."
Chas Brown

@ChasBrown Lỗi đánh máy nhỏ, tôi đang chờ làm rõ từ OP nếu các dòng mới theo dõi vẫn ổn
Hiện thân của sự thiếu hiểu biết

@ChasBrown OP cho biết nhiều dòng mới được cho phép, xem tại đây
Hiện thân của sự thiếu hiểu biết

Nhưng sau khi chuyển sang mảng 1 và 0, bây giờ bạn đang in một mảng trống []thay vì dòng mới trên ví dụ: dữ liệu [1,0,0], chương trình [0].
Chas Brown

1
trăn 1? python 2 không hoạt động?
ASCII chỉ


0

C ++ (gcc) , 294 289 272 byte

-22 byte nhờ @ceilingcat

#import<cstdio>
#import<queue>
void a(char*e,char*p){std::queue<char>d;for(;*e;)d.push(*e++);for(char*c=p;d.size();c=*++c?c:p){*c-49?d.pop():d.front()-48?d.push(c[1]?c[1]:*p):a("","");if(d.size()){for(int i=0;i++<d.size();d.pop())d.push(putchar(d.front()));putchar(32);}}}

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

Thuật toán khá đơn giản. Sao chép dữ liệu vào hàng đợi và lặp lại các vòng lặp thông qua chương trình. Trên "0", nó loại bỏ phần tử đầu tiên trong hàng đợi ("bit" đầu tiên). Trên 1, nó thêm "bit" tiếp theo của chương trình vào dữ liệu nếu "bit" đầu tiên của dữ liệu là 1. Sau đó, nó lặp qua dữ liệu, in "bit" bằng "bit" và cuối cùng in ra một không gian để tách các mục dữ liệu liên tiếp.


@ceilingcat Sử dụng thông minh (ab) c[1]! Cập nhật.
Neil A.
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.