円形グラフィックスとしての数字


36

まず、このパズルを学習して、作成するものの感触をつかみます。

あなたの挑戦は、1から100(両端を含む)の間の(10を底とする)数を与えられたパズルからのもののような円形グラフィックを出力するプログラムまたは関数を書くことです。これはこの課題に似ていますが、ローマ数字ではなくグラフィックを作成する点が異なります。次の円は、左から右に番号1〜10を表します。

円パターン

パズルの答えとして、グラフィックは裏返しのローマ数字のように読む必要があります。線の太さはローマ数字記号を表し、グラフィック全体が数字を表します。参考までに、必要な線の太さは次のとおりです。各行には、その行と次の行の間に3ピクセルのパディングが必要です。

Number  Roman Numeral   Line Width
1       I               1px
5       V               3px
10      X               5px
50      L               7px
100     C               9px

サンプルを1つか2つ投稿してください。入力が正しい、標準の抜け穴などであると仮定します。これはコードゴルフであるため、最も少ないバイトが勝ちます。同点の場合、ほとんどの票が勝ちます。がんばろう!


3
画像の正しい絶対サイズが必要ですか、それとも適切な相対サイズを持っているのに十分ですか?
デビッドチャン14年

@DavidZhangはい、公平を期すために、リストした行とパディングのサイズに固執してください。
リップリープ14年

回答:


15

Mathematica- 166181バイト

他のMathematicaの答えよりも少し簡潔です。これは、よりポイントフリーなスタイルのおかげもあります。

c = Characters; r = Riffle;
Graphics[r[{0, 0}~Disk~# & /@ Reverse@Accumulate[
    l = {3} ~Join~ r[2 Position[c@"IVXLC", #][[1, 1]] - 1 & /@ 
        c@IntegerString[#, "Roman"], 3]], {White, Black}],
    ImageSize -> 2 Total@l] &

すべての空白は明確にするためのものです。これは、目的のグラフィックを返す匿名関数を定義します。

アニメーション

アニメーション円

数円のアニメーションGIFの生成は、任意のオブジェクトのシーケンスをアニメーション化およびエクスポートするための組み込み関数を備えたMathematicaでは簡単です。上記のコードが実行されたと仮定すると、

Table[Show[%@n, PlotRange -> {{-100, 100}, {-100, 100}}, 
    ImageSize -> 200], {n, 1, 399, 1}];
Export["animcircles.gif", %]

出力例

出力例


いくつかの結果を投稿してください。これが最初の場所ではないことを尋ねて申し訳ありません。また、機能を受け入れるように質問を変更しました。
リップリープ14年

@MartinBüttnerの提案をありがとう。コードが修正され、正しいサイズの画像が出力されるようになり、出力例が追加されました。
デビッドチャン14年

3
アニメーションが揺れます。私がもっとうまくできるというわけではありません。
corsiKa 14年

うーん、あなたは正しい。Mathematicaのプロット範囲を明示的に指定したことを考えると、なぜそうなるのか本当に分かりません。
デビッドチャン14年

揺れに関連している可能性があり
ます

15

Common Lisp- 376 331 304バイト

(use-package(car(ql:quickload'vecto)))(lambda(n o &aux(r 3)l p)(map()(lambda(c)(setf l(position c" I V X L C D M")p(append`((set-line-width,l)(centered-circle-path 0 0,(+(/ l 2)r))(stroke))p)r(+ r l 3)))(format()"~@R"n))(with-canvas(:width(* 2 r):height(* 2 r))(translate r r)(map()'eval p)(save-png o)))

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

ここに画像の説明を入力してください(104) ここに画像の説明を入力してください(1903) ここに画像の説明を入力してください(3999)

アニメーション

1から400までの数字の場合:

新しい

注:記録のために、このアニメーションは次のように行われます。

rings生成された画像の幅を返すという名前のコードの修正バージョンがあります。したがって、次のループの結果は最大サイズ、ここでは182です。

 (loop for x from 1 to 400
       maximize (rings x (format nil "/tmp/rings/ring~3,'0d.png" x)))

ループ全体には9.573秒かかります。これにより、整数ごとに約24msが得られます。次に、シェルで:

 convert -delay 5 -loop 0 -gravity center -extent 182x182 ring*png anim.gif

非ゴルフ

(ql:quickload :vecto)
(use-package :vecto)

(lambda (n o)
  (loop with r = 3
        for c across (format nil "~@R" n)
        for l = (1+ (* 2(position c"IVXLCDM")))
        for h = (/ l 2)
        collect `(,(incf r h),l) into p
        do (incf r (+ h 3))
        finally (with-canvas(:width (* 2 r) :height (* 2 r))
                  (loop for (x y) in p
                        do (set-line-width y)
                           (centered-circle-path r r x)
                           (stroke))
                  (save-png o))))

説明

  • この関数は、N1〜3999の整数とファイル名を取ります

  • (format nil "~@R" N)小数からローマ字に変換するために使用します。例えば:

     (format nil "~@R" 34) => "XXXIV"
    

    ~@R フォーマット制御文字列は、許容入力範囲の制限がある理由だ1と3999の間の整数の作業に指定されています。

  • 結果の文字列を反復処理して、数字Cごとに、カップルPを含むリストを作成します(radius width)

    • 幅は単純な線形マッピングです。定数文字列「IVXLCDM」を使用して、その中のCの位置を計算します。2を掛けて1を足すと、目的の値が得られます。

             (1+ (* 2 (position c "IVXLCDM")))
      

      ただし、これはゴルフバージョンでは少し異なります。

             (position c " I V X L C D M")
      
    • 各半径の計算では、各リングの幅とリング間の空きスペースが考慮されます。速度の最適化がなければ、フロートではなく有理数に基づいているため、計算は正確なままです。

      編集:パディングルールに準拠するようにパラメーターを変更しました。

  • これが完了すると、結果のキャンバスに必要なサイズ(最新の計算された半径の2倍)がわかります。

  • 最後に、の各要素に円を描きP、キャンバスを保存します。

1
「このコードはすべてのローマ数字(IVXLCDM)をサポートしています」。それはあなたのプログラムが入力としてローマ数字を取ることを意味しますか?それは私が意図したものではありませんが、かなりクールです。アニメーションの小道具も。
リップリープ14年

1
いいえ、わかりません。申し訳ありませんが、1〜3999の整数で機能します。質問では、1〜100の入力のみが必要で、テーブルにはDまたはMが記載されていません。部。
2014年

8

HTML + JQuery、288

HTML

<canvas>

JS

    r=3;w=9;c=$('canvas').get(0).getContext('2d')
    for(i=prompt(),e=100;e-.1;e/=10){
    if((x=Math.floor(i/e)%10)==4)d(w)+d(w+2)
    else if(x==9)d(w)+d(w+4)
    else{if(x>4)d(w+2)
    for(j=x%5;j;j--)d(w)}
    w-=4}
    function d(R){c.lineWidth=R
    c.beginPath()
    c.arc(150,75,r+=R/2,0,7)
    c.stroke()
    r+=R/2+3}

フィドル


スタックスニペットはありませんか?
オプティマイザー14年

@Optimizerは完全に我々が持って忘れてしまったことになりました
TwiNight

5

Java、565

import java.awt.*;class Z{public static void main(String[]s){int i=new Byte(s[0]),j=i/10,k=i%10;String t="",u;if(j>8)t="59";if(j>9)t="9";if(j==4)t="57";else if(j<9){t=j>4?"7":"";j-=j>4?5:0;if(j>0)t+="5";if(j>1)t+="5";if(j>2)t+="5";}if(k>8)t+="15";if(k==4)t+="13";else if(k<9){t+=k>4?"3":"";k-=k>4?5:0;if(k>0)t+="1";if(k>1)t+="1";if(k>2)t+="1";}u=t;Frame f=new Frame(){public void paint(Graphics g){g.setColor(Color.BLACK);int x=0;for(char c:u.toCharArray()){int z=c-48,q=x;for(;x<q+z;)g.drawOval(99-x,99-x,x*2,x++*2);x+=3;}}};f.setSize(200,200);f.setVisible(1>0);}}

15

15

84

84

93

93

うまくフォーマットされた:

import java.awt.*;    
class Z {    
    public static void main(String[] s) {
        int i = new Byte(s[0]), j = i / 10, k = i % 10;
        String t = "", u;
        if (j > 8)
            t = "59";
        if (j > 9)
            t = "9";
        if (j == 4) {
            t = "57";
        } else if (j < 9) {
            t = j > 4 ? "7" : "";
            j -= j > 4 ? 5 : 0;
            if (j > 0)
                t += "5";
            if (j > 1)
                t += "5";
            if (j > 2)
                t += "5";
        }
        if (k > 8)
            t += "15";
        if (k == 4) {
            t += "13";
        } else if (k < 9) {
            t += k > 4 ? "3" : "";
            k -= k > 4 ? 5 : 0;
            if (k > 0)
                t += "1";
            if (k > 1)
                t += "1";
            if (k > 2)
                t += "1";
        }
        u = t;
        Frame f = new Frame() {
            public void paint(Graphics g) {
                g.setColor(Color.BLACK);
                int x = 0;
                for (char c : u.toCharArray()) {
                    int z = c - 48, q = x;
                    for (; x < q + z;) {
                        g.drawOval(99 - x, 99 - x, x * 2, x++ * 2);
                    }
                    x += 3;
                }
            }
        };
        f.setSize(200, 200);
        f.setVisible(1 > 0);
    }
}

いくつかの結果を投稿してください。これが最初の場所ではないことを尋ねて申し訳ありません。
リップリープ14年

3

Mathematica 9-301 249バイト

:D組み込みのローマ数字への変換を使用するのは面倒ですが、ちょっと。

l=Length;k=Characters;r@n_:=(w=Flatten[Position[k@"IVXLC",#]*2-1&/@k@IntegerString[n,"Roman"]];Show[Table[Graphics@{AbsoluteThickness@w[[i]],Circle[{0,0},(Join[{0},Accumulate[3+w]]+3)[[i]]+w[[i]]/2]},{i,Range@l@w}],ImageSize->{(Total@w+(l@w)*3)*2}])

(昨夜この時間を過ごしたとき、あまり時間はありませんでしたが、もっとゴルフができることに気付きました。また、David Zhangからヒントを得ました...:Dありがとう!)

もう少し明確に:

l=Length;
k=Characters;
r@n_:=
    (
    w=Flatten[Position[k@"IVXLC",#]*2-1&/@k@IntegerString[n,"Roman"]];
    Show[Table[Graphics@{AbsoluteThickness@w[[i]],Circle[{0,0},(Join[{0},Accumulate[3+w]]+3)[[i]]+w[[i]]/2]},{i,Range@l@w}],ImageSize->{(Total@w+(l@w)*3)*2}]
    )

これは、次のように呼び出すことができる関数です。

r[144]

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

それとも、あなたは値の結果を示すことができるとBとを:Table[r[i],{i,a,b}]

:これは、399までの値に対してのみ機能します。


1

Python 2、322 296

スクリプトは、変換される数値をstdinから読み取り、SVGマークアップとして画像を出力します。

..「黒」の代わりに「赤」を使用します。これは2文字を保存するためです:)

サンプルは次のとおりです。23の 場合:http : //jsfiddle.net/39xmpq49/ 42の場合:http : //jsfiddle.net/7Ls24q9e/1/

i=input();r=9
def R(n,p):
 global r,i;i-=n;print '<circle r="{0}" stroke-width="{1}"/>'.format(r,p);r+=p+3
print '<svg viewBox="-50 -50 99 99" fill="none" stroke="red">',[[R(n,int(p)) for p in s*int(i/n)] for n,s in zip([100,90,50,40,10,9,5,4,1],'9/59/7/57/5/15/3/13/1'.split('/'))]and'','</svg>'

1

JavaScript 342 334 308

function R(n){var v=document,o=[],x=1,c=v.body.appendChild(v.createElement('canvas')).getContext('2d')
while(n)v=n%10,y=x+2,o=[[],[x],[x,x],[x,x,x],[x,y],[y],[y,x],[y,x,x],[y,x,x,x],[x,x+=4]][v].concat(o),n=(n-v)/10
v=3
while(x=o.shift())c.lineWidth=x,c.beginPath(),c.arc(150,75,v+x/2,0,7),c.stroke(),v+=x+3}

for (var i = 1; i <= 100; i++) {
  R(i);
}

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