Прості стрілки для друку


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 байти

Виходячи з відповіді на цей коментар, це може бути неправдивим . Незважаючи на те, я знайшов це охайним, і, якщо він недійсний, інші відповіді Pyth також недійсні. ;) Ну, це дійсно , бо я, очевидно, пропустив очевидно очевидне. : /

РЕДАКЦІЯ: Я ВІН !!! ТАКСИ !!!! Перший раз! : 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

Пітон 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 стовпчик, а лівий - ви отримаєте стрілку праворуч на дві колонки. Спробуйте ввести 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
Zach Gates

Ах, розумний. Але у ваших стрілок на 1 стовпчик є дві головки стрілок. (Я думаю, ви могли б додатково idrange(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 ха-ха! Ви знаєте, я насправді не називаю своїх сценаріїв, але я вважав, що найкраще назвати щось просте в інструкціях із використання ... 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

Матлаб, 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 для напряму всередині циклу об'єкта foreach, але лише підкажіть його, як тільки я зможу зберегти кілька байт.

Редагувати: 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, яка вказує праворуч. Я не впевнений, чи дискваліфікує це запис, повідомте мені ваші думки: o)

Я також напишу опис, якщо хтось хоче.


У певному сенсі він чекає на введення, якщо ви спробуєте запустити його в оболонці, тому я думаю, що це добре. Мене більше хвилює той факт, що це очікує, що вхід буде :
одноцифровим

Чудовий момент, я не замислювався над входом понад 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

Пітон, 88 байт

Відредаговано

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.