Bọ rùa đối xứng


22

Giới thiệu:

Khi chúng ta nghĩ về Ladybugs, chúng ta thường nghĩ về một con bọ màu đỏ hoặc màu cam sẫm có đốm đen. Mặc dù điều này không cần thiết đúng, vì cũng có màu đen với bọ rùa đốm đỏ / cam hoặc bọ rùa không có đốm , chúng tôi chủ yếu hình dung bọ rùa giống như bọ rùa châu Á này:

nhập mô tả hình ảnh ở đây

Một điều cần lưu ý là các đốm trên bọ rùa hầu như luôn luôn đối xứng. Và đó là nơi thử thách này đến.

Thử thách:

Cho một số nguyên n( >= 0), xuất ra bọ rùa nghệ thuật ASCII sau một hoặc nhiều lần, với các điểm đối xứng được chia đều giữa hai bên, cũng như hai hoặc nhiều bọ rùa.

Đây là cách bố trí bọ rùa mặc định:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

Nếu n=0, chúng tôi xuất ra bọ rùa ở trên.

Khi nlớn hơn 0, chúng ta sẽ điền vào chỗ trống của lỗi nghệ thuật ASCII bằng chữ thường ohoặc thay thế |ở giữa bằng chữ hoa O. Mục tiêu là để thực hiện các nthay đổi đối với bọ rùa 'trống rỗng', trong khi vẫn tạo ra một đầu ra đối xứng (trên mỗi con bọ rùa) và xuất ra càng ít bọ rùa càng tốt.

Vì vậy, đầu ra hợp lệ n=1là:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Nhưng điều này sẽ không hợp lệ:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

Đầu ra hợp lệ cho n=2là:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

Cái đầu tiên nkhông thể phù hợp với một con bọ rùa duy nhất nữa là n=24. Trong trường hợp đó, bạn sẽ phải chia nó càng nhiều càng tốt thành hai con bọ rùa (bạn có thể chọn đầu ra chúng cạnh nhau, hoặc bên dưới nhau - với tùy chọn một khoảng trắng hoặc một dòng mới ở giữa chúng). Ví dụ:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

HOẶC LÀ:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

Quy tắc thử thách:

  • nsẽ trong phạm vi 0-1000.
  • Bạn có thể chọn xuất ra STDOUT, trả về dưới dạng chuỗi hoặc danh sách / chuỗi 2D-char, v.v. Cuộc gọi của bạn.
  • Hàng đầu dòng mới hoặc khoảng trắng không cần thiết không được phép. Trailing-space trắng và một dòng mới trailing được cho phép.
  • Như đã đề cập ở trên, khi cần có hai hoặc nhiều bọ rùa, bạn có thể chọn đầu ra chúng cạnh nhau hoặc bên dưới nhau (hoặc kết hợp cả hai ..)
  • Khi hai hoặc nhiều bọ rùa được in cạnh nhau, một khoảng trống tùy chọn ở giữa được cho phép. Khi hai hoặc nhiều bọ rùa được in xuống nhau, một dòng mới tùy chọn ở giữa được cho phép.
  • Bạn có thể chọn bố cục của bọ rùa ở bất kỳ bước nào trong chuỗi, miễn là chúng đối xứng và bằng với đầu vào n.
  • Vì mục tiêu là có nnhững thay đổi VÀ càng ít bọ rùa càng tốt, bạn sẽ bắt đầu sử dụng nhiều hơn một con bọ rùa khi ở trên n=23. Bố cục của những con bọ rùa này không cần thiết phải giống nhau. Trong thực tế, điều này thậm chí không thể đối với một số đầu vào, như n=25hoặc n=50đặt tên hai.
  • Ngoài ra, đôi khi không thể chia đều các chấm giữa hai hoặc nhiều bọ rùa. Trong trường hợp đó, bạn sẽ phải chia chúng càng nhiều càng tốt, với nhiều nhất là chênh lệch 1 giữa chúng.

Vì vậy n=50, để ghi nhớ hai quy tắc cuối cùng, đây sẽ là một đầu ra hợp lệ có thể (trong đó lỗi đầu tiên có 16 điểm và hai quy tắc còn lại có 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Bạn có ý nghĩa gì khi "càng ít thay đổi càng tốt" với con bọ rùa trống rỗng? Khi đặt n (<24) chữ cái o / O lên một con bọ rùa, bạn thực hiện n thay đổi cho nó. Hay bạn có nghĩa là thay đổi từ n-1 đến n (vì vậy đầu ra thay đổi ít nhất có thể khi đầu vào thay đổi 1)?
Heimdall

@Heimdall Ah xin lỗi vì sự nhầm lẫn do từ ngữ xấu. Đây là khi tôi có ý tưởng cho phép nhiều nhân vật tạo thành một điểm khi tôi nghĩ đến thử thách này, nhưng tôi đã bỏ nó và chỉ sử dụng oOthay vào đó. Tôi đã thay đổi từ ngữ một chút.
Kevin Cruijssen

n=50dụ, tôi tin rằng bạn có nghĩa là lỗi đầu tiên có 16 điểm và hai điểm còn lại có 17.
Jon Claus

Đây là album Jimi Hendrix yêu thích của tôi.
Phục hồi Monica iamnotmaynard

@iamnotmaynard Có lẽ tôi đang thiếu một cái gì đó rõ ràng, hoặc bạn đã nhận xét về thử thách sai? Tôi thực sự không thấy mối liên kết giữa Jimi Hendrix và bọ rùa ..
Kevin Cruijssen

Câu trả lời:


5

Than , 84 81 byte

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập tổng số điểm.

≔⌈∕∨θ¹¦²³η

Tính số lượng bọ rùa cần thiết.

Fη«

Vòng qua mỗi con bọ rùa.

≔⁺÷θη‹ι﹪θηζ

Tính số lượng điểm để đặt trên bọ rùa này.

V_¶I@)↘²↙|/←''-↑!

In đầu và cánh phải của bọ rùa.

↑⎇›ζ²¹OO²

Nếu có nhiều hơn 21 điểm, hãy in hai điểm, nếu không thì in mặt sau.

§|Oζ

Nếu số lượng điểm là số lẻ thì in một điểm khác nếu không thì in phần còn lại của mặt sau.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Chia số lượng điểm cho hai và phân chia chúng cho ba hàng 3, 4 và 3 điểm.

↙»

Di chuyển đến đầu của bọ rùa tiếp theo.

‖B←

Phản chiếu tấm vải sang trái, giữ phía sau.


8

Python 2 , 252 249 238 212 211 213 209 byte

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

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

  • Đã lưu 9 byte nhờ Kevin Cruijssen
  • Đã lưu 18 byte nhờ Mr. Xcoder
  • Đã lưu 2 byte nhờ Jonathan Frech

Tôi nghĩ rằng bạn có thể loại bỏ .replace('A','|O'[b%2])và sử dụng c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"thay thế?
Kevin Cruijssen

230 byte bằng cách chuyển [' o','|O'][i>9]thành ' |oO'[i>9::2]và sử dụng |thay vì logic hoặc. Cũng chuyển for i in range(11)sang một execcâu lệnh lưu 4 byte.
Ông Xcoder

1
Và xin lỗi vì sự lộn xộn của bình luận, nhưng 218 byte bằng cách trộn sự hiểu biết danh sách của bạn với forvòng lặp, cũng loại bỏ một biến không cần thiết.
Ông Xcoder

@ Mr.Xcoder Cảm ơn rất nhiều :)
TFeld

Nó được cho là sản xuất ít bọ rùa nhất có thể, phải không? Khi tôi đưa vào 24 đến 46 trên TIO, nó cho 3 bọ rùa thay vì hai.
Nick Matteo

7

JavaScript (ES6), 183 186 byte

Sử dụng công thức tương tự như câu trả lời của TFeld để phân chia các điểm giữa các bọ rùa.

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

Bản giới thiệu


6

Befunge, 292 279 byte

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

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

Giải trình

Nghệ thuật ASCII cho bọ rùa được mã hóa trong một chuỗi Befunge duy nhất, được bù 15, để cho phép 15 ký tự có thể in đầu tiên được dành riêng cho các mục đích đặc biệt. Hai ký tự đặc biệt đầu tiên đại diện cho dòng mới và |ký tự, cả hai đều không thể in được. Cái thứ ba không được sử dụng, bởi vì nó "không thể được sử dụng trong một chuỗi. Hai tiếp theo đại diện cho các điểm lớn ở trung tâm. Và mười phần còn lại dành cho các đốm trên cánh.

Các ký tự đặc biệt này được dịch sang dạng cuối cùng của chúng thông qua bảng tra cứu, được viết trên phần đầu tiên của dòng đầu tiên.

Để dễ giải thích hơn, đây là mã với các phần thành phần khác nhau được tô sáng:

Mã nguồn với các đường dẫn thực thi được tô sáng

*Chúng tôi bắt đầu bằng cách khởi tạo dòng mới và |ký tự trong bảng tra cứu, vì đây là những hằng số.
*Tiếp theo chúng ta đọc số lượng điểm từ stdin và tính số lượng bọ rùa cần thiết.
*Sau đó chúng ta có thể bắt đầu vòng lặp bên ngoài cho tập hợp các lỗi, tính toán số lượng điểm cho bọ rùa tiếp theo được hiển thị.
*Đối với mỗi con bọ rùa, chúng tôi tính toán xem điểm trung tâm lớn có cần được hiển thị (nếu spots%2 == 1) hay không và ghi giá trị phù hợp vào bảng tra cứu.
*Tương tự, chúng tôi tính toán xem cặp điểm lớn khác có cần được hiển thị hay không (nếu spots/2 > 10), một lần nữa cập nhật bảng tra cứu. Chúng tôi cũng tính toán các điểm còn lại cần thiết trên mỗi cánh.
*Phần cuối cùng của khởi tạo bảng tra cứu là một vòng lặp tính toán những điểm nhỏ nào cần được hiển thị. Về cơ bản thuật toán là: nếu (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, sau đó điểm cần được hiển thị.
*Tiếp theo, chúng ta đẩy đại diện chuỗi được mã hóa của bọ rùa lên ngăn xếp. Đây thực chất chỉ là một chuỗi đơn giản, nhưng nó trở nên hơi phức tạp khi tôi cố gắng nén nó vào các khoảng trống trong mã để nguồn sẽ tạo thành một hình chữ nhật.
*Tại thời điểm này, chúng tôi đã sẵn sàng bắt đầu vòng lặp đầu ra, xử lý từng ký tự một, chuyển đổi các trường hợp đặc biệt (các điểm, ngắt dòng, v.v.) thông qua bảng tra cứu được xây dựng trước đó.
*Cuối cùng, chúng tôi kiểm tra xem chúng tôi đã hiển thị tất cả các bọ rùa cần thiết hay chưa, nếu không thì tiếp tục quay lại bắt đầu vòng lặp bên ngoài.


Thật tuyệt, tôi thực sự thích các mẫu bọ rùa của bạn có cho mỗi giai đoạn từ 1-23. Hoàn toàn khác so với một số câu trả lời khác. +1 từ tôi. Bạn có phiền khi thêm một lời giải thích (sau khi bạn có thể hoàn thành việc đánh gôn hơn nữa)?
Kevin Cruijssen

1
Tôi rất vui vì bạn thích các mẫu. Tôi thực sự đã dành khá nhiều thời gian để thử các kết hợp khác nhau để tìm ra một thuật toán có vẻ tốt trong càng nhiều giai đoạn càng tốt. Cũng thêm một chút giải thích cho câu trả lời của tôi bây giờ.
James Holdiness

3

Ruby , 203 193 190 byte

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

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

  • Đã lưu 10 byte nhờ Jordan

{|m|m.có thể được thay thế bằng {$&.; b=(n-1)/23+1có thể được thay thế bằng b=1+~-n/23; và x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}có thể được thay thế bằng x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordan

Bạn có thể lưu một byte khác bằng cách sử dụng %q{XY}thay vì 'X'+"Y"trên tám dòng đầu tiên và một vài dòng nữa bằng cách thực hiện d=n>0?n/(b=1+~-n/23):b=0thay vì n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordan

@Jordan Wow, cảm ơn bạn.
Phục hồi Monica iamnotmaynard
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.