Nhật thực mặt trời thông qua máy ảnh Pinhole


28

Thử thách này là một thử thách nghệ thuật ASCII đơn giản lấy cảm hứng từ nhật thực xảy ra vào ngày 21 tháng 8 năm 2017. Đưa ra một đầu vào 0 <= n <= 4, xuất ra giai đoạn tương ứng của nhật thực được mô tả dưới đây:

n=0:
   *****
 **     **
*         *
*         *
**       **
  *******

n=1:
   *****
 **  *****
*   *******
*   *******
**   ******
  *******

n=2:
   *****
 *********
***********
***********
***********
  *******

n=3:
   *****
 *****  **
*******   *
*******   *
******   **
  *******

n=4:
   *****
 **     **
*         *
*         *
**       **
  *******

Quy tắc

  • Bạn có thể 0 hoặc 1 chỉ mục, nêu những gì bạn đã chọn.
  • Các ký tự được sử dụng là không gian và *, bạn có thể sử dụng bất kỳ ký tự in có thể in nào *(ngoài không gian).
  • Không gian lưu trữ là tùy chọn (bạn có thể có hoặc không có chúng).
  • Đây là , số byte thấp nhất là người chiến thắng.

3
@ Mr.Xcoder Tôi chống lại các thách thức gắn thẻ nhận đầu vào là độ phức tạp kolmogorov , mặc dù điều đó tùy thuộc vào quyết định của OP.
Erik the Outgolfer

15
Bummer rằng nó không đối xứng từ trên xuống dưới.
admBorkBork

Ngoài ra, nhật thực đã bắt đầu ...
Erik the Outgolfer

@AdmBorkBork Vâng, tôi có thể đã lưu một số byte ...
Erik the Outgolfer

7
"Bạn có thể sử dụng bất kỳ ký tự nào cho *" ... bao gồm cả không gian? ;)
Hagen von Eitzen

Câu trả lời:


13

Python 2 , 161 149 142 135 byte

lambda n,u=u' *':u'''   *****
 ****
**
**
****
  *******'''.translate({1:u[0<n<3],2:u[0<n<4],3:u[1<n<4]})

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

-7 cảm ơn ông Xcoder .


9
Lạm dụng tốt đẹp của unprintables.
Zacharý

Tôi không hoàn toàn đánh giá cao câu trả lời này cho đến khi tôi sao chép vào Emacs. Rực rỡ!
Silvio Mayolo

@SilvioMayolo Umm, bạn đã làm gì với Emacs?
Erik the Outgolfer

Tôi chỉ nhìn vào câu trả lời trên trang này và không hiểu nó hoạt động như thế nào. Emacs hiển thị tất cả các ký tự ẩn dưới dạng ^ A, ^ B, ^ C, v.v.
Silvio Mayolo

@SilvioMayolo Ồ, đó là vì những thứ không thể in được có hình đại diện trông giống như ký tự Unicode.
Erik the Outgolfer

9

Than , 82 81 55 43 byte

-38 byte nhờ Neil!

Nν”{“⟲FEd⧴_³⟲”‖O¿﹪ν⁴«F﹪ν²G↗³↑²↖²↙³*↑¤*¿⁼ν¹‖

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng.

Tôi đã làm cho cái quái của nó. : P Tôi có thể bị loại ra ngoài 40 byte. 26 38 byte ... Đóng đủ chưa?


1
Tôi đã thực hiện một số đơn giản hóa cho thuật toán cơ bản của bạn: Hãy thử trực tuyến!
Neil

2
Tôi đã chơi golf trong logic của mình thay vì không có khả năng sử dụng Than. > _> Cảm ơn!
hoàn toàn là

1
Có vẻ như in "vòng tròn" bên ngoài hoạt động ngắn nhất. Tôi cũng sáng tạo với đa giác cho các đầu vào kỳ lạ: Hãy thử trực tuyến!
Neil

1) Chết tiệt, tôi nghĩ rằng tôi đã thông minh với PolygonHollow. : P 2) Ồ, tốt quá. Cảm ơn!
hoàn toàn là

5

Quế Gum , 70 byte

Hexdump:

0000000: 6c33 5053 5050 d002 012e 20a5 0002 4026  l3PSPP.... ...@&
0000010: 9001 0568 6c20 07a6 0648 4080 b521 8a19  ...hl ...H@..!..
0000020: 30a6 1644 1093 0de3 a098 6184 6206 422d  0..D......a.b.B-
0000030: 6136 c20c 6374 3380 3cb8 5aa0 1436 36ba  a6..ct3.<.Z..66.
0000040: 5f4c 280f 0f00                           _L(...

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

Tôi đã chờ đợi rất lâu để tìm ra cách sử dụng ngôn ngữ này. : P

Vì vậy, Cinnamon Gum là Bubblegum, nhưng nó giống ngôn ngữ "thực" hơn Bubblegum.

Byte đầu tiên ( l) đặt chế độ thành chế độ từ điển. Phần còn lại của byte là chuỗi sau đây được nén.

0&   *****
 **     **
*         *
*         *
**       **
  *******;1&   *****
 **  *****
*   *******
*   *******
**   ******
  *******;2&   *****
 *********
***********
***********
***********
  *******;3&   *****
 *****  **
*******   *
*******   *
******   **
  *******;4&   *****
 **     **
*         *
*         *
**       **
  *******

Điều này về cơ bản làm cho một bảng tra cứu với mỗi văn bản được gán cho một số. Chương trình sau đó nhận đầu vào và đầu ra văn bản tương ứng.


Có thể argument%4hoặc argument&3lưu byte?
Tít

5

JavaScript (ES6), 103 102 byte

f=
n=>`   *****
 **66733**${s=`
*666777333*`}${s}
**6667333**
  *******`.replace(/\d/g,c=>" *"[c*2>>n&1])
<input type=number min=0 max=4 oninput=o.textContent=f(this.value)><pre id=o>

Chỉnh sửa: Đã lưu 1 byte nhờ @darrylyeo.


1
-2 byte bằng cách lưu trữ *666777333*\ntrong một biến.
darrylyeo

@darrylyeo Tôi phải làm gì đó sai vì dường như tôi chỉ có thể tiết kiệm 1 byte ...
Neil

Thật tệ, nó thực sự chỉ tiết kiệm được 1 byte.
darrylyeo

4

SOGL V0.12 , 40 39 byte

"⁽Ρūa╔Ƨ ‘╥▓.4%?52"¹ο1¹‘╬¡╬5.H?:±}.2=?╬8

Hãy thử nó ở đây!


Nếu điều đó giúp bất kỳ, không gian lưu trữ là tùy chọn (bạn có thể có hoặc không có chúng). - Không biết SOGL, nhưng có thể lưu byte
Ông Xcoder

@ Mr.Xcoder Nó sẽ làm điều ngược lại, vì SOGL thêm các khoảng trống khi xử lý nghệ thuật ASCII ở bất cứ đâu: p
dzaima

4

VI, 108 byte

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>

<CR>Enterđột quỵ, <C-?>tương ứng với Control + ?, và <Esc>để Escaperõ ràng. Mỗi trong số này được tính cho 1 byte (xem meta ). Các ngắt dòng trong giải pháp là để đọc. Chỉ <CR>đại diện cho Enternét thực sự .

Đầu vào

Các tập tin đầu vào chỉ nên chứa 1 ký tự n.

Phóng

VI nên được bắt đầu như:

vi -u NONE input

Giải thích

Có 3 phần trong giải pháp. Tôi sẽ mô tả phần 2 đầu tiên (dòng thứ 2), vì nó dễ giải thích nhất.

Vẽ mặt trời

Lệnh vẽ mặt trời là:

3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp

Mặt trời phải được vẽ bằng , *, 0, 13, như thế này:

   *****
 **11033**
*111000333*
*111000333*
**1110333**
  *******

Một đối xứng sẽ giúp giảm kích thước byte của phần này, nhưng nó không quan trọng. Tôi sẽ không giải thích đầy đủ các dòng, nhưng các mô hình *****được sử dụng để dễ dàng tạo ra những dòng cuối cùng, và các mô hình **1110333**đã được thực hiện như là một tài liệu tham khảo để tạo ra 3 dòng khác có chứa 0, 13.

Điều quan trọng là sử dụng 0, 13cho các phần mặt trời có thể được lấp đầy (xem phần giải thích tiếp theo). Vẽ mặt trời này mất 55 byte và có thể chơi golf với một số thủ thuật.

Lấp đầy mặt trời theo n

Để lấp đầy mặt trời một cách chính xác, các hướng dẫn cần tuân theo là:

  • nếu n = 0, sau đó0, 13(tất cả các chữ số) nên được thay thế bằng
  • nếu n = 1 , sau đó 1nên được thay thế bằng , các chữ số khác với*
  • nếu n = 2, sau đó0, 13(tất cả các chữ số) nên được thay thế bằng*
  • nếu n = 3 , sau đó 3nên được thay thế bằng , các chữ số khác với*
  • nếu n = 4, sau đó 0, 13(tất cả các chữ số) nên được thay thế bằng (như n = 0)

Từ đó, chúng ta có thể suy ra rằng sự thay thế cần có là:

  • thay thế một số chữ số bằng ( thay thế đầu tiên )
  • thay thế tất cả các chữ số khác bằng *( thay thế thứ hai )

Lưu ý rằng "một số chữ số" có thể có nghĩa là "không có chữ số" ( n = 2ví dụ). Và "tất cả các chữ số khác" cũng có thể biểu thị "không có chữ số", nếu tất cả các chữ số đã được thay thế bằng thay thế đầu tiên (n = 0 ví dụ).

Sự thay thế thứ hai có thể dễ dàng được viết bằng 11 byte :

:%s/\d/*/g<CR>

Sự thay thế đầu tiên phụ thuộc vào n, vì vậy trước tiên chúng ta phải tính toán những chữ số nào sẽ được thay thế. Nếu các ký tự thay thế được lưu trong thanh ghi a, lệnh thay thế cũng được viết bằng 11 byte :

:%s/<C-r>a/ /g<CR>

<C-r>ađược thay thế bởi nội dung của thanh ghi akhi lệnh được gõ.

Để tính giá trị của a, theo các hướng dẫn trước, thuật toán là (theo mã giả):

n := read()
if (n % 2 != 0)
then
    a := n
else
    if(n % 4 != 0)
    then
        a := "X"
    else
        a := "\d"

"X"chuỗi được sử dụng bởi vì khi n = 2, không có chữ số nào được thay thế bằng dấu cách. Bất kỳ chuỗi nào không phải là mặt trời đều có thể được sử dụng ở đây, miễn là lần thay thế đầu tiên không có gì.

Điều này có thể được viết bằng 31 byte :

D                                   # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
 :let@a=                            # define register "a content
        @"%2                        # if (n % 2 != 0)
            ?                       # then
             @"                     #   n
               :                    # else
                @"%4                #   if (n % 4 != 0)
                    ?               #   then
                     "X"            #       "X"
                        :           #   else
                         "\\d"      #       "\\d"
                              <CR>  # calculate "a

Dung dịch

Đặt tất cả các phần này theo đúng thứ tự, và bạn có giải pháp:

D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>                                              # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp     # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR>                                                              # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR>                                                                  # replace the remaining digits with stars

3

PHP, 114 + 1 byte

+1 byte cho -R. Cảm ơn @Neil về gợi ý thay đổi.

for(;$c="   *****
 **66733**
*666777333*
*666777333*
**6667333**
  *******"[$i++];)echo+$c?" *"[$c*2>>$argn&1]:$c;

sử dụng dấu gạch dưới cho *, 0-index. Chạy như đường ống với -nRhoặc thử trực tuyến .

Yêu cầu PHP 5.5 trở lên:
PHP cũ hơn không hiểu lập chỉ mục chuỗi bằng chữ (lỗi phân tích cú pháp);
PHP 7.1 phàn nàn về các giá trị không phải là số (thay thế +$cbằng $c>0để sửa chữa).


1
Tôi nghĩ rằng " _"[$c*2>>$argn&1]tránh các thông số thay đổi tiêu cực nếu bạn cần nó.
Neil



2

Java 8, 225 213 211 byte

n->{String a=n<2|n>3?"   ":"***",b=n<1|n>2?"   ":"***",c=n%4<1?" ":"*",d=a+(n%4<1?"   ":"***")+b;return"   *****\n **"+(n<2|n>3?"  ":"**")+c+(n<1|n>2?"  ":"**")+"**\n*"+d+"*\n*"+d+"*\n**"+a+c+b+"**\n  *******";}

Hãy thử nó ở đây.


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.