Нарисуйте несколько расширяющихся стрелок


25

Эта задача касается печати серии растущих стрелок ASCII-art. Я опишу шаблон словами, но может быть проще взглянуть на то, как выглядит начало этой серии:

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

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

Чтобы выполнить задачу, напишите программу или функцию, которая принимает одно входное значение, целое число i >= 1и выводит первые iстрелки. Стрелки индивидуальны, а не в парах вправо-влево, поэтому i=3вы должны вывести:

>
<
->

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

Это , поэтому побеждает меньше байтов.



Можем ли мы иметь пробелы до / после каждой строки?
Оливье Грегуар

@ OlivierGrégoire Да, пробел в порядке.
Павел

И пробиваете пробелы?
Оливье Грегуар

@ OlivierGrégoire Да, все в порядке.
Павел

Ответы:



8

R 69 байт

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

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

  • -5 байт благодаря @Giuseppe
  • -3 байта благодаря @ Роберту С.

strrepприводит второй аргумент, integerчтобы вы могли использовать /вместо%/%
Джузеппе

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

Я идиот ... спасибо! : D
digEmAll

@Giuseppe: также я только что заметил удаленный вопрос о Роберте С. Я могу использовать rep вместо 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

Pyth, 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

Кроме того, вы можете сохранить еще два байта, не используя ++in, ($j='-'*$_++)поскольку вы больше $_нигде не используете .
KGlasier

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


5

Haskell , 51 44 байта

-7 байт благодаря xnor (используя iterateover-list-compceptionsion)!

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

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

Объяснение / Ungolfed

Использование do-notation спасает нас concat, а использование infix-notation позволяет использовать функцию pointfree, отмена takeкоторой даст:

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

5

Джапт -m, 16 15 13 12 байт

Сохранено 1 байт благодаря Shaggy

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


@ Шэгги Ха! Очень умно, спасибо!
Оливер


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-без-else и else-без-if, но как создать if {...} else {...} в MathGolf с помощью ¿? (Может быть, я должен опубликовать это в чате, а не здесь ... Но я мог бы сохранить 1 байт, если смогу исправить if-else.)
Кевин Круйссен

1
@KevinCruijssen Я думаю, что это работает со следующими двумя командами / блоками. Например ¿12, нажмет 1, если true, иначе 2, ¿Å3*Å1+добавит один, если true, иначе утроит следующий элемент
Джо Кинг,

@KevinCruijssen If / 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-only Да, это должно быть яснее, даже если это не имеет значения для byountount. Что касается этого второго пункта .. спасибо за идею! Удалось урезать до 78 с этим.
attinat


XD у вас все еще !n--в первом кодовом блоке
только для ASCII




3

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

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

Попробуйте онлайн! Ссылка на подробную версию кода. У меня было три 17-байтовых решения, прежде чем я наткнулся на это. Объяснение:

Nθ

Вход n.

Fθ«

Повторите nраз, 0-проиндексированы.

⊘ι

Нарисуйте линию -s длины, равной половине индекса (усеченной).

↓>

Нарисуйте стрелку и перейдите к следующей строке.

‖T»

Отражать все, переворачивая стрелки.

Fθ‖T

Вышеуказанный цикл имеет nотражения, но нам нужно четное количество отражений, поэтому выполните другое nотражение.



3

JavaScript, 49 байт

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

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


Вау, довольно круто
Limbo

... но все же 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

K (нгн / к) , 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 , ки , и я работаем над моим собственным). Вы хотели бы присоединиться к чат-комнате apl, чтобы я мог предоставить вам более подробную информацию?
нгн

Спасибо, я уже там
Гален Иванов

2

05AB1E , 23 20 байт

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

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

Впервые использую 05AB1E или любой другой язык для игры в гольф. Любые идеи приветствуются.

-3 от Кевина Круйссена


1
Добро пожаловать в мир 05AB1E и приятного первого ответа. +1 от меня. :) "><"можно „><сохранить байт. Есть встроенные функции для 1, 2, 3 и символьных строк, будучи ', и соответственно. Вот 18-байтовая альтернатива, которую я придумал, но, возможно, ее можно было бы сыграть немного больше. Если вы еще этого не видели, у нас есть советы по игре в гольф на странице 05AB1E , а также вы можете задать любой вопрос в чате .
Кевин Круйссен

1
@KevinCruijssen Большое спасибо за ваши идеи. Я не чувствую себя хорошо, просто используя ваш код, так как он довольно сильно отличается от моего, но я использовал идею по модулю 2 как проверку, является ли число нечетным. Я также использую идею с двумя символами. Я бы не стал возражать, если бы вы опубликовали 18-байтовую версию самостоятельно.
Недла2004


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

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

Использует делегат действия для ввода ввода и не требует возврата.

Ungolfed:

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 Не работает, отсутствует первая выходная строка ">".
Сурикат


2

ES6, 96 82 79 70 байт

Попробуйте онлайн! (Спасибо @Oliver)

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

1
Добро пожаловать в PPCG! По умолчанию принятие ввода в качестве переменной запрещено; Вы должны либо сделать это функцией (просто вставьте i=>перед вашим кодом!) или из аргумента командной строки или STDIN или что-то еще.
HyperNeutrino

@HyperNeutrino хорошо, отредактированный ответ. Тем не менее, наиболее проголосовавший ответ содержит только тело функции, но все в порядке. В любом случае, я посторонний)
Лимбо

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

1
Еще несколько байтов: попробуйте онлайн
Оливер

1
Еще несколько байтов, если вы переставите последний троичный оператор и удалите центральную скобку: попробуйте онлайн
Оливер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.