直角三角形を生成する


10

この課題では、2つの数値(スペースで区切られた)を入力として受け取り、xs で構成されるASCII直角三角形を出力する必要があります。

最初の数値は、出力する三角形の幅と高さです。2番目の番号は、直角になるコーナーです。コーナーには、左上から順に英語の読み順で1〜4の番号が付けられています。

1    2



3    4

例(入力とそれぞれの三角形の出力):

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

プログラムの出力は、それぞれの入力に対してこれらの例と正確に一致する必要があります。

入力は常に有効です。最初の数値は1以上の整数で、2番目の数値は1、2、3、または4です。

これはです。最短コード(文字数)が優先されます。

回答:


9

APL(30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

説明:

  • {... }/⎕:入力に対して指定された関数を減らします(したがって、入力に2つの数値がある場合、左の数値と右の数値である2つの数値で関数を呼び出します)
  • ≤/¨⍳2⍴⍺:メイク行列座標行列とビットフィールドを与え、X座標がY座標よりも大きくないそれらの位置を設定します。
  • (⍎⍵⌷'⌽+⍉⊖'):によって与えられた変換関数を選択して、三角形を右向きにします。
  • ' x'[1+... ]:ビットフィールドに1を追加し、結果を文字列のインデックスとして使用するため' x'、0とx1のスペースを入れます。

1
私が読んだAPLが多いほど、APLが解析の悪夢であることに気づきます。(⍎⍵⌷'functions')ステートメント全体の解釈方法を決定する前に、実際にパーツを評価する必要はないでしょうか。例えば考えてください1+(⍵⌷'12+')|40。かっこで囲まれた部分|ingを付ける前に、モナディックかダイアディックかを知ることさえできません。抽象構文ツリー全体は、評価に応じて変化します。
原生生物

つまり、1+(⍎⍵⌷'12+')|40編集できません。
原生生物

2
@protist:楽しい事実:f ← { [ }エラーを出さない!f 1÷0与える... ドメインエラー!(ゼロによる除算のため)。以下のように、あなたは関数を呼び出す場合にのみ、f 123あなたが得る構文エラーが。見よ:imgur.com/jtmdi4B
marinus

すべての神々によって!!!! それは私の心を少し壊します。私はAPLインタープリターの作成に取り組んできましたが、それは現在の実装に大きな悪をもたらしています。ははは
原生生物

関数は、ある種の醜いマクロ展開のようなプロセスによって日常的に配置されているようです。これは、インプレースのテキスト拡張を多少示します。
原生生物

6

ルビー、116 115 109 96

自分の解決策から始めましょう。

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

私は30文字のGolfScriptソリューションにすぐに打ち勝つことを知っています:P

19文字を削ってくれたminitechに感謝(すごい)!


の代わりに==0、を使用できます<1?x*x別のキャラクターを保存します。また、puts i[1]%2<1?t.rjust(s):t}トリックをしますか?
Ry- 2013

うーん…あなたの周りにスペースがあり?ますか?それは必要ですか?また、でも同じことができると思いますr=
Ry- 2013

@minitech必要です。それ以外の場合は1?単一のトークンとして解析されるため、先頭のスペース、それ以外の場合は?t(と同等't')として解析されるため、末尾のスペース。r部品の再構築をどのように提案しますか?
ドアノブ

やってみましたか?Rubyのどのバージョンで?2.0では問題なく動作します。
Ry- 2013

@minitech奇数、それは以前は機能しませんでしたが、今は機能します:Pおかげで
ドアノブ

4

GolfScript(34 33文字)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

角に回転番号が付けられていないのは残念です。これは、1つの配列を構築してnからそれを何度も回転させるというより洗練されたアプローチを可能にするためです。

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C#-195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

フォーマット済み:

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

ここに画像の説明を入力してください


入力は、コンマ区切りではなく、スペースで区切る必要があります。
ドアノブ

@Doorknob:スクリーンショットは、コンマで入力を表示することを選択したテストプログラムからのものです。プログラムを実行すると、入力は実際にはスペースで区切られますが、すべてのC#コンソールアプリケーションが文字列の配列として入力を受け取るため、重要な点はありません。
Igby Largeman 2013

2

Golfscript、 39 36 35文字

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

ライブデモ:http : //golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

残念ですが、リクエストどおり30文字ではありません


1${-1%}*with -1 2$?%\2>{-1%}*with \2>-1\?%を置き換えると2文字になります。
ボラティリティ2013

@Volatilityの感謝、組み込み
John Dvorak

@ボラティリティを記述-1 2できます0~2
ハワード

そして、もう少し再構築に我々が持っている別のcharの:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
ハワード

2

Mathematica 122(104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

別の方法


「出力」のリベラルな解釈の下では、次の(104文字)が機能します。

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

三角形


リストの形式での入力が許可されている場合、次の(75文字)で十分です。

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


技術的にはこれはルールに反します:P
ドアノブ

それはどのルールに違反しますか?
DavidC 2013

私が置いた入出力チャートの事。122文字のほうがいいです。私は明確にするために質問を編集しました
Doorknob

おっとっと。チャートは単なる例だと思いました。
DavidC 2013

ASCIIアートバージョンを最初に配置したところです。
DavidC 2013

2

J、59 55 42 38 37 36文字

プログラムの最後に入力することが許可されている場合:

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

そうでない場合(追加の3文字):

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

使用法:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

または

   t 3 4
  x
 xx
xxx

ほとんどの文字は、暗黙のスタイルで保持するためのブラケットとキャップであるため、これはかなり短いと思います。

編集
動名詞と議題動詞を使用していくつかの文字を切り落としましたが、私の好みに合わせてまだ大文字が多すぎます。

編集2
それはもう少し似ています。必要なローテーションの数のリストのアジェンダをダンプすると、余分なブラケットといくつかのキャップのほとんどが取り除かれます。

編集3
最後の無関係なキャップとブラケットのペアをプロセスから取り除きました。必要なローテーション数をエンコードする安価な方法を見つける必要があります。

編集4 サフィックスの代わりにプレフィックスを使用して、文字を切り落とします。文字を保存しないリストを作成する別の方法を有効にします。バガー。

編集5
式を使用して別の文字を切り落とします。それでも、このビットは短くなる可能性があると感じています。


1

Python 106キャラクター

w,d=map(int,raw_input().split())
for e in range(1,w+1)[::d/3*2-1]:print('%'+'-+'[d%2]+str(w)+'s')%('*'*e)

1

Python 3、91

アビジットの回答に基づく。

の文字列と醜い1sの合計を回避するために、出力文字列の作成を変更しましたrange。Python 3はraw_in を取り除きraw_inputますが//、整数除算に使用し、に括弧を追加する必要があるためprint、1文字しか保存されません。

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

子猫、140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

非ゴルフ:

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

オーバーロードを実装して標準ライブラリを具体化する必要があるという証拠。

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