Муравьи на натуральном бревне


23

Это хороший вызов для начинающих и хороший убийца времени.

Я сказал только «естественный» журнал, потому что заголовок был слишком коротким, это не имеет ничего общего с логарифмами.

Дано 2 переменные:

  • Количество муравьев n.
  • Ширина бревна w.

Выведите лог ширины wс nмуравьями (показан пример w=3, n=6)

|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |

Один муравей выглядит так:

\O/ # Upper-case O
-O- # Upper-case O
/o\ # Lower-case o
 ^  

Несколько муравьиных законов:

  1. Муравьи не могут касаться друг друга и края бревна напрямую, они предпочитают касаться пространства.
  2. Каждый ряд муравьев должен быть wшироким, с n/wрядами муравьев.
  3. Муравьям всегда нужен журнал, ширина журнала больше 0, гарантировано.
  4. Муравьи тоже ... ну, нужны муравьи, количество муравьев больше 0, гарантировано.
  5. Муравьи также удивительно хорошо организованы, они будут заполнять бревно слева направо, сверху вниз; как будто они читали книгу.

Ant-xamples

w = 3, n = 5

|             |
| \O/ \O/ \O/ |
| -O- -O- -O- |
| /o\ /o\ /o\ |
|  ^   ^   ^  |
|             |
| \O/ \O/     |
| -O- -O-     |
| /o\ /o\     |
|  ^   ^      |
|             |

w = 1, n = 1

|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |

w = 1, n = 3

|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |
| \O/ |
| -O- |
| /o\ |
|  ^  |
|     |

Это , выигрывает человек с наименьшим байтом.



@AdmBorkBork Я действительно помню это сейчас. Я наполовину покончил с этим и неправильно прочитал спецификацию, возможно, подсознательно украл часть этой идеи.
Волшебная Урна Осьминога

Это муравьиные логи.
Арджун

«Каждый ряд муравьев должен быть широким». Если w>nнеобходимо ли дополнительное пространство перед правой рукой |или нет, или это до нас?
Джонатан Аллан

1
-1 за Ant-xamples(я ненавижу
игру

Ответы:


4

Желе ,  44  43 байта

Вычеркнуто 44 не 44 с использованием  

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y
sÇ€⁶;YỴz⁶Zj@€⁾||Y

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

Как?

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y - Link 1, make a row of ants: list x (could be integer = length)
⁶                         - literal ' '
 ṁ                        - mould like x (makes a list of that many spaces)
  ;⁶                      - concatenate one more space
                       ¤  - nilad followed by link(s) as a nilad
       “\-/“OOo^ ”        -   literal      ["\-/","OOo^ "] ("..." a list of chars really)
                   U      -   reverse each [" ^oOO","/-\"]
                  ;       -   concatenate  ["\-/","OOo^ "," ^oOO","/-\"]
                    Ṗ     -   pop          ["\-/","OOo^ "," ^oOO"]
                      ⁶   -   literal ' '
                     z    -   transpose & fill ["\O/","-O-","/o\"," ^ ","   "]
    jЀ                   - join left mapped over right
                          -   (join the spaces with each of the ant parts in turn)
                        Y - join with newlines

sÇ€⁶;YỴz⁶Zj@€⁾||Y - Main link: n, w
s                 - split n into chunks of length w (implicitly makes a range of length n)
 Ç€               - call the last link (1) as a monad for €ach
   ⁶;             - a space concatenated with that
     Y            - join with newlines
      Ỵ           - split at newlines (both the ones we just joined with AND the others!)
       z⁶         - transpose & fill with space characters (making the shorter rows,
                  -   including the single space as long as the longest one)
         Z        - transpose it back the right way
             ⁾||  - literal ['|','|']
          j@€     - join with reverse arguments for €ach (put each row between pipes)
                Y - join back up with newlines
                  - implicit print

Я спросил об этом w<nв комментарии, так как это немного неоднозначно.
Если журнал должен быть wмуравьями широкими, а не только муравьями wширокими, он стоит два байта:

⁶ṁ;⁶jЀ“\-/“OOo^ ”;UṖz⁶¤Y
+RsÇ€YỴz⁶Zj@€⁾||ṫ5Y

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


5

V , 70 , 68 байтов

i \O/ 
 -O- 
 /o\ 
  ^  Àä{ò@bf }C GïpòÇÓ/d
HÄÒ çÞ/ÙÒ 
ëI|yê$p

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

00000000: 6920 5c4f 2f20 0a20 2d4f 2d20 0a20 2f6f  i \O/ . -O- . /o
00000010: 5c20 0a20 205e 2020 1bc0 e416 7bf2 4062  \ .  ^  ....{.@b
00000020: 6620 167d 4320 1b47 ef70 f2c7 d32f 640a  f .}C .G.p.../d.
00000030: 48c4 d220 e7de 2fd9 d220 0a16 eb49 7c1b  H.. ../.. ...I|.
00000040: 79ea 2470                                y.$p

Это никогда не случалось со мной раньше, но известная ошибка фактически спасла мне байты!

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

h<C-v>{dÀp

который не использует дубликат оператора. Однако, поскольку нам уже нужно было переместить одну строку, мы можем просто сделать

hÀä<C-v>{

Ницца! Потенциальная номинация для использования ошибки: P.
Волшебная Урна Осьминога

5

PHP> = 7.1, 150 байт

for([,$w,$n]=$argv;$i<ceil($n/$w)*5+1;)echo str_pad("| ".str_repeat(["","\O/ ","-O- ","/o\ "," ^  "][$i%5],$n<$w*ceil($i++/5)?$n%$w:$w),$w*4+2)."|\n";

Онлайн версия


Я получил ошибку при нажатии «онлайн-версия» и «выполнить код».
Кжетил С.

1
@KjetilS. изменить версию PHP на 7.1
Йорг Хюльсерманн

Да, 7.1 в порядке.
Кжетил С.

5

Python 2, 144 байта

n,w=input()
s=' ';k='|';a=k+s*w*4+s+k;print a
while n>0:
 for i in['\\O/','-O-','/o\\',' ^ ']:print k+s+(i+s)*min(w,n)+s*4*(w-n)+k
 n-=w;print a

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


Это неверно, так как пропускает пустую строку между муравьями (сравните пример w=1& n=3с вашей версией).
FatalMerlin

@FatalMerlin Спасибо! Исправлено :)
математик наркоман

4

05AB1E , 47 байтов

"   \O/-O-/o\ ^ "5äðìI.D)IôvyøJ'|ì})˜¬¸«.B„ |«»

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

объяснение

"   \O/-O-/o\ ^ "                                # push the ant-string
                 5ä                              # split into 5 parts
                   ðì                            # prepend a space to each
                     I.D                         # copy input-1 number of times
                        )                        # wrap in a list
                         Iô                      # split into parts each the size of input-2
                           v                     # for each row of ants
                            yø                   # zip, so body parts are on the same row
                              J'|ì               # join to string and prepend a pipe to each
                                  }              # end loop
                                   )˜            # wrap in a flattened list
                                     ¬¸«         # append a copy of the first row (spaces)
                                        .B       # pad rows to equal length with spaces
                                          „ |«   # append " |" to each row
                                              »  # merge on newlines

4

СОГЛ , 74 71 74 байта

 |pe4*I@*o |o→L:"╔O¦‘2n;"nΤ↕¬┐α┐PΝld‘*┼eG-’⁵@**┼ |4*┼OL→ALbe÷:?{eA}}be%:?A

Первая часть: функция, которая выводит пустую часть журнала

             →L  define function L
 |p              output in a newline "|"
   e4*           multiply width by 4
      I          increace that
       @*        get that many spaces
         o       append [to current line] that
           |o    append "|"

Вторая часть имеет сжатую строку "nΤ↕¬┐α┐PΝld‘, которая является муравьем. Это распаковывает до \-/ OOo^/-\ . Это муравей (с интервалом справа), но взятый сверху вниз, затем вправо, как

159d
26ae
37bf
48cg

Он хранится так, потому что функция добавляет строки подобным образом (потому что тогда вы можете умножить строку, чтобы добавить к ней несколько экземпляров). Сама часть: функция, которая запрашивает число в стеке, обозначающее, сколько муравьев нарисовать.

                                    Example input: width 3, on stack 2
:                                   duplicate the input                             [2,2]
 "╔O¦‘                              push "| | | | "                                 [2,2,"| | | | "]
      2n                            split into chunks of two                        [2,2,["| ","| ","| ","| "]]
        ;                           put one of the input copies ontop of the stack  [2,["| ","| ","| ","| "], 2]
         "...‘*                     multiply that many ants                         [2,["| ","| ","| ","| "], "\\-/ OOo^/-\\     \\-/ OOo^/-\\     "]
               ┼                    add horizontally the ants                       ["| \O/ \O/ \O/ ",
                                                                                     "| -O- -O- -O- ",
                                                                                     "| /o\ /o\ /o\ ",
                                                                                     "|  ^   ^   ^  "]
                e                   get the width                                   [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 3]
                 G-                 subtract input from it                          [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 1]
                   ’⁵@*             push 16 spaces                                  [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], 1, "                "]
                       *            multiply [the 16 spaces and empty place count]  [["| \\O/ \\O/ \\O/ ", "| -O- -O- -O- ", "| /o\\ /o\\ /o\\ ", "|  ^   ^   ^  "], "                "]
                        ┼           add that horizontally                           [["| \\O/ \\O/ \\O/     ", "| -O- -O- -O-     ", "| /o\\ /o\\ /o\\     ", "|  ^   ^   ^      "]]
                          |4*┼      add 4 vertical bars to the array                [["| \\O/ \\O/ \\O/     |", "| -O- -O- -O-     |", "| /o\\ /o\\ /o\\     |", "|  ^   ^   ^      |"]]
                              O     output the array                                []
                               L    call the empty line function                    []
                                →A  define as A

И основная функция:

L                  call the empty line drawing function
 be÷               push floor(b/e) (the amount of full lines)
    :?{eA}}        that many times call A with the full width on the stack
           be%     push b%e (the leftovers)
              :?   if truthy (aka !=0)
                A   call A with for the leftovers

2

Perl 5 , 159 байт

($w,$n)=@ARGV;
print
$_%$w?"":"| ",
['   \O/-O-/o\\ ^ '=~/.../g]->[($_<5*$w*int$n/$w||$_%$w<$n%$w?$_/$w:0)%5],
($_+1)%$w?" ":" |\n"
for 0..$w*(6+5*int(($n-1)/$w))-1

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

Perl 5 , 152 байта

Еще один, основанный на решении Python:

($w,$n)=@ARGV;
$b=' 'x($w*4+1);$j=$a="|\n|";
map$j.=' '."$_ "x($w<$n?$w:$n).'    'x($w-$n).$a,'\\O/','-O-','/o\\',' ^ 'and$n-=$w
while$n>0;
print"|$b$j$b|"

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


0

Mathematica 210 байт

StringRiffle[If[#2==c||#2==1,"|",If[r-#1<6&&#2>2+4 (a+w-h w),Table[" ",5,4],Characters@"    \\O/ -O- /o\\  ^  "~Partition~4][[1+Mod[#1-1,5],1+Mod[#2+1,4]]]]&~Array~{r=5(h=⌈(a=#)/(w=#2)⌉)+1,c=4w+3},"\n",""]&

Думая, что мне нужно сделать игру в гольф на основе Mathematica.


0

Python 2, 166 байт

w,n=input()
print'\n'.join(['|'+' '*w*4+' |']+[' '.join(['|']+[p]*r+['   ']*(w-r)+['|'])for r in[w]*(n/w)+[[],[n%w]][n%w>0] for p in['\O/','-O-','/o\\',' ^ ','   ']])

0

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

NθF⪪× Nθ«←P↓⁶M⊗⊕⊗θ→P↓⁶⸿E⪪\O/-O-/o\ ^ ³⭆ι⁺μκ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Nθ

Ввод w.

F⪪× Nθ«

Введите n, затем создайте строку nпробелов и разбейте ее на строки длины w(кроме последней части, которая может быть меньше). Цикл по этим строкам.

←P↓⁶M⊗⊕⊗θ→P↓⁶⸿

Распечатать стороны раздела журнала.

  \O/-O-/o\ ^           Literal string
 ⪪            ³         Split into (4) pieces of length 3
E                       Map over each piece
               ⭆ι       Map over each row space
                 ⁺μκ    Appending the piece
                        Implicitly print the results on separate lines
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.