Намалюйте кілька розширюваних стрілок


25

Ця задача полягає у друкуванні серії зростаючих стрілок мистецтва ASCII. Я опишу візерунок словами, але може бути простіше подивитися, як виглядає початок цієї серії:

>
<
->
<-
-->
<--
--->
<---
---->
<----
----->
<-----
------>
<------
...

Стрілка довжиною n містить головку стрілки ( <або >) та n-1тире ( -). На стрілці правою стороною спочатку є тире, потім a >. Ліва стрілка починається з <, а за нею - тире. Серія складається зі nстрілки довжиною праворуч з наступною стрілкою довжиною n лівою стороною, з n від 1 до нескінченності.

Щоб виконати завдання, напишіть програму або функцію, яка займає один вхід, ціле число i >= 1та виводить перші iстрілки. Стрілки індивідуальні, не в парах зліва наліво, тому для i=3вас слід вивести:

>
<
->

Ви можете повернути список рядків або роздрукувати їх одна за одною. Якщо друкується, стрілки повинні бути обмежені деяким послідовним роздільником, який не повинен бути новим рядком, як у прикладі.

Це , тому виграє найменше байтів.



Чи можна мати пробіли до / після кожного рядка?
Олів'є Грегоар

@ OlivierGrégoire Так, пробіл пробілів у порядку.
Павло

А заголовок пробілів?
Олів'є Грегоар

@ OlivierGrégoire Так, це добре.
Павло

Відповіді:


9

Полотно , 10 байт

⇵-×<n¹[↔}]

Спробуйте тут!


Я не знаю жодного полотна, але це бачу малюнок стрілки, який я бачу? якось схоже на це!
Павло

2
це вбудований "зворотний горизонтальний" (також міняється >& <), на жаль, немає вбудованих стрілок: p
dzaima

8

R , 69 байт

for(i in 1:scan()-1)cat('<'[i%%2],rep('-',i/2),'>'[!i%%2],'
',sep='')

Спробуйте в Інтернеті!

  • -5 байт завдяки @Giuseppe
  • -3 байти завдяки @Robert S.

strrepпримушує свій другий аргумент, щоб integerви могли використовувати його /замість%/%
Джузеппе

Ви також можете aповністю позбутися, 0...(n-1)замість цього індексуючи : Спробуйте в Інтернеті!
Джузеппе

Я ідіот ... дякую! : D
digEmAll

@Giuseppe: також я щойно помітив видалене питання про Роберта С. Я можу використовувати реп замість strrep і зберегти 3 байти ... (facepalm)
digEmAll

8

Java (JDK) , 81 байт

n->{for(int i=0;i<n;)System.out.printf(i%2<1?"<%s%n":"%s>%n","-".repeat(i++/2));}

Спробуйте в Інтернеті!

Пояснення

n->{                  // int-accepting consumer
 for(int i=0;i<n;)    //  for each i from 0 to n-1 included
  System.out.printf(  //   output on stdout with a pattern
   i%2<1              //    if i is even:
    ?"<%s%n"          //     use the left-arrow pattern
    :"%s>%n",         //    else: use the right-arrow pattern
   "-".repeat(i++/2)  //    fill the "%s" in the pattern with i/2 dashes, and increment i
  );                  // 
}                     //


@candied_orange Це не є самодостатнім.
Олів’є Грегоар

Як щодо зробити так ?
candied_orange

@candied_orange Це те саме: імпорт необхідний у рахунку.
Олів'є Грегоар

Чому не import java.util.function.*;рахується?
candied_orange

8

Haskell, 41 40 байт

(`take`g">")
g p=p:('<':init p):g('-':p)

Спробуйте в Інтернеті!

Звичайна стара рекурсія: почати з рядка p= ">", збирати p, а <перед усіма, крім останнього знака pта рекурсивного дзвінка, з одного, -поставленого перед p. Візьміть перші nпункти цього списку.

Редагувати: -1 байт завдяки @xnor.


1
Дивна зміна, щоб зберегти байт.
xnor

6

Commodore BASIC V2 (C64), 94 байти

0inputn:fOi=1ton:oniaN1gO1:?"<";
1on-(i<3)gO2:fOj=1.5toi/2:?"-";:nE
2on-nOiaN1gO3:?">";
3?:nE

Не зовсім впевнений у кількості байтів, це засновано на поданні тексту для введення дійсної програми. Це трохи коротше на диску (91 байт), оскільки BASIC V2 використовує "токенізоване" представлення програм.

Демонстрація в Інтернеті

Трохи "невольф":

0 inputn:fori=1ton:oniand1goto1:print"<";    :rem read n from user, loop to n, if odd skip "<"
1 on-(i<3)goto2:forj=1.5toi/2:print"-";:next :rem skip for i<3, print (i-1)/2 times "-"
2 on-notiand1goto3:print">";                 :rem if even skip ">"
3 print:next                                 :rem newline and next loop iteration

6

Модифікуючий Brainfuck , 55 байт

Візьміть введення як код символу.
Підтримуйте лише введення до 255.
Використовуйте нульовий символ для розділення рядків.

Випадково всі символи малювання стрілки використовуються як команди BF. На жаль, він не зберігає жодного байти (на даний момент).

>>,[<<[-<.>>+<]<<.>>.+>>-[<<<<<.>>>>[-<+<.>>].>-<]>]<>-

Спробуйте в Інтернеті!

Пояснення

 Code  |              Memory         | Output | Comment
-------+-----------------------------+--------+--------------------------
       | '<' '>' '-' [0]  0   0   0  |        |
>>,    | '<' '>' '-'  0   0  [x]  0  |        |
[      |                             |        |
       | '<' '>' '-'  l   0  [x]  0  |        | l = arrow length
<<[-<  |                             |        | copy l to next cell
.>>+<] |                             |        | and print '-'
       | '<' '>' '-' [0]  l   x   0  | -----  | there are l '-'s
<<.    | '<' [>] '-'  0   l   x   0  | >      |
>>.+   | '<' '>' '-' [1]  l   x   0  | <null> |
>>-    | '<' '>' '-'  1   l  [y]  0  |        | y=x-1
[      |                             |        | execute if y>0
<<<<<. | [<] '>' '-'  1   l   y   0  | <      |
>>>>   | '<' '>' '-'  1  [l]  y   0  |        |
[-<+<. |                             |        |
>>]    | '<' '>' '-'  L  [0]  y   0  | -----  | L=l+1
.      | '<' '>' '-'  L  [0]  y   0  | <null> |
>-<]>] |                             |        | decrement y
<>-    |                             |        | do nothing, used as data


5

Піт, 17 байт

m_W%d2+*\-/d2@"><

Вихід - це список рядків. Спробуйте його онлайн тут .

m_W%d2+*\-/d2@"><"dQ   Implicit: Q=eval(input())
                       Trailing "dQ inferred
m                  Q   Map [0-Q), as d, using:
          /d2            Floored division of d by 2
       *\-               Repeat "-" the above number of times
      +                  Append to the above...
             @"><"d      Modular index d into "><" - yields ">" for even d, "<" for odd
                         - examples: d=4 gives "-->", d=7 gives "---<"
 _W                      Reverse the above if...
   %d2                   ... (d % 2) != 0
                       Implicit print result of the map

5

PowerShell , 62 56 50 байт

param($n)(0..$n|%{($j='-'*$_)+'>';"<$j"})[0..--$n]

Спробуйте в Інтернеті!

Петлі від 0введення до $nкожної ітерації, створюючи дві стрілки. Потім вони індексуються, 0..--$nщоб витягнути правильну кількість елементів.

Збережено 6 байт завдяки KGlasier.


Заплутавшись із власним рішенням, я знайшов спосіб скоротити кілька байт на вашому: Можна зберегти 4 байти, загорнувши цикл у дужки та індексуючи безпосередньо. тобто param($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]. Тому зараз вам не потрібно писати $xдвічі.
KGlasier

Крім того, ви можете заощадити ще два байта, не використовуючи ++в ($j='-'*$_++)якості не використовується $_ніде.
KGlasier

1
@KGlasier Awesome - спасибі за очевидні гольфи! :)
AdmBorkBork

5

Python 3, 53 байти

Моя перша відповідь кодогольфа.

lambda x:[i%2*"<"+i//2*"-"+~i%2*">"for i in range(x)]

-10 байт завдяки Джо Кінгу


5

Haskell , 51 44 байт

-7 байт завдяки xnor (за допомогою iterateрозуміння списків)!

(`take`do b<-iterate('-':)"";[b++">",'<':b])

Спробуйте в Інтернеті!

Пояснення / Недозволений

Використання do-notation заощаджує нас concat, а використання infix-notation дозволяє функцію pointfree з take, скасування цих даних дасть:

f n = take n $ concat [ [b++">", '<':b] | b <- iterate ('-':) "" ]

5

Japt -m, 16 15 13 12 байт

Збережено 1 байт завдяки Шаггі

g<i>)iUUz ç-

Перевірте це в Інтернеті

Пояснення:

-m            // Map the program through [0...Input); U becomes the iterative number
g<i>)iUUz ç-  
 <i>          // ">" prepended with "<", creating "><"
g             //   Get the char at index U, with index-wrapping
    i         // Insert:
     U        //   At index U, with index-wrapping
         ç-   //   "-" repeated:
      Uz      //     U/2 times


@Shaggy Ha! Дуже розумно, дякую!
Олівер


4

MathGolf , 17 15 байт

Збережено 2 байти завдяки Джо Кінгу та Кевіну Крейсейну

{ï½'-*'>ï¥╛Å⌡\n

Спробуйте в Інтернеті!

Пояснення

15-байтовий підхід відрізняється порівняно з моїм оригінальним рішенням, я не можу брати жодної заслуги за реалізацію.

{                 start block or arbitrary length
 ï                index of current loop, or length of last loop
  ½               pop a : push(a//2 if int else a/2)
   '-             push single character "-"
     *            pop a, b : push(a*b)
      '>           push single character ">"
        ï         index of current loop, or length of last loop
         ¥        modulo 2
          ╛       if without else
           Å      start block of length 2
            ⌡     decrement twice
             \    swap top elements
              n   newline char, or map array with newlines

Як if/elseпрацює в MathGolf? Я знаю, як працюють операції if-without-else та else-without-if, але як створити if {...} else {...} в MathGolf ¿? (Можливо, я повинен опублікувати це в чаті замість цього місця. Але, можливо, я можу зберегти 1 байт, якщо зможу виправити if-else.)
Кевін Круїйсен

1
@KevinCruijssen Я думаю, що це працює з наступними двома командами / блоками. наприклад ¿12, натиснутиме 1, якщо є істинним, інакше 2, ¿Å3*Å1+додасть один, якщо інакше, потроїть наступний елемент
Джо Кінг

@KevinCruijssen Якщо / else з'являється з коду два оператори або блоки. Джо Кінг правильний у своєму прикладі, але ви могли також зробити ¿{"foo"}{"bar"}або ¿1{2}.
maxb

@JoKing Я додам TODO, щоб виправити документи для операторів нарізки.
maxb

1
15 байт, використовуючи рішення @ KevinCruijssen
Джо Кінг

4

Japt -m , 14 байт

"<>"¬hUUz ç-)q

Спробуйте в Інтернеті!

Оновлено абсолютно новим методом.

Пояснення:

                  #Implicitly map over the range [0..input) as U
"<>"              #The string "<>"
    ¬             #Split into the array ["<",">"]
     hU     )     #Replace the element at index U with wrapping:
           -      # The character '-'
          ç       # Repeated a number of times equal to
       Uz         #  U integer divided by 2
             q    #Join the array to a string

1
çавтоматично перекидає свій перший параметр у рядок, щоб ви могли його скинути '.
Олівер

1
uМетод вам не потрібен завдяки обгортанню індексу, так що це може бути 14 байт.
Кудлатий

4

C (gcc) , 80 77 76 74 71 байт

g(n,i,j){--n&&g(n);for(j=n%2,i=n/=2;putchar(~n?n---i*j?45:62-j*2:0););}

Спробуйте в Інтернеті!

-3 байти з ідеєю від ASCII .

-1 з \0замість\n

-5 перестановки деталей


Вихідні дані включають в себе трейлінг \0.

g(n,i,j){
    --n&&g(n);              //draw smaller arrows first (if n>1)
    for(j=n%2,i=n/=2;       //j:!(input parity); i:arrow len-1=ceil(input)/2-1
        putchar(~n          //if n>=0, arrow is not yet completed
                ? n---i*j   //if not first (j==1) or last (j==0) char of arrow:
                  ? 45      // output '-'
                  : 62-j*2  // otherwise, output the appropriate arrow head
                : 0););     //\0 after arrow complete. putchar returns 0; loop terminates
}

це може бути зрозуміліше? idk
лише для ASCII


@ ASCII-тільки Так, це повинно бути зрозуміліше, навіть якщо це не має значення для рахунку. Щодо цього другого пункту .. дякую за ідею! З цим вдалося обрізати до 78.
attinat


XD у вас все ще є !n--в першому кодовому блоці
лише для ASCII




3

Вугілля деревне , 16 байт

NθFθ«⊘ι↓>‖T»Fθ‖T

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. У мене було три 17-байтові рішення, перш ніж я врешті-решт наткнувся на це. Пояснення:

Nθ

Вхідні дані n.

Fθ«

Повторіть nразів, 0-індексується.

⊘ι

Накресліть лінію -s довжиною s половину індексу (усічена).

↓>

Намалюйте стрілку стрілки та перейдіть до наступного рядка.

‖T»

Відбийте все, перевернувши стрілки.

Fθ‖T

Вищеописаний цикл має nвідображення, але нам потрібна парна кількість відображень, тому виконайте ще одне nвідображення.



3

JavaScript, 49 байт

f=n=>--n?f(n,l='')+(n%2?`
<`+l:`
${l+='-'}>`):'>'

Спробуйте в Інтернеті!


Ух, досить круто
Лімбо

... але це накидається 10000, тим часом моє рішення ES6 все ще працює: D У будь-якому випадку, ваше рішення дуже круте)
Limbo


2

6502 код машини (C64), 49 байт

00 C0 20 9B B7 A2 00 8A 4A A8 90 05 A9 3C 20 D2 FF A9 2D C0 00 F0 06 20 D2 FF 
88 D0 FA 8A 4A B0 05 A9 3E 20 D2 FF A9 0D 20 D2 FF E8 E4 65 D0 D7 60

Ще трохи коротший, ніж BASIC ;) Цей має 255числовий діапазон лише до, тому що натуральний цілий розмір машини має лише 8 біт.

Демонстрація в Інтернеті

Використання: SYS49152,[n](наприклад, SYS49152,3приклад із завдання)

Прокоментували розбирання :

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; get unsigned byte from commandline
.C:c003  A2 00       LDX #$00           ; main loop counter
.C:c005   .loop:
.C:c005  8A          TXA                ; loop counter to accumulator
.C:c006  4A          LSR A              ; divide by 2, shift lowest bit to C
.C:c007  A8          TAY                ; result to Y
.C:c008  90 05       BCC .toright       ; C clear -> counter even, skip '<'
.C:c00a  A9 3C       LDA #$3C           ; load character '<'
.C:c00c  20 D2 FF    JSR $FFD2          ; output character
.C:c00f   .toright:
.C:c00f  A9 2D       LDA #$2D           ; load character '-'
.C:c011  C0 00       CPY #$00           ; counter/2 == 0 ? then no dashes
.C:c013  F0 06       BEQ .skipdashes
.C:c015   .printdashes:
.C:c015  20 D2 FF    JSR $FFD2          ; output character
.C:c018  88          DEY                ; decrement Y
.C:c019  D0 FA       BNE .printdashes   ; not 0 yet -> repeat
.C:c01b   .skipdashes:
.C:c01b  8A          TXA                ; loop counter to accumulator
.C:c01c  4A          LSR A              ; shift lowest bit to C
.C:c01d  B0 05       BCS .toleft        ; C set -> counter odd, skip '>'
.C:c01f  A9 3E       LDA #$3E           ; load character '>'
.C:c021  20 D2 FF    JSR $FFD2          ; output character
.C:c024   .toleft:
.C:c024  A9 0D       LDA #$0D           ; load newline character
.C:c026  20 D2 FF    JSR $FFD2          ; output character
.C:c029  E8          INX                ; next loop iteration
.C:c02a  E4 65       CPX $65            ; compare to command line argument
.C:c02c  D0 D7       BNE .loop          ; not reached yet -> repeat main loop
.C:c02e  60          RTS                ; exit


2

К (нг / к) , 31 29 байт

{"<->"x#2,x{(1=*x)_1,2-|x}\0}

Спробуйте в Інтернеті!

спочатку ми генеруємо списки з 0 замість "<", 1 замість "-"і 2 замість ">":

{ } функція з аргументом x

x{... }\0застосувати внутрішні xчаси функції , починаючи з початкового значення0 та зберігаючи проміжні результати

|x реверс

2- замініть 0 на 2 і навпаки, збережіть 1, якими вони є

1, подати а 1

(1=*x)_перша xдорівнює 1? якщо так, киньте один елемент, інакше скиньте 0 елементів (нічого не робити)

2,додайте 2 для початкової ">"стрілки

x#у нас є занадто багато списків, тому візьміть лише перший xз них

"<->" використовувати елементи списків (0/1/2) як індекси у цьому рядку


Я хотів би попросити пояснення (я ще не почав вивчати K, я не знаю, з якої версії почати ...)
Гален Іванов,

1
@GalenIvanov я намагався написати пояснення, сподіваюся, це має сенс. дякую за інтерес до моєї улюбленої мови :) Є кілька реалізацій з різними перевагами та недоліками ( оригінал kx , kona , oK і я працюю над собою). Ви хочете приєднатися до кімнати чату для apl, щоб я міг дати вам більше деталей?
ngn

Дякую, я вже там
Гален Іванов

2

05AB1E , 23 20 байт

FNÉD„><è'-N;∍«s_iR},

Спробуйте в Інтернеті!

Вперше використовуючи для цього 05AB1E або будь-яку іншу мову для гольфу. Будь-які ідеї вітаються.

-3 від Кевіна Круїссена


1
Ласкаво просимо у світ 05AB1E, і приємна перша відповідь. +1 від мене. :) "><"можна „><зберегти байт. Є вбудовані функції для 1, 2, 3 і символьних рядків, будучи ', і відповідно. Ось 18-байтну альтернативу, яку я придумав, але, можливо, це могло бути трохи більше в гольф. Якщо ви ще цього не бачили, у нас є поради щодо гольфу на сторінці 05AB1E , а також сміливо запитайте що-небудь у чаті .
Кевін Круїссен

1
@KevinCruijssen Дякую за ваші ідеї. Я не думаю, що просто використовую ваш код, оскільки він відчуває себе досить відмінним від мого, але я використовував ідею модуля 2 як перевірку на наявність непарного числа. Я також використовую ідею двох символів. Я б зовсім не заперечував, якби ви опублікували 18-байтну версію самостійно.
nedla2004


2

C # (.NET Core) , 90 байт

a=>{for(int i=0;i<a;i++){var s=new String('-',i/2);Console.WriteLine(i%2<1?s+">":"<"+s);}}

Спробуйте в Інтернеті!

Використовує делегата Action, щоб вивести вхід і не вимагати повернення.

Безголівки:

a => {
    for(int i = 0; i < a; i++)          // from [0, a)
    {
        var s = new String('-', i / 2);     // create string of dashes of length (a / 2)
        Console.WriteLine(i % 2 < 1 ?       // write arrow
                                s + ">" :       // if i is even: dashes plus ">"
                                "<" + s);       // if i is odd: "<" plus dashes
    }
}


@EmbodimentofIgnorance не працює, пропускаючи перший вихідний рядок ">".
Meerkat


2

ES6, 96 82 79 70 байт

Спробуйте в Інтернеті! (Спасибі @Oliver)

n=>[...Array(n)].map((_,i)=>(i%2?"<":"")+"-".repeat(i/2)+(i%2?"":">"))

1
Ласкаво просимо до PPCG! За замовчуванням прийняття даних як змінної заборонено; ви повинні або перетворити його на функцію (просто вставте a i=>перед кодом!) або з аргументу командного рядка або STDIN або чогось іншого.
HyperNeutrino

@HyperNeutrino добре, відредагована відповідь. Однак найбільш відповідна відповідь містить лише тіло функції, але добре. У всякому разі я аутсайдер)
Лімбо

Ви можете пов’язати це? Я не думаю, що жоден з них є недійсним, принаймні, не першими.
HyperNeutrino


1
Ще кілька байтів, якщо ви впорядкуєте цього останнього потрійного оператора та видалите центральні дужки: Спробуйте в Інтернеті
Олівер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.