Bão Matthew và các tia sét


27

Thử thách

Lấy cảm hứng từ thử thách nàycơn bão Matthew khó chịu , chúng tôi sẽ tạo ra một số tia sét một cách linh hoạt.

n = 15:

   \
   /\
  /  \
 /   /
/\  /\
 /  \ \
/   / /\
   /\ \
  / /  \
 /\ \  /\
  /  \ \
 /\  /  
   \
    \
    /\

Đầu vào

Số nguyên dương nxác định độ sâu của vòng sét.

Các quy tắc và ràng buộc

  • /\nên được sử dụng
  • Xác suất dẫn hướng của sét như sau:
    • 25% Chia thành 2 đường dẫn
    • 25% đường dẫn đến ngõ cụt
    • 25% còn lại
    • 25% đúng
    • Có một vài trường hợp ngoại lệ liên quan đến chồng chéo và ngõ cụt bên dưới:
  • Mã không nên mang tính xác định, một tia sét mới nên được tạo ngẫu nhiên mỗi lần
  • Các bu lông không được chồng lên nhau: ví dụ: nếu đã có một bu lông ở bên trái của bu lông hiện tại, thì bu lông hiện tại sẽ kết thúc hoặc đi bên phải, nhưng không đi sang trái hoặc tách ra (trong trường hợp này vẫn áp dụng, trong trường hợp này, nó trở thành kết thúc 50% / 50% đúng)
  • Nếu không tồn tại một đường phân chia có sẵn khác, đường dẫn không nên kết thúc: ví dụ: ban đầu khi chỉ có 1 đường dẫn, đường dẫn không kết thúc cho đến khi nó tách ra, cũng áp dụng khi có nhiều đường dẫn nhưng tất cả ngoại trừ một đường dẫn đã chết , (xác suất trở thành chia 33% / trái 33% / phải 33%) mục tiêu của bạn là chạm đáy
  • Có thể thêm khoảng trắng ở bên trái (tất cả những gì bạn cần chỉ là chiều cao-1)
  • Tuy nhiên, bạn muốn tạo ra bu-lông tùy thuộc vào bạn, bạn có thể đi từ dưới lên, từ trái sang phải, v.v ... Miễn là tất cả các quy tắc trên được thỏa mãn

Một vi dụ khac

n = 10

 \
 /
 \
 /\
  /\
 / /
/\ \
 / /\
 \   \
 /

Bão Matthew rõ ràng đang bắn những tia sáng màu đỏ lên bầu trời, được gọi là các họa tiết

Giữ an toàn và vui chơi golf! Vui lòng chơi golf có trách nhiệm chỉ khi bạn ở trong một khu vực an toàn !!


7
Stay safe and have fun golfing!Cũng có thể chỉ định rằng nếu EAS đình công, hãy từ bỏ mọi thứ và làm theo lệnh! Mã golf không phải là ưu tiên của bạn trong tình huống như vậy.
Erik the Outgolfer 7/10/2016

17
@EriktheGolfer bạn không phải là một tay golf thực thụ.
Màu xanh

4
Tôi không tin rằng "Con đường trung tâm nhất phải là con đường chạm tới mặt đất" phù hợp với phần còn lại của mô tả thế hệ ngẫu nhiên. Ví dụ, ngẫu nhiên có thể tách bu lông ban đầu hai lần và sau đó cho hai bu lông ở giữa kết thúc; làm thế nào khả năng này có thể được ghi đè trong khi vẫn bảo tồn các xác suất được chỉ định?
Greg Martin

Ngoài ra, điều gì xảy ra nếu (ví dụ) hai bước đầu tiên là cả hai phần tách? Sau đó, hai bu lông ở giữa chạm vào nhau, có vẻ như có vấn đề nhưng cũng không được loại trừ bởi các trường hợp đặc biệt.
Greg Martin

@GregMartin Điểm hay ở phần trung tâm, ban đầu tôi đã hy vọng nó tạo ra một tia cân bằng, nhưng bây giờ tôi nghĩ về nó ngay cả khi không có sự ràng buộc đó khoảng 50% thời gian nó sẽ ở đâu đó ở giữa, một độ sâu trong số 15 sẽ chỉ có 1-2% cơ hội trong đó phần lớn đường bên phải hoặc bên trái. Tôi sẽ loại bỏ quy tắc đó. Và đối với phần tách 2 bước, điều duy nhất cần ngăn chặn là không có 2 đường dẫn nào nên 2 đường dẫn tham gia: \/tại bất kỳ điểm nào.
Zukaberg

Câu trả lời:


6

Perl, 92 90 89 84 byte

Bao gồm +1 cho -n

Cho chiều cao trên STDIN:

perl -M5.010 bolt.pl <<< 15

bolt.pl:

#!/usr/bin/perl -n
map{$_=$;until$;=$_,s/.6|3.?/53|16*rand/eg,/3|6/>/36/;say y|3615|\\/ |r}(1x$_.6)x$_

Giải trình

Nếu bạn gọi phần bù của điểm bắt đầu 0 (một điểm nằm ở góc của hộp ký tự), thì ở hàng tiếp theo bạn có thể đi sang trái hoặc phải (hoặc không) và có thể kết thúc bằng điểm trên điểm bù -1,1. Hàng tiếp theo cung cấp -2,0,2khả năng bù trừ có thể, v.v ... Tất cả đều khác nhau bằng 2. Nếu sau đó bạn gọi ký tự ở phía dưới bên trái của một điểm chẵn và ký tự cho số lẻ bên phải phía dưới, bạn có thể mở rộng để gán chẵn hoặc lẻ cho từng vị trí ký tự trên một hàng sao cho xen kẽ và lẻ (trên thực tế toàn bộ mặt phẳng được lát theo mô hình bàn cờ). Một vị trí chẵn có thể có một /hoặc , một vị trí lẻ có thể có \hoặc .

Nhân vật ngay trước a /đang ở một vị trí kỳ lạ nên có thể là \hoặc , nhưng \/bị cấm nên chỉ có thể. Tương tự, ký tự sau a \ phải là một (giả sử hàng được đệm với đủ khoảng trắng ở bên trái và bên phải để ranh giới hàng không có vấn đề). Vì vậy, một tia sét tiếp tục ở hàng tiếp theo luôn trực tiếp bên dưới a \hoặc bên dưới a /. Trong cả hai trường hợp điểm thấp hơn là ở giữa và hàng tiếp theo có thể có một trong những , /, \hoặc /\trực tiếp dưới 2 ký tự đầu. Vì vậy, để tạo hàng tiếp theo, tôi chỉ cần thay thế bất kỳ \hoặc/bởi bất kỳ trong số 4 lần mở rộng này với xác suất bằng nhau (bạn cũng có thể thay thế độc lập ký tự đầu tiên bằng hoặc /và ký tự thứ hai bằng hoặc \). Trong perl bạn có thể làm điều này với một cái gì đó như:

s#\\ | /#("  "," \\","/ ","/\\")[rand 4]#eg

Tuy nhiên, nếu hàng kết quả có chứa \/(cấm tham gia) hoặc không /hoặc hoàn \toàn (bu lông chết và không chạm đáy) thì kết quả không hợp lệ. Trong trường hợp đó, tôi vứt bỏ toàn bộ hàng và chỉ cần thử lại. Tiếp tục hợp lệ luôn tồn tại và nếu bạn cố gắng thường xuyên sẽ tìm thấy đủ (ví dụ: mọi thứ đều chết trừ 1 luồng). Đây là một phân phối xác suất hơi khác so với thuật toán chống chồng chéo được đề xuất, nhưng tôi nghĩ rằng điều này thực tế tốt hơn vì nó không có sự thiên lệch hướng. Hiệu lực có thể được kiểm tra theo cách chơi golf

m#\\|/#>m#\\/#

Vấn đề ở đây là sự thay thế ngẫu nhiên rất looooong và tất cả những lần \thoát này cũng ăn byte. Vì vậy, tôi quyết định xây dựng hàng của tôi sử dụng chuỗi các chữ số và thay thế các chữ số thích hợp bằng , /\ngay trước khi in. Sự thay thế ngẫu nhiên cơ bản là

53|16*rand

mang đến cho một trong những 53, 55, 61hoặc 63với xác suất bằng nhau. Sau đó tôi giải thích 51như , 3như \6như /. Điều đó giải thích việc in hàng:

say y|3615|\\/ |r

Trong một cuộc thi golf nghiêm túc, bây giờ tôi sẽ bắt đầu khám phá một cách có hệ thống các công thức ma thuật thay thế, nhưng điều này sẽ khá tốt (trong vòng 3 byte tối ưu)

Phần còn lại của các thành phần của chương trình:

1x$_.6

Điều này khởi tạo $_(xem bản đồ tiếp theo) đến các không gian chiều cao theo sau là a /. Đây là một hàng vô hình phía trên cái đầu tiên được in và đảm bảo trường đủ rộng để bu-lông không bao giờ hết chỗ trống ở bên trái

map{ ... ; say ...}(1x$_.6)x$_

Tôi sẽ xử lý lần này chiều cao chuỗi ban đầu tương tự in một hàng mới mỗi lần

$_=$;until$;=$_,...

Lưu hàng hiện tại vào $;. Nếu thay thế hóa ra là khôi phục không hợp lệ $_từ$;

s/.6|3.?/53|16*rand/eg

Làm thay thế thực tế. Tôi không phải kiểm tra những gì trước /hoặc sau \vì nó phải là một không gian. Đây là tiện lợi vì không gian có thể được đại diện bởi một trong hai 1hoặc 5. Vì tôi chỉ đệm chuỗi bên trái khoảng trống sau khi \vẫn có thể vắng mặt, do đó, làm cho ký tự đó là tùy chọn

/3|6/>/36/

Kiểm tra xem hàng mới có hợp lệ không


+1 gọn gàng! bạn nên bao gồm người kiểm tra trực tuyến này perl -M5.010 main.pl <<< 25, tôi đã nhận được một số kết quả đầu ra tốt đẹp!
Zukaberg

Tâm giải thích một chút làm thế nào nó hoạt động? Tôi đang có quá nhiều niềm vui khi tạo ra chúng haha, tôi thực sự không lường trước được kết quả tốt như vậy.
Zukaberg

Thật không may, bạn cần thêm 3 byte cho-n , vì không gian và dấu gạch ngang cũng vậy. Quy tắc tương tự là cho các đối số dòng lệnh. Xem "Lời mời đặc biệt", gạch đầu dòng thứ hai: Tôi tính chúng là sự khác biệt về số lượng nhân vật với lời mời tương đương ngắn nhất mà không có chúng.
Erik the Outgolfer 8/10/2016

1
@EriktheGolfer Không, +1 vẫn ổn vì chương trình này hoạt động tốt từ dòng lệnh sử dụng -nEchỉ có hơn 1 ký tự -E. (Xem bài viết bạn đã tham chiếu. Điều này cũng loại bỏ nhu cầu -M5.010) Tôi luôn trình bày mã của mình dưới dạng tệp vì nó thuận tiện hơn, nhưng tôi luôn đếm các tùy chọn như thế này: Nếu nó có thể được chạy từ dòng lệnh tôi không đếm khoảng trắng và dấu gạch ngang. Nếu nó phải ở trong một tệp (ví dụ: vì nó sử dụng do$0) tôi sẽ đếm khoảng
trắng

@TonH rửa ơi, tôi không biết bạn đã sử dụng -E. Nếu vậy, bạn là tốt.
Erik the Outgolfer 8/10/2016

0

JavaScript (ES6), 154 byte

f=(n,r=[],s=" ".repeat(n)+"/",t=s.replace(/ \/|\\ |\\$/g,_=>"  /  \\/\\".substr(Math.random()*8&6,2)))=>n?/^ +$|\\\//.test(t)?f(n,r,s):f(n-1,[...r,t],t):r
<input type="number" min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Tôi vật lộn với việc thực hiện cho đến khi tôi thấy câu trả lời của @ TonH rửa mặt, lúc đó nó đã bị thoái hóa thành một cảng. Đầu ra mẫu:

         /\
        / /\
       /\   \
        /\   \
         /\  /
          / /\
         / / /\
            / /\
            \   \
             \
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.