Vẽ một ASCII-O'-Lantern cho Halloween


28

Halloween đã gần đến, ngày lễ mà hầu hết mọi người cần phải từ bỏ chế độ ăn kiêng đường.

Viết chương trình lấy số nguyên dương. Nếu số nguyên nhỏ hơn 31 (1 đến 30), hãy xuất đèn lồng jack-o'-đèn lồng nghệ thuật ASCII này, nhìn sang bên phải như thể mong chờ Halloween:

 _____I_____
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

Nếu đầu vào 31 (ngày Halloween tháng 10 được bật), hãy xuất cùng đèn lồng ASCII-o'-Lantern, nhưng nhìn sang trái:

 _____I_____
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|

Nếu đầu vào lớn hơn 31, hãy xuất ra một chiếc đèn lồng ASCII trông có vẻ bồng bềnh, người có lẽ đã ăn quá nhiều kẹo. Anh ta có thể phải đối mặt với trái hoặc phải vì sự buồn nôn có thể làm mất phương hướng. Vì vậy, đầu ra:

 _____I_____
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|

hoặc là

 _____I_____
| | | | | | |
| | |o| |o| |
| | | |^| | |
| | |XXXXX| |
|_|_|_|_|_|_|

Bất cứ điều gì bạn thích. Nó thậm chí có thể khác nhau cho các số khác nhau trên 31.

Mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


8

JavaScript (ES6), 185 142 140 136 byte

Bây giờ bạn có thể tweet-a-bí ngô!

n=>` _____I_____
0 4 1
02421
0 |^| 1
031
|_|_|_|_|_|_|`.replace(/\d/g,x=>x-2?x-3?x^n>30?"| |":"| | |":n>31?"XXXXX":"VvVvV":n>31?"o":"^")

Có lẽ vẫn còn chỗ để cải thiện ...


x^n>30Thủ thuật đó khiến tôi bối rối lúc đầu nhưng khi tôi tìm ra những gì đang diễn ra, tôi đã xấu hổ lấy trộm nó để cải thiện câu trả lời của mình. Vì bồi thường tôi sẽ cho bạn một upvote cho nó anyway.
Neil

8

(Aheui) , 914 byte

붕빠뿌빠삮빠싸빠받따싼사주따반따퍄속맣이
숚뽀빠소뚜번범뻐터번선야챠슊산받발따다뿌
분뽀더번투빠뿌삮뿌다뿌쑬섣뽀빠뼈ㅇ뚜범쑬
받발따또싾솒빠쏟싿솓아삲쏠쑧뽀터벋터볼설
뿌뻐뻐뻐선썬뻐퍼섟썫선뻐퍼샧셗뺘쎣뺘뼈선
받따반타파빠빠받따받반타타싾삲빠빠빠빠뿌
숟썭뻐선썭뻐섣썭뻐선썭뻐섣썯터범떠범뻐선
빠싽술빠싽산빠싽삳빠싽숟삮쎨뿌서탸쥬싸셔
쀼이썭솓쀼섣싻이연우섞빠쏠뱐선반노쌹뻐숛
손빠쓞유삯쏢으산뽀쌹쏡야뼈섣싺이셗처솓썱
아솓썲솑쏢삱쏜빠쌄숞뚜범범섩뻐분터뿌뻐튜
번이손쎫ㅇ야샨우쌃이쀼뱔뿌떠뽀투또뿌뽀노
본떠벋뻐떠번떠숃볌쎬볌섩뿌빠뽀펴봄벌뽀뻐
샯이멓삭뭏ㅇㅇ이멓샥뎌뵥뿌븀범이멓삭뭏맣
맣이ㅇ몋섨희ㅇㅇㅇㅇㅇ먛뻐살뽀ㅇ솕멓샮속

Hãy thử nó ở đây! (vui lòng sao chép và dán mã theo cách thủ công)

Aheui có thể không dành cho chơi gôn, nhưng dù sao nó cũng rất vui. :)

Đầu ra:

N = 10

 _____I_____ 
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

N = 31

 _____I_____ 
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|

N = 40

 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|

4

Thạch , 73 byte

“ẋƥḷỊKNṇ&JƝ¡'Ɲṣ,c;|Ṙɗ.hṿ#⁴ɠ³Ṙṅ’b8ị“ I|o^Xv_”
<32ị“o^XV“vX”y¢s13µ¹U31=³¤?Y

Chương trình đầy đủ
TryItOnline!

Có thể chơi golf này với sự trợ giúp của nảy ŒḄ.

Làm sao?

“ẋƥḷỊKNṇ&JƝ¡'Ɲṣ,c;|Ṙɗ.hṿ#⁴ɠ³Ṙṅ’b8ị“ I|o^Xv_” - Link 1, Jack construction
“ẋƥḷỊKNṇ&JƝ¡'Ɲṣ,c;|Ṙɗ.hṿ#⁴ɠ³Ṙṅ’              - a base 250 integer
                               b8            - convert to base 8
                                 ị           - index into
                                  “ I|o^Xv_” - literal " I|o^Xv_"
                                             - makes this, without the line feeds:
                                                _____I_____ 
                                               | | | | | | |
                                               | |o| |o| | |
                                               | | |^| | | |
                                               | |XvXvX| | |
                                               |_|_|_|_|_|_|

<32ị“o^XV“vX”y¢s13µ¹U31=³¤?Y - Main link: n
<32                          - 1 if n is less than 32 else 0
   ị                         - index into
    “o^XV“vX”                - list of strings, ["o^XV","vX"]
             y               - map those characters (o->^ and X->V OR v->X) in string:
              ¢              -    call last link (1) as a nilad
               s13           - split into chunks of length 13
                  µ          - monadic chain separation
                          ?  - ternary if:
                         ¤   -     nilad and links as a nilad
                     31=³    -         31 equals first argument
                   ¹         -     identity (do nothing if true)
                    U        -     upend (reverse each if false)
                           Y - join with line feeds

3

Ruby, 137 byte

Điểm mặt trái và sau ngày 31.

->n{puts ' _____I_____',(0..4).map{|i|s=[?|]*7*' _'[i/4]
s[5-n/31*2,5]=' | | o| |o |^| VvVvV_|_|_'[i*5,5];s.tr('ovV','^vVoX'[n/32*3,3])}}

Ungolfed trong chương trình thử nghiệm

f=->n{
  puts ' _____I_____',                                #Draw top of pumpkin
  (0..4).map{|i|                                      #then 5 more lines
    s=[?|]*7*' _'[i/4]                                #of 7 | separated by space or _ .
    s[5-n/31*2,5]=' | | o| |o |^| VvVvV_|_|_'[i*5,5]  #Add a line of face with 'o' eyes and 'VvVvV' mouth.
    s.tr('ovV','^vVoX'[n/32*3,3])                     #Substitute characters as necessary.
  }
}

f[gets.to_i]

3

Than , 71 byte

NβA‹β³²τA§o^τεA§XVτφA§XvτθF³«P↑⁵|_»↑⁵←I←×_⁵‖O→↙↙←←ε↙←^↖↓ε↓→φθφθφ¿⁼β³¹‖←

Lưu ý : Mã này không hoạt động trong lần xác nhận gần đây nhất khi đăng, vì lập chỉ mục chuỗi bị hỏng. Tuy nhiên, nó sẽ hoạt động trong phiên bản này từ ngày 25 tháng 10. Nó cũng chạy thành công trên phiên bản hiện tại trên Try It Online .

Giải trình

Than là một ngôn ngữ được thiết kế cho nghệ thuật ASCII. Đầu ra được đặt trên một khung vẽ, được in ở cuối chương trình.

Thiết lập

Nhận đầu vào và tính toán các ký tự khuôn mặt:

Nβ        Input number into beta
A‹β³²τ    Assign beta<32 to tau for easy reuse
A§o^τε    Assign appropriate eye character (selected via indexing into "o^") to epsilon
A§XVτφ    Assign outside and middle mouth character to phi
A§Xvτθ    Assign other mouth character to theta

Vẽ bí ngô

F³«  »    Do this three times:
P↑⁵       Draw a 5-character line upward (using | by default); don't move the cursor
|_         Draw that string, rightward

Sau vòng lặp này, chúng ta có

| | | 
| | | 
| | | 
| | | 
|_|_|_

Kế tiếp:

↑⁵         Draw a 5-character line upward
←I         Draw the stem leftward
←×_⁵       Draw 5 underscores leftward
‖O→       Reflect the canvas rightward, overlapping in the middle

Kết quả:

 _____I_____ 
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
|_|_|_|_|_|_|

Vẽ mặt

Chúng tôi sẽ vẽ khuôn mặt nhìn thẳng và thay đổi nó sau này nếu cần thiết.

↙↙←←ε      Move to the correct spot and draw the right eye (our right, pumpkin's left)
↙←^        Move to the correct spot and draw the nose
↖↓ε        Move to the correct spot and draw the left eye
↓→φθφθφ    Move to the correct spot and draw the mouth with alternating characters

Kết quả (cho đầu vào 31):

 _____I_____ 
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

Hãy suy ngẫm nếu đó là Halloween:

¿⁼β³¹      If beta equals 31:
‖←         Reflect canvas leftward

Đầu ra cuối cùng:

 _____I_____ 
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|


2

PHP, 178 176 171 byte

$e="| | ";$b=($n=$argv[1]-31)?" |^":"^| ";$c=$n<1?VvVvV:XXXXX;$a=$n<1?$b:" |o";echo" _____I_____\n$e$e$e|\n| |$a|$a$e\n$e|$b$e|\n| |",$n?" |$c":"$c| ","$e\n|_|_|_|_|_|_|";

có thể lưu 5 byte với ngắt dòng vật lý. Chạy với -r.


1

V , 97 byte

é|6i| Y5PÒ_r $.7|rIGÓ /_
3G3f r^jll.kll.5G3f RVvVvVLá
Àé*ñ30|l2GGkld$PñGñ31|l3GÓÞ/o
5GÓãv/Xñͪ

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

Tôi thất vọng với điều này kéo dài bao lâu. Nó phức tạp hơn bình thường vì V hầu như không thể xử lý số, rất nhiều byte đến từ việc tạo ra các điều kiện hacky. Tôi sẽ đăng một lời giải thích chi tiết, nhưng phải mất một thời gian dài để đưa ra, vì vậy tôi có thể tiếp cận nó sau. Đây là một hexdump:

0000000: e97c 3669 7c20 1b59 3550 d25f 7220 242e  .|6i| .Y5P._r $.
0000010: 377c 7249 47d3 202f 5f0a 3347 3366 2072  7|rIG. /_.3G3f r
0000020: 5e6a 6c6c 2e6b 6c6c 2e35 4733 6620 5256  ^jll.kll.5G3f RV
0000030: 7656 7656 1b4c e10a c0e9 2af1 3330 7c6c  vVvV.L....*.30|l
0000040: 3247 1647 6b6c 6424 50f1 47f1 3331 7c6c  2G.Gkld$P.G.31|l
0000050: 3347 d3de 2f6f 0a35 47d3 e376 2f58 f1cd  3G../o.5G..v/X..
0000060: aa                                       .

FYI này sẽ chạy rất chậm. Nó sẽ mất khoảng 10 giây. Tôi biết tại sao điều này xảy ra, và tôi đang tìm cách khắc phục.


1

Bình thường, 76 byte

+dX*11\_5\IjbmX.<.[14d"| "yqQ31<G3?>Q31"XXo""Vv^"c"
|c| |c
|^
|ababa"bt*7"_|

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

Sử dụng không nén. (Tôi đã thử sử dụng một số phiên bản của chuỗi dữ liệu khuôn mặt, nhưng nó có cùng độ dài.)


1

Java 7, 237 byte

String c(int n){char a=n==31?94:n>31?'o':32,b=n<31?'^':32;return(" _____I_____ \n~~~~~~|\n~|"+a+"|"+b+"|"+a+"|"+b+"~|\n~~|"+(n>31?94:a)+"|"+b+"~~|\n~"+(n<31?"~|VvVvV|":n==31?"|VvVvV~|":"|XXXXX~|")+" |\n|_|_|_|_|_|_|").replace("~","| ");}

Mã thử nghiệm & mã hóa:

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

class M{
  static String c(int n){
    char a = n == 31
              ? 94
              : n > 31
                 ? 'o'
                 : 32,
         b = n < 31
              ? '^'
              : 32;
    return (" _____I_____ \n~~~~~~|\n~|"+a+"|"+b+"|"+a+"|"+b+"~|\n~~|"
        +(n > 31
           ? 94
           :a)
        +"|"+b+"~~|\n~"
        +(n < 31
           ? "~|VvVvV|"
           : n == 31
              ? "|VvVvV~|"
              : "|XXXXX~|")
        +" |\n|_|_|_|_|_|_|")
      .replace("~", "| ");
  }

  public static void main(String[] a){
    System.out.println(c(12));
    System.out.println();
    System.out.println(c(31));
    System.out.println();
    System.out.println(c(100));
  }
}

Đầu ra:

 _____I_____ 
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

 _____I_____ 
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|

 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|

Không phải mã golf của bạn chỉ là một chức năng, không phải là một chương trình đầy đủ?
Angzuril

Giải pháp JavaScript của ETHproductions chỉ là một chức năng, tôi không hiểu tại sao nó lại khác với Java
brianush1

1

C ++, 222 204 194 byte

-18 byte nhờ Kevin Cruijssen và -10 byte cho phần trên rõ ràng

using S=std::string;S f(int n){char L[80],o=2*(n>30),i=-1;while(i++<80)L[i]=47<i&i<53?88:i%2?'|':i==20|i==24|i==36?n<32|i>35?94:'o':(i-o)%14?i-o<55?32:95:10;return" _____I_____ "+S(L+o,L+70+o);}

Bị đánh cắp

#include <string>

using S=std::string;
S f(int n){
 char L[80];
 int o=2*(n>30);
 for (int i=0;i<80;i++){
  L[i]=
   (47<i && i<53) ?
   'X' :
   (
    (i%2) ?
    '|' :
    (
     i==20||i==24||i==36 ?
     (n<32||i>35?'^':'o') :
     ((i-o)%14?(i-o<55?' ':'_'):'\n')
    )
   );
 }
 return " _____I_____ " + S(L+o,L+70+o);
}

1
Tôi chỉ mới lập trình trong C ++ một lần cách đây nhiều năm, vì vậy tôi thực sự không thể nhớ nhiều về nó, nhưng liệu có phải là dấu ngoặc đơn cho kiểm tra ternary không? Nếu không, bạn có thể loại bỏ rất nhiều trong số họ. Ngoài ra, có thể thay đổi &&đến &||thành |? Như tóm tắt, using S=std::string;S f(int n){char L[80],o=2*(n>30),i=-1;while(i++<80)L[i]=47<i&i<53?88:i%2?'|':i==20|i==24|i==36?n<32|i>35?94:'o':i-o%14?i-o<55?32:95:10;S t(5,95);return' '+t+'I'+t+' '+S(L+o,L+70+o);}( 202 byte ) có biên dịch và chạy không?
Kevin Cruijssen

1
@KevinCruijssen Có bạn đúng. Chỉ có dấu ngoặc đơn xung quanh i-olà bắt buộc, vì vậy 204 byte,
Karl Napf

1

PHP, 222 byte

for($s=" ".str_pad("I",11,_,2)." \n";$i<5;$i++)$s.=str_pad("",13,$i<4?"| ":"|_")."\n";$p=($a=$argv[1])<31||!($a%2)?2:0;$s=substr_replace($s,$a>31?XXXXX:VvVvV,$p+59,5);$s[$p+31]=$s[$p+35]=($a>31?o:"^");$s[$p+47]="^";echo$s;

Đầu ra

input:29
 _____I_____ 
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

input:30
 _____I_____ 
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|

input:31
 _____I_____ 
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|

input:32
 _____I_____ 
| | | | | | |
| | |o| |o| |
| | | |^| | |
| | |XXXXX| |
|_|_|_|_|_|_|

input:33
 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|

input:34
 _____I_____ 
| | | | | | |
| | |o| |o| |
| | | |^| | |
| | |XXXXX| |
|_|_|_|_|_|_|

input:35
 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|

1

Groovy Script, 273 265 216 202 198 byte

i=args[0]as int
a=i<32?'^| |^':'o| |o'
b=i<32?'VvVvV':'XXXXX'
j=i>30
print" _____I_____\n| | | | | | |\n| |${j?"$a| ":" |$a"}| |\n| | |${j?'^| ':' |^'}| | |\n| |${j?"$b| ":" |$b"}| |\n|_|_|_|_|_|_|"

Phiên bản ung dung

i = args[0] as int
a = i < 32 ? '^| |^' : 'o| |o'
b = i < 32 ? 'VvVvV' : 'XXXXX'
j = i > 30
print """ _____I_____
| | | | | | |
| |${j ? "$a| " : " |$a"}| |
| | |${j ? '^| ' : ' |^'}| | |
| |${j ? "$b| " : " |$b"}| |
|_|_|_|_|_|_|"""

Hãy thử nó ở đây

Chỉnh sửa

Như Titus đã đề cập, tôi có thể tiết kiệm một số kích thước i < 32thay vìi in 1..31

Chỉnh sửa 2

Đã xóa tất cả các khoảng trống có thể có xung quanh các toán tử ... Quên làm như vậy ngay từ đầu

Chỉnh sửa 3

Viết lại các điều kiện thời gian để sử dụng biến đã lưu, thay thế ;bằng dòng mới, loại bỏ định nghĩa biến rõ ràng

Chỉnh sửa 4

Như Otávio đã đề cập, tôi có thể lưu thêm 4 byte nếu tôi chuyển từ | |${j ? ' |^| | ' : ' | |^| '}| |sang| | |${j ? '^| ' : ' |^'}| | |


Làm thế nào về i < 32thay vì i in 1..31?
Tít

Bạn không thể thoát khỏi không gian xung quanh các nhà khai thác?
Vụ kiện của Quỹ Monica

Vâng, tôi có thể ... Hoàn toàn quên mất điều này, cảm ơn bạn
Victor A.

Vì các câu lệnh Groovy có thể được phân tách bằng dòng mới hoặc ;cả hai đều dài 1 ký tự, tôi khuyên bạn nên chọn dòng mới để dễ đọc hơn. Và từ bỏ thói quen mã hóa tốt, loại bỏ những thứ đó intdef.
manatwork

Trong phần printthứ ba, hãy lưu điều kiện trong một biến như (j=i>30)sau đó trong 2 lần sử dụng tiếp theo jthay vì lặp lại i>30điều kiện tương tự .
thao tác

1

JavaScript (ES6), 163 125 byte

f=
n=>` _____I_____
3 5 4
30504
3 |^| 4
3121214
|_|_|_|_|_|_|`.replace(/\d/g,c=>(n>31?`oXX`:`^Vv`)[c]||(c-3^n>30?`| |`:`| | |`))
;
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Bây giờ không biết xấu hổ ăn cắp thủ thuật của @ ETHproduction để định vị khuôn mặt. Mã hóa: 0là một mắt, 12là răng, 3là bên trái, 4là bên phải và 5là sống mũi.


0

Ruby, 168 byte

->i{s=(Zlib.inflate Base64.decode64 "eJxTiAcBTzDJVaOABCG8OCiGycUhyYWVASGYF48EuRTwGhmHZkgckhzMQBKNzIdibEZGgAA2IwFZA1N4").lines;puts i<31?s[0..5]:i<32?s[6..11]:s[12..17]}

Có lẽ là xa tối ưu. Yêu cầu base64zlibthư viện.

Gọi như một hàm lambda.


0

Python 2, 167 byte

i=input()
b='| |';e='^o'[i>31]+b;print'\n'.join(x[::[1,-1][i>30]]for x in[' _____I_____ ','| '*5+b,b+' |'+e+e,b+' | |^| '+b,b+' |'+['VvVvV','X'*5][i>31]+b,'|_'*6+'|'])

-1

C # 6, 223 215 byte

int d=int.Parse(args[0]);var x="| | |\n| |";var s=d<31?" |^| |^| |\n| | | |^"+x+" |VvVvV":(d==31?"^| |^"+x+" |^| "+x+"VvVvV| ":"o| |o"+x+" |^| "+x+"XXXXX| ");Write(" _____I_____\n| | | | "+x+s+"| |\n|_|_|_|_|_|_|");

Toàn bộ chương trình vô danh:

using static System.Console;
namespace Halloween
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int d = int.Parse(args[0]);
            var x = "| | |\n| |";
            var s = d < 31 ? " |^| |^| |\n| | | |^" + x + " |VvVvV" 
                           : (d == 31 ? "^| |^" + x + " |^| " + x + "VvVvV| " 
                                      : "o| |o" + x + " |^| " + x + "XXXXX| ");
            Write(" _____I_____\n| | | | " + x + s + "| |\n|_|_|_|_|_|_|");
        }
    }
}

2
Đây chỉ là một số mã không phải là một chức năng hoặc chương trình, bạn có thể biên dịch nó thành một mã Func<int, string>thường là cách ngắn nhất để làm điều đó.
TheLethalCoder

1
Tôi cá là bạn có thể lưu một số byte bằng cách di chuyển các điều kiện sang Writethay vì khai báo và định nghĩa s.
Tít

2
Và tại sao \r\nthay vì chỉ \n?
Tít

không ai ngăn bạn làm điều đó tốt hơn
I MuffC

3
Họ chỉ giúp bạn!
MrPaulch
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.