วาดดวงจันทร์


20

ท้าทาย

เมื่อกำหนดระยะของดวงจันทร์ให้วาดโดยใช้ศิลปะ ASCII

โปรแกรมของคุณจะต้องจัดการกับดวงจันทร์ใหม่จันทร์เสี้ยวแว็กซ์ในไตรมาสแรกแว็กซ์แวบ ๆ เต็มพระจันทร์เต็มดวงจันทร์แรมที่ลดลงในไตรมาสที่แล้วและจันทร์เสี้ยวที่กำลังจาง ข้อมูลที่คุณป้อนจะเป็นจำนวนเต็ม

0 -> new moon
1 -> waxing crescent
2 -> first quarter
3 -> waxing gibbous
4 -> full moon
5 -> waning gibbous
6 -> last quarter
7 -> waning crescent

ASCII art ทั้งหมดถูกวางไว้บนกริด 16x8 (เพราะอัตราส่วนขนาดตัวอักษร) คุณสามารถแทนที่.ด้วยอักขระใด ๆ และ#ด้วยอักขระที่ไม่ใช่ช่องว่างอื่น ๆ

ผลลัพธ์สำหรับดวงจันทร์ใหม่ควรเป็น:

................
................
................
................
................
................
................
................

สำหรับแว็กซ์เสี้ยว:

..........######
............####
.............###
.............###
.............###
.............###
............####
..........######

สำหรับไตรมาสแรก:

........########
........########
........########
........########
........########
........########
........########
........########

สำหรับแว็กซ์ gibbous:

......##########
....############
...#############
...#############
...#############
...#############
....############
......##########

และสำหรับพระจันทร์เต็มดวง:

################
################
################
################
################
################
################
################

จันทร์เสี้ยวนั้นเป็นเพียงเสี้ยวแว็กซ์ที่มีแต่ละบรรทัดที่ตรงกันข้ามเช่นเดียวกับ gibbous แรมและแว็กซ์แว็กซ์และในไตรมาสแรกและครั้งสุดท้าย

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • คุณอาจเลือกที่จะเอาท์พุทแว็กซ์ / แรมในทิศทางตรงกันข้ามถ้าคุณต้องการแม้ว่ามันจะไม่สร้างความแตกต่าง (กราฟิกที่แสดงในคำถามนี้สำหรับซีกโลกเหนือ)
  • ผลลัพธ์ของคุณจะต้องตรงตามที่ระบุไว้ การขึ้นบรรทัดใหม่ของคุณอาจเป็นตัวแยกบรรทัดที่สมเหตุสมผลและคุณอาจมีการขึ้นบรรทัดใหม่หากคุณต้องการ


"แม้ว่ามันจะไม่สร้างความแตกต่าง" - ช่วยฉันทีไบต์ (ฉันหวังว่าฉันจะทำให้ถูกต้อง) :)
Jonathan Allan

1
มันต้องเป็นศิลปะ ASCII หรือไม่? MoonPhase["Icon"]คือ 17 ไบต์ใน Mathematica …
ไม่ใช่ต้นไม้

@JanathanAllan โอ้ดี ถ้าอย่างนั้นก็อาจสร้างความแตกต่าง: P
HyperNeutrino

@ lanlock4 คุณได้กล่าวถึงหนึ่งในสาเหตุที่ทำให้ฉันเป็น ASCII ใช่มันต้องเป็นงานศิลปะ ASCII ด้วย
HyperNeutrino

คำตอบ:


7

เจลลี่ ,  43 32 ไบต์

-7 ไบต์ย้ายจาก bit-mask ไปเปรียบเทียบ-mask-
2 bytes ด้วยการปรับปรุงการเขียนโปรแกรมโดยปริยาย
-1 byte ย้ายไปซีกโลกใต้
-1 byte - ใช้ɓตัวคั่นโซ่ใหม่ทั้งหมด ... มันใช้ครั้งแรก!

“>,##‘m0Dm€0ż@€4Ḷ¤Œṙɓ%4>C¹⁸:4¤?Y

ใช้ตัวอักษร0สำหรับ.และสำหรับ1#

ทุกกรณีในชุดทดสอบที่ลองใช้ออนไลน์!

อย่างไร?

สร้างรูปแบบการดักจับสี่เฟสแรกและแทนที่จะย้อนกลับเส้นเติมเต็มค่าผลลัพธ์ของผลลัพธ์เฟส modulo-4 เมื่อเฟส div-4 ไม่ใช่ศูนย์

ฉันเดิมสร้างหน้ากากบิต แต่ค่าหน้ากากได้0, 8, 12และ14- 0000, 1000, 1100และ1110- เหล่านี้มีphaseคนนำ - ดังนั้นการเปรียบเทียบหน้ากากสามารถนำมาใช้แทน

“>,##‘m0Dm€0ż@€4Ḷ¤Œṙɓ%4>C¹⁸:4¤?Y - Main link 1: number phase
“>,##‘                           - code-page index literal [62,44,35,35]
      m0                         - reflect -> [62,44,35,35,35,35,44,62]
        D                        - decimalise -> [[6,2],[4,4],[3,5],[3,5],[3,5],[3,5],[4,4],[6,2]]
         m€0                     - reflect €ach -> [[6,2,2,6],[4,4,4,4],[3,5,5,3],[3,5,5,3],[3,5,5,3],[3,5,5,3],[4,4,4,4],[6,2,2,6]]
                 ¤               - nilad and link(s) as a nilad:
               4                 -   literal 4
                Ḷ                -   lowered range -> [0,1,2,3]
            ż@€                  - zip (reverse @rguments) for €ach -> [[[0,6],[1,2],[2,2],[3,6]],[[0,4],[1,4],[2,4],[3,4]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,3],[1,5],[2,5],[3,3]],[[0,4],[1,4],[2,4],[3,4]],[[0,6],[1,2],[2,2],[3,6]]]
                  Œṙ             - run-length decode -> [[0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3],[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3],[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],[0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3]]
                                    -   i.e.: 0000001122333333  -
                                              0000111122223333  - Marking out the separate
                                              0001111122222333  - regions as filled up by
                                              0001111122222333  - the phases of the moon in
                                              0001111122222333  - the southern hemisphere.
                                              0001111122222333  -
                                              0000111122223333  -
                                              0000001122333333  -
                    ɓ            - dyadic chain separation & swap arguments, call that m
                     %4          - phase mod 4
                       >         - greater than? (vectorises across m) 1 if so 0 if not
                              ?  - if:
                             ¤   -   nilad followed by link(s) as a nilad:
                          ⁸      -     link's left argument, phase
                           :4    -     integer divide by 4
                        C        - then: complement
                         ¹       - else: identity (do nothing)
                               Y - join with newlines
                                 - implicit print

3
นั่นไม่ใช่ภาษามันเป็นเสียงโมเด็ม ...
Alnitak

@Alnitak ยินดีต้อนรับสู่ PPCG! คุณได้เข้าร่วม PPCG.SE นี้เพื่อให้คุณสามารถแสดงความคิดเห็นได้หรือไม่? ;)
HyperNeutrino

8

JavaScript (ES6), 121 ... 103 92 ไบต์

f=(n,i=128)=>i--?f(n,i)+(i%16?'':`
`)+'.#.'[i%16+4*n-~-'31000013'[n&1?i>>4:1]*~-(n&2)>>4]:''

การสาธิต


อ๊ะฉันอยากจะให้แทงนี่ตอนกลางวัน แม้ว่าฉันจะสงสัยคุณ
Shaggy

4

Haskell , 98 90 ไบต์

f i=do{a<-[3,1,0,0,0,0,1,3];[".#."!!div(i*4+x+[0,a-1,0,1-a]!!mod i 4)16|x<-[0..15]]++"\n"}

มันวนรอบแถวและคอลัมน์โดยใช้ list monad ( doบล็อกสำหรับแถวและ list comprehension สำหรับคอลัมน์) และกำหนดว่าอักขระใดสำหรับแต่ละเซลล์โดยใช้นิพจน์ของอินพุต ( i) ค่าออฟเซ็ตสำหรับแถว ( a) และดัชนีคอลัมน์ ( x)

บันทึก 8 ไบต์โดยทำให้ subexpression ง่ายขึ้นสำหรับการชดเชยที่แท้จริง


3

Python 2 , 144 142 127 ไบต์

i=input()
a,b='#.'[::i/4*2-1]
i%=4
for x in range(8):y=(int(abs(x-3.5))or 1)+2;y=[y,16-y][i>2];y=[i*4,y][i%2];print(16-y)*a+b*y

ลองออนไลน์!

สามารถตีกอล์ฟต่อไปได้อย่างแน่นอนพร้อมชื่นชมเคล็ดลับ :)

Golfed off 1 byte ขอบคุณ undergroundmonorail!

Golfed off ไบต์จำนวนมากขอบคุณ ovi และ Mego เพราะฉันเป็นคนโง่ที่ลืมที่จะไม่ใช้ 4 ช่องว่างสำหรับ codegolf :)


if i>2:y=16-yอาจเปลี่ยนเป็นy=[16-y,y][i>2]ซึ่งยาวกว่า แต่ด้วยการใช้อัฒภาคแบบเสรีจะทำให้วงของคุณเป็นแบบซับเดี่ยวเพื่อบันทึกหลายไบต์
Mego


1

Mathematica ขนาด 125 ไบต์

s=Switch;Grid@If[1<#<6,#&,1-#&][s[m=#~Mod~4,0,0,2,1,_,1-{3.4,5}~DiskMatrix~{8,16}]s[m,1,h=Table[Boole[i>8],8,{i,16}],_,1-h]]&

ส่งคืนกริดที่ใช้1และ0แทน.และ#ตามลำดับ

มันทำงานได้โดยใช้มาสก์สองตัวหนึ่งอันกลมหนึ่งและครึ่งแรเงาครึ่งหนึ่งและรวมพวกมันอย่างมีเหตุผลเพื่อให้ได้รูปร่างที่เหมาะสม

มาสก์สองตัวทำขึ้น1-{3.4,5}~DiskMatrix~{8,16}สำหรับแบบวงกลมและTable[Boole[i>8],8,{i,16}]ครึ่งครึ่ง ตรรกะดังต่อไปนี้:

output = f(a AND b)

where f, a and b are:

n | f    a  b
--+-----------
0 | NOT  F  ◨ 
1 | NOT  ○  ◧ 
2 | 1    T  ◨
3 | 1    ○  ◨
4 | 1    F  ◨ 
5 | 1    ○  ◧ 
6 | NOT  T  ◨ 
7 | NOT  ○  ◨

ตรรกะจำลองด้วย1และ0โดยการใช้การคูณสำหรับANDและสำหรับx -> 1-xNOT

โซลูชันโบนัส (ไม่ใช่ ASCII) สำหรับ 28 ไบต์: IconData["MoonPhase",#/4-1]&

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.