Phân tích xáo trộn quá tay


13

Rod đang điều hành một trò chơi bài giữa hai người chơi: George và Tim. Hiện tại, Tim đang xáo trộn các thẻ. Rod nghi ngờ rằng Tim đang cố gắng gian lận, vì vậy anh ta cần sự giúp đỡ của bạn để kiểm tra xem việc xáo trộn có công bằng không.

Tim đang thực hiện việc xáo trộn quá mức: anh ta cắt một đống thẻ từ dưới boong, sau đó cắt các phần khác nhau từ đỉnh cọc lên trên boong và lặp lại quá trình một vài lần.

Rod có đôi mắt đại bàng và có thể thấy chính xác có bao nhiêu thẻ Tim đang cắt mỗi lần, tuy nhiên anh ta không thể tính toán và theo dõi các thẻ nhanh như Tim đang xáo trộn. Đây là nơi bạn đến: Rod muốn bạn viết một chương trình hoặc chức năng lấy thông tin xáo trộn chi tiết và xác định xem việc xáo trộn là công bằng, yếu hay lừa.

  • Nếu sau khi xáo trộn, ít hơn 25 cặp thẻ liền kề vẫn liền kề (theo cùng một thứ tự), thì việc xáo trộn là công bằng và trò chơi có thể tiếp tục.
  • Nếu ít nhất 25 (nhưng không phải tất cả) các cặp thẻ liền kề vẫn liền kề nhau, thì việc xáo trộn là yếu và Rod sẽ bon chen Tim qua đầu và yêu cầu anh ta xáo trộn thêm một số.
  • Nếu tất cả các thẻ vẫn ở cùng một vị trí ở cuối, thì Tim rõ ràng là gian lận và Rod sẽ đánh anh ta bằng một con cá hồi lớn.

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.

Đầu vào:

Bạn sẽ nhận được một chuỗi các số từ 0 đến 52 (cả hai loại) được phân tách bằng dấu cách, trên một số dòng, trong đó mỗi dòng đại diện cho một vòng xáo trộn bắt đầu và kết thúc với tất cả các thẻ được xếp chồng lên nhau.

Trên mỗi dòng, số đầu tiên là số lượng thẻ Tim cắt từ dưới cùng của bộ bài, và mỗi số tiếp theo là một số thẻ anh ta thả từ tay lên trên cỗ bài. Nếu bất kỳ thẻ nào còn lại sau số cuối cùng trên một dòng, bạn nên cho rằng Tim đặt chúng lên trên boong.

Đầu vào được đảm bảo là hợp lệ. Có ít nhất một dòng số và mỗi dòng chứa ít nhất 2 số. Số đầu tiên trên mỗi dòng không nhỏ hơn tổng của tất cả các số khác trên cùng một dòng. Một dòng mới theo dõi là tùy chọn, bạn có thể cho rằng đầu vào có một hoặc nó không có.

Đầu ra:

Chương trình của bạn nên in / trả lại "công bằng" nếu xáo trộn công bằng, "yếu" nếu xáo trộn yếu và "lừa" nếu Tim giữ tất cả các thẻ theo cùng một thứ tự. Một dòng mới theo dõi là tùy chọn.

Thí dụ:

Bộ bài được cho là có 52 lá bài, nhưng với mục đích trình diễn, tôi sẽ sử dụng bộ bài nhỏ hơn gồm 10 lá bài.

Đầu vào:

5 3 1
4 2 2

Boong ban đầu, nhìn từ trên xuống: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9trong tay)
35 6 7 0 1 2 3 4( 8 9trong tay)
18 5 6 7 0 1 2 3 4( 9trong tay)
cuối dòng ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4trong tay)
21 2 9 8 5 6 7 0( 3 4trong tay)
23 4 1 2 9 8 5 6 7 0
4 cặp còn lại liền kề:(3 4) (1 2) (5 6) (6 7)

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

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Đầu ra: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Đầu ra: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Đầu ra: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Đầu ra: weak


26 13
26 13
26 13
26 13

Đầu ra: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Đầu ra: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Đầu ra: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Đầu ra: fair

Yêu cầu:

  • Nếu bạn viết một hàm, nó có thể đọc từ đầu vào tiêu chuẩn hoặc nhận đầu vào dưới dạng một tham số chuỗi đơn. Ngoài ra, chức năng có thể in ra đầu ra hoặc trả lại.
  • Chương trình phải được chạy trong Linux bằng phần mềm có sẵn miễn phí.
  • Mã nguồn chỉ được sử dụng các ký tự ASCII.
  • Không có sơ hở tiêu chuẩn.

2
Tại sao hạn chế đối với ASCII? Nhiều ngôn ngữ (APL, mã máy, TI-BASIC) hoàn toàn không sử dụng ASCII, vì vậy bạn hoàn toàn không đồng ý với những ngôn ngữ đó.
lirtosiast

@ThomasKwa Bởi vì tôi không thích các vấn đề liên quan đến việc hiển thị và đếm các ký tự không phải ASCII. Một số ngôn ngữ có đại diện hoặc thay thế ASCII. Tôi nghĩ rằng đó không phải là một hạn chế rất khắc nghiệt, và nó hơi san bằng sân chơi.
aditsu

Tôi nghĩ rằng một hệ thống tính điểm như "Các mục nhập chỉ sử dụng các ký tự ASCII có thể in sẽ có số byte của chúng nhân với log (95) / log (256)" sẽ là một lựa chọn tốt hơn nếu bạn muốn khuyến khích một cách công bằng các lần gửi ASCII có thể in. Lý do là nội dung thông tin của các mục có cùng số điểm sẽ bằng nhau. Cá nhân, tôi vẫn thích chấm điểm đơn giản bằng byte.
lirtosiast

@ThomasKwa Ok, cái này thì sao? Chỉ các ký tự unicode có thể in, đếm byte trong mã hóa UTF-8
aditsu 14/07/2015

Câu trả lời:



4

CJam, 76 75 byte

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Hãy thử trực tuyến trong trình thông dịch CJam .


5
LOL, "cá hồi" :)
aditsu

2

JavaScript, 292 289 byte

Điều này có thể có thể lấy thêm một số byte được vắt ra từ nó, nhưng bây giờ nó là bước đầu tiên nhanh chóng:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

EDIT: Đã lưu 3 byte bằng cách sử dụng lại giá trị itừ vòng lặp xây dựng boong khi đếm số lượng thẻ liền kề.

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.