Нарисуй ASCII-O'-Фонарь на Хэллоуин

28

Хэллоуин уже почти здесь, праздник, после которого большинству людей нужно отучиться от пустого рациона из сахара.

Напишите программу, которая принимает положительное целое число. Если целое число меньше 31 (от 1 до 30), выведите этот ASCII-арт jack-o'-lantern, глядя вправо, как будто с нетерпением ожидая Хэллоуина:

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

Если вход является 31 (дата октября Хэллоуин включен), выход тем же ASCII блуждающего фонарь, но смотрит влево:

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

Если входное значение больше 31, выведите раздутый ASCII-o'-lantern, который, вероятно, съел слишком много конфет. Он может стоять лицом влево или вправо, так как тошнота может дезориентировать. Итак, вывод:

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

или

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

Что бы вы ни предпочли. Может даже отличаться для разных чисел выше 31.

Самый короткий код в байтах побеждает.

Кальвин Хобби
источник

Ответы:

8

JavaScript (ES6), 185 142 140 136 байт

Теперь ты можешь твитнуть тыкву!

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":"^")

Вероятно, еще есть возможности для улучшения ...

ETHproductions
источник
Этот x^n>30трюк сначала смутил меня, но когда я понял, что происходит, я бесстыдно украл его, чтобы улучшить свой ответ. В качестве компенсации я даю вам голос за это в любом случае.
Нил
8

아희 (Aheui) , 914 байт

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

Попробуй это здесь! (пожалуйста, скопируйте и вставьте код вручную)

Возможно, Aheui не для игры в гольф, но, тем не менее, это весело. :)

Выходы:

N = 10

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

N = 31

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

N = 40

 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|
Юнг Хван Мин
источник
4

Желе , 73 байта

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

Полная программа
TryItOnline!

Может быть возможно сыграть в гольф с помощью отказов ŒḄ.

Как?

“ẋƥḷỊ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

Рубин, 137 байт

Лицо указывает на и после 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])}}

Неуправляемый в тестовой программе

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]
Уровень реки St
источник
3

Древесный уголь , 71 байт

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

Примечание . Этот код не работает в самом последнем коммите на момент публикации, поскольку индексация строк нарушена. Тем не менее, он должен работать в этой версии с 25 октября. Он также успешно работает в версии, которая в данный момент установлена ​​в Try It Online .

объяснение

Древесный уголь - это язык, разработанный для ASCII-искусства. Выходные данные помещаются на холст, который печатается в конце программы.

Настроить

Получить ввод и рассчитать символы лица:

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

Нарисуй тыкву

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

После этого цикла мы имеем

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

Следующий:

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

Результат:

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

Нарисуй лицо

Мы нарисуем лицо, смотрящее вправо, и изменим его позже, если это необходимо.

↙↙←←ε      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

Результат (для ввода 31):

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

Подумайте, если это Хэллоуин:

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

Окончательный вывод:

 _____I_____ 
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|
DLosc
источник
2

PHP, 178 176 171 байт

$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|_|_|_|_|_|_|";

может сэкономить 5 байт с помощью физических разрывов строк. Беги с -r.

Titus
источник
1

V , 97 байт

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

Попробуйте онлайн!

Я разочарован тем, как долго это получилось. Это более запутанно, чем обычно, поскольку V едва справляется с числами, много байтов получается при создании условных условных выражений. Я бы опубликовал подробное объяснение, но это заняло много времени, так что я мог бы обойти его позже. Вот 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                                       .

К вашему сведению, это будет происходить очень медленно. Это займет около 10 секунд. Я знаю, почему это происходит, и я смотрю на исправления.

DJMcMayhem
источник
1

Pyth, 76 байт

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

Попробуйте онлайн.

Не использует сжатие. (Я пытался использовать некоторые из них для версии строки данных лица, но она оказалась такой же длины.)

PurkkaKoodari
источник
1

Java 7, 237 байт

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("~","| ");}

Ungolfed & тестовый код:

Попробуй это здесь.

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));
  }
}

Выход:

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

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

 _____I_____ 
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|
Кевин Круйссен
источник
Разве ваш гольф-код - это не функция, а не полная программа?
Ангзурил
Решение ETHproductions для JavaScript - это всего лишь функция, я не понимаю, почему это будет иначе для Java
brianush1
1

C ++, 222 204 194 байта

-18 байтов благодаря Кевину Круйссену и -10 байтов за явную верхнюю часть

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);}

Ungolfed

#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
Я программировал на C ++ только один раз много лет назад, поэтому я не могу вспомнить многое из этого, но обязательны ли круглые скобки для троичных проверок? Если нет, вы можете удалить их много. Кроме того , можно изменить , &&чтобы &и ||к |? Таким образом, 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 байта ) компилируется и запускается?
Кевин Круйссен
1
@KevinCruijssen Да, вы правы. i-oОбязательна только
круглая
1

PHP, 222 байта

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;

Выход

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 байт

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|_|_|_|_|_|_|"

Неуправляемая версия

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"}| |
|_|_|_|_|_|_|"""

Попробуй здесь

редактировать

Как уже упоминал Тит, я могу сохранить некоторый размер i < 32вместоi in 1..31

Редактировать 2

Убраны все возможные пробелы вокруг операторов ... Забыл сделать это в начале

Редактировать 3

Переписаны троичные условия для использования сохраненной переменной, заменены ;символами новой строки, удалено явное определение переменной

Редактировать 4

Как уже упоминалось Otávio, я могу сэкономить еще 4 байта , если я перейти от | |${j ? ' |^| | ' : ' | |^| '}| |к| | |${j ? '^| ' : ' |^'}| | |

Виктор А.
источник
Как насчет i < 32вместо i in 1..31?
Тит
Вы не можете избавиться от пробелов вокруг операторов?
Фонд Моника иск
Да, я могу ... Полностью забыл об этом, спасибо
Виктор А.
Поскольку операторы Groovy могут быть разделены либо новой строкой, либо ;обеими символами длиной в 1 символ, я бы предложил для удобства чтения новую строку. И отказаться от хороших привычек кодирования, избавиться от них intи def.
manatwork
В print1-й троичной форме сохраните условие в переменной as (j=i>30), затем в следующих 2 используйте только jвместо того, чтобы повторять то же i>30условие.
manatwork
1

JavaScript (ES6), 163 125 байт

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>

Теперь беззастенчиво воровал трюк @ ETHproduction для позиционирования лица. Кодировка: 0это глаз 1и 2зубы, 3это левая сторона, 4это правая сторона и 5переносица.

Нил
источник
0

Рубин, 168 байт

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

Вероятно, далеко от оптимального. Требуется base64и zlibбиблиотеки.

Вызов как лямбда-функция.

dkudriavtsev
источник
0

Python 2, 167 байт

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+'|'])
TFeld
источник
-1

C # 6, 223 215 байт

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|_|_|_|_|_|_|");

Вся программа разглажена:

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|_|_|_|_|_|_|");
        }
    }
}
IonutC
источник
2
Это просто какой-то код, а не функция или программа, вы можете скомпилировать его, Func<int, string>что обычно является самым коротким способом сделать это.
TheLethalCoder
1
Могу поспорить, что вы можете сэкономить несколько байтов, перемещая условия в Writeвместо того, чтобы объявлять и определять s.
Тит
2
И почему \r\nвместо всего этого \n?
Тит
никто не мешает вам сделать это лучше
IonutC
3
Они просто помогают тебе!
MrPaulch