Простая печать стрелок


23

Что касается практики игры в гольф, я выполнял задания на вступлении моей подруги в Python. Я обнаружил, что для этого задания было несколько стратегий, которые были очень близки по количеству персонажей, и я уверен, что люди здесь могут найти даже лучшие способы. Хотя меня больше всего интересуют способы сделать это в Python, я хотел бы знать, насколько эта программа может быть наиболее удачной, поэтому это кодовый гольф и выигрыш с кратчайшим ответом.

Правила:

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

Применяются стандартные лазейки.


Задание 3: Стрелки

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

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *

23
Это выглядит как дома ... о, не важно.
TessellatingHeckler

Разрешены ли пробелы в каждой строке?
lirtosiast

@ThomasKwa да.
Акс.

Можем ли мы использовать управляющие символы для перемещения курсора, как в этом вопросе ?
lirtosiast

@ThomasKwa Конечно ... хотя я, честно говоря, не уверен, что это значит, и мне интересно увидеть это в действии.
Акс.

Ответы:


8

Pyth, 23 байта

Может или не может быть действительным, основываясь на ответе на этот комментарий . Несмотря на это, я нашел это аккуратным, и, если оно неверно, ответы других Пиф также недействительны. ;) Ну, это действительно так , потому что я, видимо, пропустил явно очевидное. : /

РЕДАКТИРОВАТЬ: Я выиграл !!!! YESSS !!!! Самый первый раз! : D

j+_J_Wqz\r.e+*dkb*\*QtJ

Живая демоверсия.


1
m+*\ d\*Qвместо того, чтобы перечислять чтоли. Сохраняет 2 байта.
Якуб

7

Пиф, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

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

Основная идея здесь состоит в том, чтобы создать одну строку, которая, скажем, 5, выглядит следующим образом:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

А затем переверните его вверх дном, если мы получим в lкачестве нашего вклада. Затем мы берем все input-1строки, кроме последних, и распечатываем их.


7

Python 2, 81 79 байт

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Может быть, еще можно играть в гольф, но посмотрим :)


2
Хорошая идея с наличием входных переменных lи r. Я не понял, что ввод evalвводится в той же среде, что и код.
xnor

4

Pyth, 30 28 27 байтов

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

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

По-видимому, в настоящее время я связан с FryAmTheEggman совершенно другим подходом. (Я думаю, что один гениален.)

пример

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

объяснение

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print

@ Pietu1998 Меня все еще интересует базовое описание того, что ты делаешь. Я вижу, у вас есть только 1 петля и нет карты или лямбда ...
Акс.

@aks. Я добавил объяснение.
PurkkaKoodari

4

PowerShell, 91 85 102 байт

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Получает столбцы, сохраняет их в $c. Мы вычитаем один, потому что в каждом столбце также есть, *и нас интересует только количество пробелов.
  • Если введенное значение было a 1, напечатайте *и выйдите - остальная часть сценария не имеет значения. +
  • Следующий раздел сначала получает направление и проверяет, действительно ли это -eqправильно l, затем создает массив на основе индексации в массив динамически генерируемых массивов на основе значения $c. Магия. По сути, это то, сколько пробелов в строке нам нужно.
  • Например, для 5 rэтой коллекции будет держать (0,1,2,3,4,3,2,1,0).
  • Принимает массив и направляет его в %цикл Foreach-Object , где мы выводим строку из числа пробелов X, а затем*

Пример использования:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Редактировать - удалить переменную $e, отправив коллекцию напрямую.
Edit2 - теперь правильно составляет 1 столбец.

+ Если по-прежнему обязательно принимать ввод для направления для стрелок из 1 столбца (я утверждаю, что это не так), мы можем поменять местами расположение Read-Hostи потерять еще пару байтов, повторно введя $dпеременную, для 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}

Попробуйте поставить 1 столбец, а слева - вы получите 2-столбчатую стрелку вправо. Попробуйте поставить 1 столбец и справа - вы получите ошибку «Указанный аргумент вне диапазона допустимых значений». Я думал, что ваши 85 можно будет побить, избегая удвоенных диапазонов. Но я даже не могу подобраться. Учитывая 1 стрелку столбца, я в настоящее время на 112 символов. > _ <
TessellatingHeckler

1
@TessellatingHeckler Спасибо - исправлено.
AdmBorkBork

1
Это доводит вас до 102, а у меня - до 102. Я не могу больше смотреть на это, но должен быть еще один, который я могу удалить ...: D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 байт

Спасибо @ThomasKwa за правильное вычисление байтов и игру в гольф 10 байтов .

Проверено на моем TI-84 + Silver Edition.

Первое представление TI-BASIC, приветствуются предложения по игре в гольф (я пока не знаю много хитростей). Если имя играет фактор, показанный в памяти, это было 3 символа вместо 1 (я посмотрел счетчик байтов на моем калькуляторе). Эта программа ограничена ограничениями outputфункции (я думаю, что стрелками длиной 4), но я мог бы, вероятно, переключиться на text, который отображается графически, если это слишком мало длины.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Обратите внимание, что это также не очищает экран и не приостанавливает его.

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


@ThomasKwa Спасибо! Я сделаю это сейчас.
Коул

2
Второе: Ansбесплатно, потому что вы не используете его для ввода и Output(не изменяете Ans. Используйте его и избавьтесь от переменной A. Вы можете назначить с помощью -2(Str1="R; нет необходимости в условном.
lirtosiast

1
@ThomasKwa спасибо за советы, похоже, у меня есть способы пойти в TI-BASIC.
Коул

3
Третье: нет необходимости умножать значение на -2. Просто сделайте Str1="Rдля второй строки. Это делает четвертую строку Output(I,(1-2Ans)abs(I-L)+AL+1,"*, которая дает вам еще 4 байта. Но ждать, есть идиома для (1-2Ans)-Это cos(πAns), что экономит один байт, плюс один больше , потому что мы получаем открывающую скобку бесплатно!
lirtosiast

1
Знание гольфа в любом языке требует только практики; Вы получите там.
lirtosiast

2

Python 2, 89 байт

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Работает почти так же, как мой ответ Pyth, просто вычисляя правильное количество пробелов на лету.


2

PowerShell, 104 102 97 байт

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. если вы хотите запустить его снова, откройте новый PowerShell или rv oсбросьте состояние переменной.

По сравнению с тем, как лаконичны другие, это больно. [На 97 болит меньше, чем на 122]. Две части к этому, ни одна из них не очень удивительна; читает число столбцов, использует массив-индекс-троичный-оператор-заменитель для получения смещения и выполняет волновую функцию, начинающуюся со смещения (и настройку, чтобы она не падала при выполнении mod 0).

(И я потратил целую вечность на эту волновую функцию, не в силах распознать свое недоразумение и набрав все честные паренсы, что это не LISP).


2
Это чертовски блестяще.
AdmBorkBork

2

Python 2, 98 89 байт

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Немного длиннее.


использование

$ python2 test.py
3
"l"
  *
 *
*
 *
  *

Также явно сломан. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

Проверьте использование. @TessellatingHeckler
Зак Гейтс

Ах, умно. Но у ваших стрелок с одной колонкой есть две стрелки. (Я думаю, что вы могли бы играть в гольф дальше, не храня iи dвовсе, просто используя range(P())и if P()=='l'...)
TessellatingHeckler

Спасибо за предложения! Я также исправил двойные наконечники стрел. @TessellatingHeckler
Зак Гейтс

Не могу проверить атм, но вы, вероятно, могли бы сделать что-то вроде на f=[...][::2*('r'>input())-1]самом деле
Sp3000

2

Perl, 85 байт

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Использование:

perl 59874.pl <<< '6
r'

4
Мне нравится, как вы называете свои сценарии так, что вы узнаете их позже ...
mbomb007

@ mbomb007 ха-ха! Вы знаете, я на самом деле не называю свои сценарии так, но я подумал, что было бы лучше назвать что-то простое для инструкций по использованию ... simplearrows2.plне кажется таким хорошим! : P
Дом Гастингс

2

PHP, 156 байт

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Создает два массива, как это:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

затем использует объединение массивов $s+$tили $t+$sобъединяет их и array_spliceудаляет элемент посередине. Наконец вывод с использованием<?=join()


с аргументами CLI вместо STDIN мой код будет на 8 байт короче;)
Фабиан Шменглер

2

Python 2, 111 109 104 байта

Довольно простое решение. Я уверен, что это может быть в гольф больше. Для тех, кто не знает, так ~x+nже, как n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

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

Редактировать : Это было в гольф в последней строке:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")

2

Matlab, 109 105 96 байт

Спасибо @beaker за то, что сэкономили мне 9 байт .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))

Вы можете сохранить 9 байтов, если вы замените две строки, вставляя коды ascii, сx=x*10+32;
beaker

@beaker Очень умно, спасибо!
Луис Мендо

1

Рубин, 118 байт

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - дважды, конечно ...

l,d=gets.split; - получить вход

l=l.to_i; - изменить длину на целое число

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - создать массив от 0 до длины

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - итерация, превращение в строки, чтобы сделать стрелки

Не самый лучший гольф когда-либо, но, эй.


1

PowerShell, 98 94 байта

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Если бы я мог найти способ поместить Read-Host for direction в цикл foreach-object, но только запросить его, как только я смогу сохранить несколько байтов.

Изменить: 94 байта. Вместо того, чтобы проверять левое, проверяйте правое (упрощает цикл).

Оригинал 98 байт:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Сброс $_переменной - хитрый хоббит. Очень умно, и я кое-что узнал сегодня.
AdmBorkBork

@TimmyD Очень хитро. А затем переключите оператор if, чтобы сохранить еще больше.
Джонатан Лич-Пепин

0

> <> , 60 байт

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 потраченных впустую байта в нижней строке, как раздражает!

Из-за того, как ввод работает в> <>, невозможно «ждать» ввода - iкоманда проверяет, доступен ли вводимый символ в STDIN. Если он есть, он выталкивает значение ASCII этого символа, а если нет - 1.

Это означает, что для использования этой программы номер и направление должны быть уже готовы на STDIN, например, 3rдля стрелки размера 3, указывающей вправо. Я не уверен, если это дисквалифицирует эту запись, дайте мне знать ваши мысли: о)

Я также напишу описание, если кто-то хочет.


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

Отличный момент, я не думал о вводе более 9. Вернуться к чертежной доске!
Сок

1
Я оставил комментарий по основному вопросу для разъяснения, на всякий случай
Sp3000

0

PHP, 154 байта

Это выглядит действительно повторяющимся, но это делает желаемое:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Запускается из командной строки, как:

php arrow.php 5 l
php arrow.php 5 r

-1

Python, 88 байт

Edited

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.