Поднимитесь в Америку


11

Теперь, когда другие пользователи помогли Трампу построить стену , пришло время взобраться на нее.

Это сложная художественная задача, в которой вам нужно вывести скалолазную стену со случайно расположенными трюмами.

Стена для скалолазания состоит из панелей, каждая из которых имеет от 3 до 10 трюмов и имеет высоту 5 панелей. Каждая панель высотой 4 символа и шириной 10 символов

Мы используем |для обозначения стороны стены (arête) и a -для представления краев панелей. Углы панелей обозначены, +а трюмы - o.

Наконец, стена должна иметь America!сверху и Mexicoснизу.

Ваша программа не должна принимать никаких данных, если они не требуются для запуска, и должна выводить что-то похожее на приведенное ниже.

Это пример вывода:

  America!
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
|  o       |
|    o o   |
| o    o   |
|  o    o  |
+----------+
   Mexico

Это может быть сбивающим с толку, так что это структурировано более четко ниже

вход

Zilcho. Вы не должны принимать абсолютно никакой информации.

Выход

Стена для скалолазания ascii-art состоит из 5 панелей, каждая из которых состоит из 6 линий по 12 колонн с America!центром вверху и Mexicoцентром внизу. Каждая панель имеет идентичный шаблон, который генерируется программой случайным образом. Шаблон панели состоит из случайно распределенного случайного числа удержаний от 3 до 10.

правила

  • Вход не разрешен
  • Я бы сказал «нет встроенных», но если ваш язык имеет встроенный для этого, я автоматически приму его в качестве победителя.
  • Это поэтому выигрывает самый короткий код (в байтах).
  • Выход без удержаний должен быть точно таким же, как указано выше, опять же без удержаний.
  • Random является случайным определено здесь

5
Означает ли случайное равномерно случайное, или каждый возможный макет просто нуждается в ненулевом шансе возникновения, или мне просто нужно иметь как минимум две возможности?
Павел

@ Notts90 Они должны быть одинаковыми и выбирать количество случайным образом. Это упоминается в посте, но случайность не определена.
Павел

2
Я все еще думаю, что это было бы более сложной задачей, если бы каждая панель была разной.
Лохматый

3
Это моя проблема с Песочницей. У меня был этот вызов там больше месяца, и я просто решил очистить свои посты там. Поэтому я публикую это, думая, что каждая проблема была устранена, и это происходит!
Caird Coneheringaahing

1
@ WORNGALL Поддельные новости! Вранье! Случайное очень важно. Trumpscript имеет ЛУЧШИЙ СЛУЧАЙНЫЙ ГЕНЕРАТОР, который вы когда-либо видели. (Все, что вам нужно сделать, это ссылка на твиттер президента!)
Level River St

Ответы:


5

Желе , 65 57 байт

Первое в истории использование новомодного целочисленного строкового литерала с двумя кодами ( ⁽¥0= 2049)

⁽¥0ṃ⁾+-W
“K2X)»Ṅø40RẊ<8X+3¤s⁵ị⁾o j@€⁾||Yṭ¢µṄ€5¡Ṗ;⁷“Ç€:;#»

Полная программа без ввода и печати стены.

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

Как?

⁽¥0ṃ⁾+-W - Link 1, panel separator: no arguments
⁽¥0      - literal 2049
    ⁾+-  - literal "+-"
   ṃ     - convert 2049 to base "+-" as if they were [1,0]
       W - wrap in a list   -> ["+----------+"]

“K2X)»Ṅø40RẊ<8X+3¤s⁵ị⁾o j@€⁾||Yṭ¢µṄ€5¡Ṗ;⁷“Ç€:;#» - Main link: no arguments
“K2X)»                                           - "  America!"
      Ṅ                                          - print with line feed
       ø                                         - niladic chain separation
        40                                       - literal 40
          R                                      - range -> [1,2,...,40]
           Ẋ                                     - random shuffle
                 ¤                               - nilad and link(s) as a nilad:
             8X                                  -   random integer between 1 and 8
                3                                -   literal 3
               +                                 -   add
            <                                    - less than? (vectorises)
                   ⁵                             - literal 10
                  s                              - split into chunks of length 10
                     ⁾o <-- a space              - literal "o "
                    ị                            - index into
                           ⁾||                   - literal "||"
                        j@€                      - join with reversed @rguments
                              Y                  - join with line feeds
                                ¢                - call last link (1) as a nilad
                               ṭ                 - tack left to right
                                 µ               - call that p... (monadic chain separation)
                                    5¡           - repeat five times:
                                   €             -   for €ach (separator & panel)
                                  Ṅ              -     print with trailing line feed(separator and panel):
                                      Ṗ          - pop (just the separator now)
                                        ⁷        - literal line feed
                                       ;         - concatenate
                                                 - unused value printed
                                         “Ç€:;#» - "   Mexico"
                                                 - implicit print

4
Это самая длинная желейная программа, которую я когда-либо видел.
Павел

Неоднозначность была изменена. Я решил с 3-10, чтобы позволить вашему остаться.
Кэрд coinheringaahing

+1 за )o <-- a space. Искренне заставил меня смеяться!
Кэрд coinheringaahing

@ Phoenix это стало короче, но я не могу не думать, что это должно быть еще короче.
Джонатан Аллан

@ Сатана, это почти космический воронка!
Джонатан Аллан

4

PHP, 138 байт

<?=($p=str_pad)("  America!",349,strtr("
+----------+
|0|
|1|
|2|
|3|",str_split(str_shuffle($p($p(o,rand(3,10),o),40)),10)))."   Mexico";

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

расширенный

<?=($p=str_pad)("  America!",349, 
#fill the string till a length of 349 with
strtr("
+----------+
|0|
|1|
|2|
|3|",
# before replace the digits with strings in the array
str_split(str_shuffle($p($p(o,rand(3,10),o),40)),10))) 
# make a string with o length 3- 10 fill it with spaces to length 40
# shuffle the resulting string and split it into a array of strings with length 10
."   Mexico"; # add the end

4

JavaScript (ES6), 194 160 байт

(h=0,g=p=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s])))=>`  America!
${t=`+----------+
`}${g(`|          |
`.repeat(4)+t).repeat(5)}   Mexico`

Попробуй

Схема трюмов будет меняться каждые 2 секунды в приведенном ниже фрагменте.

f=
(h=0,g=p=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s])))=>`  America!
${t=`+----------+
`}${g(`|          |
`.repeat(4)+t).repeat(5)}   Mexico`
o.innerText=f()
setInterval("o.innerText=f()",2e3)
<pre id=o>


объяснение

  • Мы создаем анонимную функцию, которая, хотя и не требует ввода, имеет 2 параметра со значениями по умолчанию:
    • h, которому дается начальное значение 0; это будет вести подсчет количества удержаний на панели, когда мы добавим их.
    • g, которая является рекурсивной функцией, которую мы будем использовать для создания случайного шаблона удержаний на панели. Мы вернемся к этому немного позже.
  • В теле основной функции мы выводим литерал шаблона, начиная с America!\n.
  • Затем мы создаем панель divider ( +----------+\n) и назначаем ее переменной t, добавляя ее к выводу в процессе.
  • Далее мы создаем одну строку панели ( | |\n), повторяем ее 4 раза и добавляем t.
  • Мы вызываем g, передавая строку из вышеприведенного шага в качестве аргумента, через параметр p.
  • Теперь для шаблона удержания. В пределах g:
    • Мы проверяем, есть ли h>2(то есть, у нас 3 или более трюмов).
    • Если это так, мы возвращаем строку p.
    • Если нет, мы вызываем gснова, на этот раз передавая измененную копию pаргумента.
    • Модифицированная копия pимеет replaceметод, используемый для замены всех <space>символов на <space>или oпутем ссылки на индекс символа (0 или 1) строки <space>o.
    • Мы определяем индекс персонажа по
      1. Вызов Math.random(), который возвращает десятичное число от 0 до 1, исключая.
      2. Проверка, если это больше, чем .8. Поскольку в панели 40 мест и максимум 10 удерживаний, это улучшает распределение удержаний по панели ( .75было бы точнее, но, надеюсь, вы позволите мне уступку ради сохранение байта!)
      3. Логическое значение этой проверки присваивается переменной s.
      4. sприводится к целому числу (0 или 1) и добавляется к h.
      5. Мы проверяем, hменьше ли сейчас 11 (т. Е. Есть ли у нас менее 10 удержаний) иs верно ли это.
      6. Это логическое значение в свою очередь приводится к целому числу, что дает нам индекс в строке.
  • Вернуться к нашему выводу! Мы повторяем строку, возвращенную g5 раз.
  • А затем просто добавьте Mexicoв конец строки, чтобы закончить. Уф!

альтернатива

И просто потому, что я думал, что это было бы хорошим дополнением к задаче: только для 12 дополнительных байтов у нас может быть уникальный шаблон удержаний на каждой панели, вместо того, чтобы все они были идентичными.

(g=(p=`|          |
`.repeat(4)+t,h=0)=>h>2?p:g(p.replace(/ /g,_=>" o"[(h+=s=Math.random()>.8)<11&s]),h))=>`  America!
${t=`+----------+
`}${g()+g()+g()+g()+g()}    Mexico`

Попробуй

Опять же, схемы трюмов будут меняться каждые 2 секунды.


3

Pyth - 58 57 байт, возможно 47

Ks(b\+*\-T\+*+++b\|*dT\|4)J<.SxdmdK+3O8+*s.e?/Jk\obK5<K13

Попробуй

Объяснение старого решения (я буду обновлять, когда у меня будет время):

J+++b\+*\-T\+K+J*+++b\|*dT\|4=Y<.SxdmdK+3O8+*s.e?/Yk\obK5J
J+++b\+*\-T\+                                                Create the +----------+, and store as J
             K+J*+++b\|*dT\|4                                Create a full panel (minus bottom border, and without holes), store as K
                                  xdmdK                      Get indices of spaces
                                .S                           Create random permutation of these indices
                               <       +3O8                  Get first several indices (a random number from 3 to 10)
                                             s.e?/Yk\obK     Replace space with 'o' at these indices
                                           +*           5J   Create 5 copies, and add bottom border

Я думаю, что могу получить 47, но все еще технически следуя правилам:

JhO2Ks(b\+*\-T\+*+++b\|.S+*\oJ*d-TJ\|4)+*K5<K13

Здесь число отверстий по-прежнему выбирается случайным образом (из набора {4,8}), а конфигурация этих отверстий выбирается случайным образом (из набора конфигураций, где каждый ряд идентичен)

Попробуй


2

Mathematica, 201 байт

c=Column;s=RandomSample[Tuples[{" ",o," "," "},10],4];t="+----------+";w=c[{t,c[Row/@Table[AppendTo[s[[i]],"|"];PrependTo[s[[i]],"|"],{i,Length@s}]]}];c[Flatten@{"  America!",Table[w,5],t,"   Mexico"}]

+1 за использование языка, который я не могу проверить?
Кэрд coinheringaahing

@ Satan'sSon, вы можете бесплатно запустить большинство программ Mathematica здесь, в Wolfram Sandbox. (Вставьте его и нажмите shift-enter.)
Не дерево

Когда дело доходит до печати, этот сайт печатает забавным способом. Вывод искажен, потому что он использует специальные символы ...
J42161217

1

Powershell (255 байт)

echo "  America!"
for($l=0;$l-lt4;$l++){$a=," "*12;$a[0]="|";$a[11]="|";$i=get-random -Max 10 -Min 6;$j=get-random -Max 5 -Min 1;$a[$i]=$a[$j]="o";$b+=($a-join"")}
for($k=0;$k-lt5;$k++){echo +----------+($b-join"`n")} 
echo +----------+`n"   Mexico" 

1

Python 2 , 259 224 221 218 байт

from random import*
b=[' ']*40
for x in sample(range(40),randint(3,10)):b[x]='o'
a=["+"+"-"*10+"+"]+['|'+''.join(o)+'|'for o in[b[x*10:x*10+10]for x in 0,1,2,3]] 
print'\n'.join(['  America!']+a*5+[a[0]]+['   Mexico'])

Попробуйте это на repl.it

-35 включая некоторые подсказки от @ Satan'sSon - спасибо!

-3 с благодарностью @Wondercricket


Вы могли бы сохранить байты, просто выводя, tа не сохраняя его в переменную, и если вы удалите пробелы после America!и Mexico? print" America!" <NEWLINE> d,a,b,c=[" Mexico"],["+"+"-"*10+"+"],[" "]*40,0?
Caird Coinheringaahing

Спасибо @ Satan'sSon. Это был «особый обеденный перерыв», и, возможно, я смогу сыграть в гольф немного больше, когда у меня будет время. Еще раз спасибо за подсказки.
ElPedro

Вы также можете сохранить несколько байтов, изменив импорт from random import*и удалив r.из функций
Wondercricket

Спасибо @Wondercricket. Не уверен, как мне удалось это пропустить :)
ElPedro

Сатана был полезным! (Первый и последний раз за все> :(
Caird Coinheringaahing

0

Python 2, 197 байт

from random import*
n=randint(3,10)
s=list('o'*n+' '*(40-n))
shuffle(s)
t=10
S='+'+'-'*t+'+'
print'\n'.join(['  America!']+([S]+['|'+''.join(s[x:x+t])+'|'for x in range(0,40,t)])*5+[S,'   Mexico'])
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.