20

チャレンジ

形式の標準入力を受け入れる文字数で最短のプログラムX-Y Rで、次の保証があります。

  • R8 以下の非負の 10 進数
  • Xおよびは、45° の倍数 ( 、、、など)Yとして 10 進数で与えられる非負の角度です。04590135
  • Xより少ないY
  • Y360Xはない0

Xまた、開始角度から終了角度Yradiusまでの ASCII "円弧" を標準出力に生成しますR。ここで、

  • 円弧の頂点は、o
  • との角度は0180-
  • との角度は45225/
  • との角度は90270|
  • との角度は135315\
  • 2 本の線で囲まれた多角形の領域は、空白以外の文字で埋められます。

無効な入力が与えられた場合、プログラムは意味のある出力を生成する必要はありません。もちろん、この課題のために特別に書かれた言語、または外部ユーティリティを不当に使用する言語を除いて、任意の言語でのソリューションが許可されます。出力の形式が正しいままである場合、余分な水平方向および垂直方向の空白は出力で許可されます。

ハッピーゴルフ!

多数の例

入力:

0-45 8

出力:

        /
       /バツ
      /xx
     /xxx
    /xxxx
   /xxxxx
  /xxxxxx
 /xxxxxxx
o--------

入力:

0-135 4

出力:

\xxxxxxxx
 \xxxxxxx
  \xxxxxx
   \xxxxx
    o----

入力:

180-360 2

出力:

--o--
xxxxx
xxxxx

入力:

45-90 0

出力:

o

入力:

0-315 2

出力:

xxxxx
xxxxx
xxo--
xxx\
xxxx\
4

12 に答える 12

15

Perl、235 211 225 211 207 196 179 177 175 168 160 156 146 文字

<>=~/-\d+/;for$y(@a=-$'..$'){print+(map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a),$/}


say 機能を使用する Perl、161 149 139 文字

$ echo -n '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}' | wc -c
139
$ perl -E '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}'


Perl 末尾の改行なし、153 143 文字

<>=~/-\d+/;for$y(@a=-$'..$'){print$/,map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}


元のバージョンのコメント:

$_=<>;m/(\d+)-(\d+) (\d+)/;$e=$1/45;$f=$2/45; # parse angles and radius, angles are 0-8
for$y(-$3..$3){                               # loop for each row and col
    for$x(-$3..$3){
            $t=atan2(-$y,$x)/atan2 1,1;   # angle of this point
            $t+=8if($t<0);                # normalize negative angles
            @w=split//,"-/|\\"x2;         # array of ASCII symbols for enclosing lines
            $s.=!$x&&!$y?"o":$t==$e||$t==$f?$w[$t]:$t>$e&&$t<$f?"x":$";
            # if it's origin -> "o", if it's enclosing line, get symbol from array
            # if it's between enclosing angles "x", otherwise space
    }
    $s.=$/;
}
print$s;


編集 1:インライン サブ演算子、関係演算子、等価演算子は 0 または 1 を返します。
編集 2:コメント付きの追加バージョン。
編集 3: 360º の囲み線を修正しました。チャーカウントが大幅に増加しました。
編集 4:ルールを曲げて短いバージョンを追加しました。
編集 5: 360 度の囲み線のよりスマートな修正。また、塗りつぶしとして数値を使用します。どちらのことも明らかでした。まあ、私はもっと眠るべきです:/
編集6:mマッチ演算子から不要なものを削除しました。一部のセミコロンを削除しました。
編集 7:よりスマートな正規表現。200文字以内!
EDIT 8:多くの小さな改善:

  • 内部 for ループ -> マップ (1 文字)
  • 文字列からのシンボル配列split-> qw (3 文字)
  • インライン化されたシンボル配列 (6 文字、以前の改善と合わせて 9 文字!)
  • 論理 or -> ビット単位 or (1 文字)
  • 正規表現の改善 (1 文字)
  • ジェイコブの答えに触発された、負の角度をテストするために算術を使用します (5 文字)


編集 9:条件演算子を少し並べ替えると、2 文字節約できます。
編集 10:文字にはベアワードを使用します。
編集 11: Lowjacker の回答に触発されて、ループ内に印刷を移動しました。
EDIT 12:を使用してバージョンを追加しましsayた。
EDIT 13:グウェルの回答と同様に、塗りつぶし文字に角度文字を再利用します。ただし、出力は Gwell のものほど良くありません。5 文字追加する必要があります :) また、.. 演算子には括弧は必要ありません。
編集 14:正規表現を <> に直接適用します。btaの回答に対するエイドリアンの提案に従って、範囲演算子を変数に割り当てます。最後の改行なしでバージョンを追加します。更新されsayたバージョン。
編集 15:より多くのインライン化。map{block}@a -> map expr,@a.

于 2010-07-29T21:19:12.997 に答える
12

ルア、259文字

この句を少し悪用non-whitespace characterして、見事な表示を生成し、さらに重要なことにストロークを節約します。

m=math i=io.read():gmatch("%d+")a=i()/45 b=i()/45 r=i()for y=r,-r,-1 do for x=-r,r do c=m.atan2(y,x)/m.pi*4 c=c<0 and c+8 or c k=1+m.modf(c+.5)io.write(x==0 and y==0 and'o'or c>=a and c<=b and('-/|\\-/|\\-'):sub(k,k)or c==0 and b==8 and'-'or' ')end print()end

入力:45-360 4

\\\|||///
\\\|||//
\\\\|//  
--\\|/   
----o----
--//|\\--
////|\\\\
///|||\\\
///|||\\\

変な角度にも対応

入力:15-75 8

           |/////
          |//////
          |//////
          |//////
          ///////
         |//////-
         ////---
         //-     
        o        
                 
                 
                 
                 
                 
                 
                 
                 
于 2010-07-31T05:55:37.683 に答える
8

MATLAB、188文字:)

input '';[w x r]=strread(ans,'%d-%d%d');l='-/|\-/|\-';[X Y]=meshgrid(-r:r);T=atan2(-Y,X)/pi*180;T=T+(T<=0)*360;T(T>w&T<x)=-42;T(T==w)=-l(1+w/45);T(T==x)=-l(1+x/45);T(r+1,r+1)=-'o';char(-T)

コメント付きコード:

%%# Get the string variable (enclose in quotes, e.g. '45-315 4')
input ''
%%# Extract angles and length
[w x r]=strread(ans,'%d-%d%d');
%%# Store characters
l='-/|\-/|\-';
%%# Create the grid
[X Y]=meshgrid(-r:r);
%%# Compute the angles in degrees
T=atan2(-Y,X)/pi*180;
%%# Get all the angles
T=T+(T<=0)*360;
%# Negative numbers indicate valid characters
%%# Add the characters
T(T>w&T<x)=-42;
T(T==w)=-l(1+w/45);
T(T==x)=-l(1+x/45);
%%# Add the origin
T(r+1,r+1)=-'o';
%%# Display
char(-T)
于 2010-07-30T07:09:27.833 に答える
8

Mathematica 100文字

グラフィックが完璧すぎるため、競争から外れています:)

  f[x_-y_ z_]:=Graphics@Table[
                 {EdgeForm@Red,Disk[{0,0},r,{x °,y °}],{r,z,1,-1}]
                 SetAttributes[f,HoldAll]

f[30-70 5] で呼び出す

結果

代替テキスト http://a.imageshack.us/img80/4294/angulosgolf.png

代替テキスト http://a.imageshack.us/img59/7892/angulos2.png

ノート

SetAttributes[f, HoldAll];

入力が必要なので

    f[a-b c] 

それ以外の場合は次のように解釈されます

    f[(a-b*c)]
于 2010-08-02T02:25:03.567 に答える
7

GNU BC、339 文字

read()elseおよび論理演算子によるGnu bc 。

scale=A
a=read()/45
b=read()/45
c=read()
for(y=c;y>=-c;y--){for(x=-c;x<=c;x++){if(x==0)if(y<0)t=-2else t=2else if(x>0)t=a(y/x)/a(1)else if(y<0)t=a(y/x)/a(1)-4else t=a(y/x)/a(1)+4
if(y<0)t+=8
if(x||y)if(t==a||t==b||t==b-8){scale=0;u=(t%4);scale=A;if(u==0)"-";if(u==1)"/";if(u==2)"|";if(u==3)"\"}else if(t>a&&t<b)"x"else" "else"o"};"
"}
quit
于 2010-07-30T21:15:30.780 に答える
7

MATLAB 7.8.0 (R2009a) - 168 163 162 文字

ジェイコブの答えから始まり、グウェルが非空白文字を使用してアークを埋めることに触発されて、次のソリューションを管理しました。

[w x r]=strread(input('','s'),'%d-%d%d');
l='o -/|\-/|\-';
X=meshgrid(-r:r);
T=atan2(-X',X)*180/pi;
T=T+(T<=-~w)*360;
T(T>x|T<w)=-1;
T(r+1,r+1)=-90;
disp(l(fix(3+T/45)))

そして、いくつかのテスト出力:

>> arc
0-135 4
\||||////
 \|||///-
  \||//--
   \|/---
    o----

への呼び出しを削除することで、さらに156 文字に減らすことができますdispが、これにより、出力の前に余分な文字が追加さans =れます (出力の書式設定規則に違反する可能性があります)。

それでも、これをさらに減らす方法はいくつかあると思います。;)

于 2010-08-03T04:19:35.933 に答える
6

ルビー、292 276 186 文字

x,y,r=gets.scan(/\d+/).map{|z|z.to_i};s=(-r..r);s.each{|a|s.each{|b|g=Math::atan2(-a,b)/Math::PI*180/1%360;print a|b==0?'o':g==x||g==y%360?'-/|\\'[g/45%4].chr: (x..y)===g ?'*':' '};puts}

より適切な形式のバージョン:

x, y, r = gets.scan(/\d+/).map{|z| z.to_i}
s = (-r..r)
s.each {|a|
    s.each {|b|
        g = (((Math::atan2(-a,b) / Math::PI) * 180) / 1) % 360
        print ((a | b) == 0) ? 'o' :
            (g == x || g == (y % 360)) ? '-/|\\'[(g / 45) % 4].chr :
                ((x..y) === g) ? '*' : ' '
    }
    puts
}

私よりも多くの睡眠をとった誰かが、これをもっと凝縮できると確信しています...

編集 1:if内側のループのステートメントをネストされた? :演算子に切り替えました

編集 2:範囲を中間変数に格納 (Adrian に感謝)、CLI パラメータの代わりに stdin を使用 (Jon の説明に感謝)、直接出力を優先して配列を削除、360 の終了角度が線を表示しないバグを修正、不要な括弧をいくつか削除し、丸めに の代わりに除算を.round使用し、条件付き加算の代わりにモジュロを使用しました

于 2010-07-30T01:32:34.360 に答える
4

ルビー、168文字

動作するには Ruby 1.9 が必要です

s,e,r=gets.scan(/\d+/).map &:to_i;s/=45;e/=45;G=-r..r;G.map{|y|G.map{|x|a=Math.atan2(-y,x)/Math::PI*4%8;print x|y!=0?a==s||a==e%8?'-/|\\'[a%4]:a<s||a>e ?' ':8:?o};puts}

読み取り可能なバージョン:

start, _end, radius = gets.scan(/\d+/).map &:to_i
start /= 45
_end /= 45

(-radius..radius).each {|y|
    (-radius..radius).each {|x|
        angle = Math.atan2(-y, x)/Math::PI * 4 % 8
        print x|y != 0 ? angle==start || angle==_end%8 ? '-/|\\'[angle%4] : angle<start || angle>_end ? ' ' : 8 : ?o
    }
    puts
}
于 2010-07-30T16:18:56.763 に答える
3

Perl - 388 文字

自分で解決できなかった課題を提起するのは公平ではないため、三角関数の代わりに文字列置換を使用し、親しみやすい近所の Perl のベアワードを文字列として処理する機能を多用する解決策を次に示します。必然的に少し長くなりますが、独自性のために興味深いかもしれません。

($x,$y,$r)=split/\D/,<>;for(0..$r-1){$t=$r-1-$_;
$a.=L x$_.D.K x$t.C.J x$t.B.I x$_."\n";
$b.=M x$t.F.N x$_.G.O x$_.H.P x$t."\n"}
$_=$a.E x$r.o.A x$r."\n".$b;$x/=45;$y/=45;$S=' ';
sub A{$v=$_[0];$x==$v||$y==$v?$_[1]:$x<$v&&$y>$v?x:$S}
sub B{$x<=$_[0]&&$y>$_[0]?x:$S}
@a=!$x||$y==8?'-':$S;
push@a,map{A$_,'\\'.qw(- / | \\)[$_%4]}1..7;
push@a,!$x?x:$S,map{B$_}1..7;
eval"y/A-P/".(join'',@a)."/";print

すべての改行はオプションです。それはかなり簡単です:

  • ユーザー入力を取得します。
  • パターンの上部 ( $a) と下部 ( $b) の部分を作成します。
  • 完全なパターンを構築します ( $_)。
  • a を定義しsub Aて、角度のフィル文字を取得します。
  • a を定義しsub Bて、リージョンのフィル文字を取得します。
  • @aとを使用して、置換文字の配列 ( ) を作成ABます。
  • 置換を実行し、結果を出力します。

R= 4の場合、生成される形式は次のようになります。

DKKKCJJJB
LDKKCJJBI
LLDKCJBII
LLLDCBⅢ
ええええああああ
MMMFGHPPP
MMFNGOHP
MFNNGOOHP
ふんんんん

ここでA-H、 は角度をI-P表し、 は領域を表します。

(確かに、これはおそらくさらに詳しく調べることができます。 での操作は@a、1 つのリストとして記述したときに誤った出力を与えました。おそらく、 でのmap再生方法と関係があり$_ます。)

于 2010-07-30T16:12:51.373 に答える
3

C# - 325 319 文字

using System;class P{static void Main(){var s=Console.ReadLine().Split(' ');
var d=s[0].Split('-');int l=s[1][0]-48,x,y,r,a=int.Parse(d[0]),b=int.Parse(d[1]);
for(y=l;y>=-l;y--)for(x=-l;x<=l;)Console.Write((x==0&&y==0?'o':a<=(r=((int)
(Math.Atan2(y,x)*57.3)+360)%360)&&r<b||r==b%360?
@"-/|\"[r/45%4]:' ')+(x++==l?"\n":""));}}

改行は重要ではありません。

サンプル入出力

45-180 8
\||||||||////////
\\|||||||///////
\\\||||||//////
\\\\|||||/////
\\\\\||||////
\\\\\\|||///
\\\\\\\||//
\\\\\\\\|/
-----o
135-360 5
\
\\
\\\
\\\\
\\\\\
---o-----
----/|\\\\\
---//||\\\\
--///|||\\\
-////||||\\
/////|||||\
于 2010-08-11T10:14:20.673 に答える
2

C (902 バイト)

これは (元の perl バージョンのような) 三角関数を使用しないため、かなり「肥大化」しています。とにかく、ここに私の最初のコードゴルフ提出物があります:

#define V(r) (4*r*r+6*r+3)
#define F for(i=0;i<r;i++)
#define C ;break;case
#define U p-=2*r+2,
#define D p+=2*r+2,
#define R *++p=
#define L *--p=
#define H *p='|';
#define E else if
#define G(a) for(j=0;j<V(r)-1;j++)if(f[j]==i+'0')f[j]=a;
#define O(i) for(i=0;i<2*r+1;i++){
main(int i,char**v){char*p,f[V(8)];
int j,m,e,s,x,y,r;p=*++v;x=atoi(p);while(*p!=45)p++;
char*h="0123";y=atoi(p+1);r=atoi(*++v);
for(p=f+2*r+1;p<f+V(r);p+=2*r+2)*p=10;
*(p-2*r-2)=0;x=x?x/45:x;y/=45;s=0;e=2*r;m=r;p=f;O(i)O(j)
if(j>e)*p=h[0];E(j>m)*p=h[1];E(j>s)*p=h[2];else*p=h[3];p++;}
if(i+1==r){h="7654";m--;e--;}E(i==r){s--;}E(i>r){s--;e++;}
else{s++;e--;}p++;}for(p=f+V(r)/2-1,i=0;i<r;i++)*++p=48;
for(i=0;i<8;i++)if(i>=x&&i<y){G(64);}else G(32);
y=y==8?0:y;q:p=f+V(r)/2-1;*p='o';switch(x){
C 0:F R 45 C 1:F U R 47 C 2:F U H C 3:F U L 92
C 4:F L 45 C 5:F D L 47 C 6:F D H C 7:F D R 92;}
if(y!=8){x=y;y=8;goto q;}puts(f);}

また、#defines は見栄えが悪いですが、約 200 バイト節約できるので、そのままにしておきました。これは有効な ANSI C89/C90 であり、ほとんど警告なしでコンパイルされます (2 つは についてatoiputs2 つは不自由な形式についてmain)。

于 2010-08-28T15:28:59.940 に答える
2

Java - 304 文字


class A{public static void main(String[]a){String[]b=a[0].split("-");int e=new Integer(b[1]),r=new Integer(a[1]),g,x,y=r;for(;y>=-r;y--)for(x=-r;x<=r;)System.out.print((x==0&y==0?'o':new Integer(b[0])<=(g=((int)(Math.atan2(y,x)*57.3)+360)%360)&g<e|g==e%360?"-/|\\".charAt(g/45%4):' ')+(x++<r?"":"\n"));}}

より読みやすいバージョン:

class A{
 public static void main(String[]a){
  String[]b=a[0].split("-");
  int e=new Integer(b[1]),r=new Integer(a[1]),g,x,y=r;
  for(;y>=-r;y--)for(x=-r;x<=r;)System.out.print((
   x==0&y==0
    ?'o'
    :new Integer(b[0])<=(g=((int)(Math.atan2(y,x)*57.3)+360)%360)&g<e|g==e%360
     ?"-/|\\".charAt(g/45%4)
     :' '
   )+(x++<r?"":"\n"));
 }
}
于 2010-08-21T23:43:58.977 に答える