Мурахи з природного журналу


23

Це сприятливий виклик для початківців і вбивця часу.

Я сказав лише -natural- log, оскільки назва була занадто короткою, це не має нічого спільного з логарифмами.

Дано 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. Мурахи також напрочуд добре організовані, вони заповнять колоду зліва направо, зверху вниз; ніби вони читали книгу.

Мурахи-ксампли

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 Я зараз це пам'ятаю. Я завершив це на півдорозі і неправильно прочитав специфікацію, можливо, підсвідомо вкрав частину цієї ідеї.
Magic Octopus Urn

Це мурашники.
Арджун

"Кожен ряд мурашок повинен бути шириною". Якщо w>nперед правою рукою має бути додатковий простір |чи ні, чи це нам належить?
Джонатан Аллан

1
-1 за Ant-xamples(я ненавиджу каламбури)
caird coinheringaahing

Відповіді:


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.
Magic Octopus Urn

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

Інтернет-версія


Я отримав помилку, натиснувши "онлайн-версію" та "виконати код".
Kjetil S.

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

Так, 7.1 добре.
Kjetil S.

5

Пітон 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

SOGL , 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",""]&

Думаючи, що мені потрібно зробити мову для гольфу на основі математики.


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.