원형 그래픽으로 숫자


36

먼저, 이 퍼즐 을 연구 하여 제작할 내용에 대한 느낌을 얻으십시오.

당신의 과제는 1에서 100 사이의 (기본 10) 숫자가 주어지면 퍼즐에서와 같은 원형 그래픽을 출력하는 프로그램이나 함수를 작성하는 것입니다. 로마 숫자 대신 그래픽을 생성한다는 점을 제외하고는 이 문제 와 유사합니다 . 다음 원은 왼쪽에서 오른쪽으로 숫자 1-10을 나타냅니다.

원형 패턴

퍼즐 상태에 대한 답으로, 그래픽은 안쪽에서 로마 숫자처럼 읽혀야합니다. 여기서 선 두께는 로마 숫자 기호를 나타내고 전체 그래픽은 숫자를 나타냅니다. 참고로 필요한 선 두께는 다음과 같습니다. 각 줄은 그 줄과 다음 줄 사이에 3px 패딩이 있어야합니다.

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

출력물 중 하나 또는 두 개를 게시하십시오. 입력이 정확하고 표준 허점 등 이 있다고 가정 합니다. 이것은 코드 골프이므로 가장 적은 바이트가 이깁니다. 동점 일 경우, 대부분의 투표가 승리합니다. 행운을 빕니다!


3
이미지의 정확한 절대 크기가 필요합니까, 아니면 적절한 상대 크기를 갖는 것으로 충분합니까?
David Zhang

@DavidZhang 예, 공정성을 위해 나열된 줄과 패딩 크기를 준수하십시오.
리핑 Leeb

답변:


15

티카 - 166 181 바이트

더 포인트 프리 스타일 덕분에 다른 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] &

모든 공백은 명확성을위한 것입니다. 원하는 그래픽을 반환하는 익명 함수를 정의합니다.

생기

애니메이션 서클

Mathematica에서는 숫자 원의 애니메이션 GIF를 생성하는 것이 쉽지 않습니다. 위의 코드가 방금 실행되었다고 가정하면,

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

출력 예

출력 예


몇 가지 결과를 게시하십시오. 이것을 묻지 않아서 미안합니다. 또한 함수를 수락하도록 질문을 변경했습니다.
Rip Leeb

@ MartinBüttner의 제안에 감사드립니다. 코드는 올바른 크기의 이미지를 출력하도록 수정되었으며 예제 출력이 추가되었습니다.
David Zhang

3
애니메이션이 흔들립니다. 내가 더 잘할 수있는 것은 아닙니다.
corsiKa

흠, 맞아. Mathematica에 대한 플롯 범위를 명시 적으로 지정했을 때 왜 그렇게하는지 잘 모르겠습니다.
David Zhang

어쩌면 위 글링과 관련이있을 수도 있습니다 : mathematica.stackexchange.com/q/134272
coredump

15

커먼 리스프- 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 사이의 숫자 :

새로운

NB : 레코드의 경우이 애니메이션은 다음과 같이 수행됩니다.

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")
      
    • 각 반경의 계산에는 각 링의 너비와 링 사이의 빈 공간이 고려됩니다. 속도 최적화가 없으면 플로트가 아니라 합리적인 숫자를 기반으로하기 때문에 계산이 정확하게 유지됩니다.

      편집 : 패딩 규칙을 준수하도록 매개 변수를 변경했습니다.

  • 이 작업이 완료되면 결과 캔버스의 필요한 크기 (최신 계산 반경의 두 배)를 알 수 있습니다.

  • 마지막으로 P캔버스 의 각 요소에 원을 그리고 저장합니다.

1
"이 코드는 모든 로마 숫자 (IVXLCDM)를 지원합니다." 프로그램에서 로마 숫자를 입력으로 사용한다는 의미입니까? 그것은 내가 의도 한 것이 아니라 꽤 시원합니다. 애니메이션 소품.
Rip Leeb

1
아니요, 아니요, 확실하지 않은 경우 죄송합니다. 1에서 3999 사이의 정수에서 작동합니다. 귀하의 질문에 따르면 1에서 100 사이의 입력 만 필요했고 테이블에는 D 또는 M이 언급되어 있지 않습니다 ... 편집하겠습니다. 부품.
coredump 2013

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}

깡깡이


스택 스 니펫이 없습니까?
Optimizer

@Optimizer 완전히 잊어 버렸습니다
TwiNight

5

자바, 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);
    }
}

몇 가지 결과를 게시하십시오. 이것을 묻지 않아서 미안합니다.
Rip Leeb

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]

여기에 이미지 설명을 입력하십시오

또는 값 a 에서 b 까지의 결과를 다음과 같이 표시 할 수 있습니다 .Table[r[i],{i,a,b}]

참고 : 최대 399 개의 값에 대해서만 작동합니다.


1

파이썬 2, 322 296

스크립트는 stdin에서 변환 할 숫자를 읽고 이미지를 SVG 마크 업으로 출력합니다.

.. 나는 2 개의 문자를 저장하기 때문에 'black'대신 'red'를 사용합니다 :)

여기에 몇 가지 샘플이 있습니다 : 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

자바 스크립트 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.