シンプルな印刷矢印


23

ゴルフの練習のために、私は私のガールフレンドのPython入門クラスで課題を行っています。この割り当てには、文字数が非常に近い複数の戦略があり、ここの人々はさらに良い方法を見つけることができると確信しています。私はPythonでこれを行う方法に最も興味がありますが、このプログラムが得ることができる最もゴルフを知りたいので、これはコードゴルフであり、最短回答が勝ちます。

ルール:

割り当ての概要は以下のとおりです。ユーザーは2回入力するように求められる必要がありますが、プロンプトは何も言わなくてもよく、別の順序でもかまいません。

標準の抜け穴が適用されます。


課題3:矢印

ユーザーに複数の列の入力を求めるプログラムを作成すると、次のようにパターンが印刷されます。ユーザーが正数を提供すると想定できます。プログラムは、左矢印と右矢印の両方を処理する必要があります。以下にいくつかのサンプルランニングを示します。

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

23
これはhomewoのように見えます...ああ、決して気にしないでください。
TessellatingHeckler

各行の末尾のスペースは許可されますか?
リトシアスト

@ThomasKwaはい。
aks。

この質問のように、制御文字を使用してカーソルを移動できますか?
リトシアスト

@ThomasKwa確かに...私は正直それが何を意味するのかよくわからないのですが、実際にそれを見ることに興味があります。
aks。

回答:


8

Pyth、23バイト

このコメントに対する回答に基づいて、有効である場合と無効である場合があります。とにかく、私はこのきちんとしたものを見つけました、そして、それが無効であるなら、他のPyth答えも無効です。;)まあ、それは有効です。:/

編集:私は勝ちました!!!! はい!!!! 初めて!:D

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

ライブデモ。


1
m+*\ d\*Qその代わりに物事を列挙します。2バイト節約します。
寂部

7

Pyth、27

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

オンラインで試す

ここでの基本的な考え方は、たとえば5のような1つの文字列を作成することです。

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

そして、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を。

@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ます。各列にもがあり*、必要なスペースの数にのみ関心があるため、1を減算します。
  • 入力した値がであった場合1、印刷*して終了します-スクリプトの残りの部分は違いはありません。+
  • 次のセクションでは、最初に方向を取得-eql、それがualであるかどうかをテストし、次にの値に基づいて動的に生成された配列の配列へのインデックスに基づいて配列を作成します$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列矢印の方向の入力がまだ必須である場合(そうではないと主張します)、106の変数をRead-Host再導入することで、位置を入れ替えて、さらに2バイトを失うことができます。$d

$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が2倍の範囲を回避することで勝つことができると思った。しかし、私も近づくことができません。1列の矢印を考慮して、現在112文字です。> _ <
TessellatingHeckler

1
@TessellatingHecklerありがとう-修正。
-AdmBorkBork

1
それはあなたを102に押し上げ、私のものは102になりました。もうこれを見つめることはできませんが、もう1つ削除する必要があります...:D
TessellatingHeckler

4

TI-BASIC、75 65 57 54 50 47バイト

正しいバイト計算と10バイトのゴルフをしてくれた@ThomasKwaに感謝します

TI-84 + Silver Editionでテスト済み

最初のTI-BASIC提出、ゴルフの提案を歓迎します(まだ多くのトリックは知りません)。名前が表示されているメモリの要素を果たしている場合、これは1ではなく3文字でした(電卓自体でバイトカウントを確認しました)。このプログラムは、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
2番目:Ans無料です。入力に使用Output(せず、を変更しないためAnsです。それを使用して、変数を取り除きますA-2(Str1="R; を使用して割り当てることができます。条件の必要はありません。
リルトシアスト

1
@ThomasKwaはヒントをありがとう、TI-BASICに行く方法があるように見えます。
コール

3
3番目:値をで乗算する必要はありません-2Str1="R2行目だけを行います。これで4行目が作成され、Output(I,(1-2Ans)abs(I-L)+AL+1,"*さらに4バイトが得られます。しかし、待ってください。それはイディオムです(1-2Ans)- cos(πAns)それは1バイトを節約し、さらにもう1つはオープンかっこを無料で取得できるためです。
リトシアスト

1
どの言語でもゴルフに堪能になるには、練習だけが必要です。そこに着きます。
リトシアスト

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

NB。再度実行する場合は、新しいPowerShellを開くかrv o、変数の状態をリセットします。

他の人がどれほど簡潔であるかと比較すると、これは痛い。[122の場合よりも97の場合の方が痛くない]。それには2つの部分がありますが、どちらも非常に驚くべきことではありません。多数の列を読み取り、array-index-ternary-operator-substituteを使用してオフセットを取得し、オフセットで始まる波動関数を実行します(調整を行わないように調整し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 definedNameError: name 'd' is not defined
TessellatingHeckler

使用法を確認してください。@TessellatingHeckler
ザックゲイツ

ああ、賢い。ただし、1列の矢印には2つの矢印の頭があります。(私はあなたがゴルフそれがさらにによって保存することができなかったと思うid、すべてで、ちょうど使用range(P())してif P()=='l'...)
TessellatingHeckler

提案をありがとう!二重矢印の頭も修正しました。@TessellatingHeckler
ザックゲイツ

f=[...][::2*('r'>input())-1]
ATMを

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

次のような2つの配列を作成します。

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

次に、配列ユニオンを使用する$s+$t$t+$s、それらを結合しarray_spliceて、中央の要素を削除します。最後に使用して出力<?=join()


STDINの代わりにCLI引数を使用すると、コードが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バイト

9バイト節約してくれた@beakerに感謝します

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

あなたがASCIIコードを挿入する2つのライン交換する場合は、9つのバイトを保存することができます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{ -もちろん2回...

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ループ内に指示用のRead-Hostを配置する方法を見つけることができたが、一度だけプロンプトを出すことができれば、数バイトを保存できるかもしれません。

編集: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)

誰かが説明したい場合は、説明も書きます。


ある意味では、シェルで実行しようとすると入力を待つので、それでいいと思います。しかし、これは入力が1桁であると期待しているという事実に関心があります(:10 を入力するつもりがない場合)
Sp3000

素晴らしい点は、9を超える入力については考えていなかったということです。
ソク

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))+"*"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.