简单的打印箭头


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,2015年

每行是否允许尾随空格?
lirtosiast,2015年

@ThomasKwa是的。
阿克斯。

我们可以像这个问题一样使用控制字符移动光标吗?
lirtosiast 2015年

@ThomasKwa当然。。。虽然我真的不确定这意味着什么,但我有兴趣将其付诸实践。
阿克斯。

Answers:


8

Pyth,23个字节

根据此评论的答案,可能有效或无效。无论如何,我发现这很简洁,如果无效,其他Pyth答案也将无效。;)嗯,这是有效的,因为我显然错过了明显的地方。:/

编辑:我赢了!!是的!!!有史以来第一次!:D

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

现场演示。


1
m+*\ d\*Q而不是列举点东西。节省2个字节。
2015年

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 2015年

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个循环,没有地图或Lambda ...
好吧。

@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,则打印*并退出-脚本的其余部分没有影响。+
  • 下一节将首先获取方向和试验是否是-eqUAL到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,2015年

1
@TessellatingHeckler谢谢-已更正。
AdmBorkBork,2015年

1
那将您的排名推高至102,而我的排名则跌至102。我不能再继续盯着它了,但还必须删除一个...:D
TessellatingHeckler

4

TI-BASIC,75 65 57 54 50 47字节

感谢@ThomasKwa进行了正确的字节计算并打了10个字节

在我的TI-84 +银版上进行了测试

第一次提交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谢谢!我现在就做。
2015年

2
第二:Ans是免费的,因为您不将其用于输入并且Output(不会修改Ans。使用它,并摆脱变量A。您可以使用分配-2(Str1="R;不需要有条件的。
lirtosiast 2015年

1
@ThomasKwa感谢您的提示,看来我已经可以使用TI-BASIC。
2015年

3
第三:确实不需要将值乘以-2。只需Str1="R为第二行做。这样就形成了第四行Output(I,(1-2Ans)abs(I-L)+AL+1,"*,这为您提供了另外4个字节。别急,有一个成语(1-2Ans)-它的cos(πAns),从而节省了一个字节,加上一个更因为我们得到的开括号是免费的!
lirtosiast 2015年

1
精通任何语言的打高尔夫球只需要练习;你会到达那里。
2015年

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,104102 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)+'*'}

注意 如果要再次运行它,请打开新的PowerShell,或rv o重置变量状态。

与其他人相比,这很痛苦。[比122受伤的伤少[97]。它分为两个部分,两个都不奇怪。读取许多列,使用array-index-ternary-operator-substitute来获取偏移量,并通过从该偏移量开始的wave函数运行(并进行调整,以免发生变化mod 0)。

(还有,我真是在那个wave函数上花了很长时间了,无法发现我的误解,并输入所有不是LISP的内容,诚实地写了句子)。


2
那真是太好了。
AdmBorkBork,2015年

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 definedNameError: name 'd' is not defined
TessellatingHeckler,2015年

检查用法。@TessellatingHeckler
扎克·盖茨

啊,聪明。但是您的1列箭头有两个箭头。(我认为您可以通过不存储id只使用range(P())if P()=='l'... 来进一步打高尔夫球)
TessellatingHeckler,2015年

感谢您的建议!我还修复了双箭头。@TessellatingHeckler
Zach Gates

无法测试atm,但您f=[...][::2*('r'>input())-1]实际上可以执行类似的操作
Sp3000,2015年

2

Perl,85个字节

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

用法:

perl 59874.pl <<< '6
r'

4
我喜欢您为脚本命名的方式,以便日后能够识别它们……
mbomb007

@ mbomb007哈哈!您知道,我实际上没有为脚本命名,但是我认为最好为使用说明命名一些简单的东西…… simplearrows2.pl看起来不太好!:P
Dom Hastings

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个字节;)
Fabian Schmengler 2015年

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,:)]))

如果您将插入ascii代码的两行替换为x=x*10+32;
烧杯,则

@beaker非常聪明,谢谢!
路易斯·门多

1

Ruby,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{'*'}

如果我可以找到一种方法来将读主机的方向放入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,2015年

@TimmyD非常棘手。然后切换if语句以保存更多内容。
Jonathan Leech-Pepin

0

> <>,60字节

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

在底行上浪费了2个字节,多么令人讨厌!

由于输入在> <>中的工作方式,无法“等待”输入-该i命令检查STDIN上是否有输入字符。如果存在,则按该字符的ASCII值,如果不按-1。

这意味着,要使用此程序,必须已在STDIN上准备好数字和方向,例如3r,指向右边的3号箭头。我不确定是否会取消该条目的资格,请告诉我您的想法:o)

如果有人要,我也会写一个描述。


从某种意义上说,如果您尝试在shell中运行它,则确实会等待输入,因此我认为这很好。我更担心以下事实:尽管这期望输入为一位数字(除非我打算输入:10?)
Sp3000,2015年

很好的一点是,我没有考虑过超过9的输入。回到绘图板上!
2015年

1
为了澄清
起见

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字节

已编辑

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.