परिपत्र ग्राफिक्स के रूप में संख्या


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
क्या छवि का सही पूर्ण आकार आवश्यक है, या क्या यह सही सापेक्ष आकार के लिए पर्याप्त है?
डेविड झांग

जवाबों:


15

गणितज्ञ - १६६ १ by१ बाइट्स

अन्य मैथेमेटिका उत्तर की तुलना में थोड़ा अधिक संक्षिप्त, एक अधिक बिंदु-मुक्त शैली में भाग के लिए धन्यवाद।

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", %]

उदाहरण आउटपुट

उदाहरण आउटपुट


कृपया कुछ परिणाम पोस्ट करें। यह न पूछने के लिए खेद है कि यह पहला स्थान है। मैंने कार्यों को स्वीकार करने के लिए प्रश्न को भी बदल दिया है।
रिप लीब

सुझाव के लिए धन्यवाद @ मार्टिनबटनर। कोड सही ढंग से आकार की छवियों को आउटपुट करने के लिए तय किया गया है, और उदाहरण आउटपुट जोड़ा गया है।
डेविड झांग

3
आपका एनीमेशन विगल्स। ऐसा नहीं कि मैं बेहतर कर सकता था।
corsiKa

हम्म, तुम सही हो। मुझे वास्तव में यकीन नहीं है कि ऐसा क्यों होता है, यह देखते हुए कि मैंने मैथमेटिका के लिए स्पष्ट रूप से प्लॉट रेंज निर्दिष्ट की है।
डेविड झांग

हो सकता है कि झगड़े से संबंधित हों: 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

Ungolfed

(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. यही कारण है कि वहाँ की अनुमति दी आदानों की श्रृंखला के लिए एक सीमा है के बीच पूर्णांकों के लिए काम करने के लिए निर्दिष्ट किया जाता है।

  • मैं प्रत्येक स्ट्रिंग सी के लिए जोड़ों Pवाली सूची बनाने के लिए परिणामस्वरूप स्ट्रिंग पर पुनरावृति करता हूं (radius width)

    • चौड़ाई एक सरल रैखिक मानचित्रण है: मैं इसमें सी की स्थिति की गणना करने के लिए निरंतर स्ट्रिंग "IVXLCDM" का उपयोग करता हूं। दो से गुणा करना और एक को जोड़ना, हम वांछित मूल्य प्राप्त करते हैं:

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

      यह हालांकि थोड़े अलग संस्करण में किया गया है:

             (position c " I V X L C D M")
      
    • प्रत्येक त्रिज्या की गणना प्रत्येक रिंग की चौड़ाई के साथ-साथ रिंगों के बीच रिक्त स्थान को ध्यान में रखती है। किसी भी गति अनुकूलन के बिना, गणना सटीक रहती है क्योंकि वे फ़्लोट पर आधारित नहीं होते हैं, लेकिन तर्कसंगत संख्याएँ।

      संपादित करें : मैंने पैडिंग नियमों का पालन करने के लिए मापदंडों को बदल दिया है।

  • एक बार यह हो जाने के बाद, मुझे परिणामी कैनवास के आवश्यक आकार (दो बार नवीनतम गणना की गई त्रिज्या) का पता चल जाता है।

  • अंत में, मैं Pकैनवास के प्रत्येक तत्व के लिए एक वृत्त खींचता हूं और उसे बचाता हूं ।

1
"यह कोड सभी रोमन अंकों (IVXLCDM) का समर्थन करता है"। क्या इसका मतलब है कि आपका प्रोग्राम इनपुट के रूप में रोमन अंक लेता है? यह मेरा इरादा नहीं है, लेकिन बहुत अच्छा है। एनीमेशन के लिए भी सहारा।
रिप लीब

1
नहीं, नहीं, क्षमा करें यदि यह अस्पष्ट है: यह 1 और 3999 के बीच किसी भी पूर्णांक के लिए काम करता है। आपके प्रश्न में, आपको केवल 1 से 100 तक इनपुट की आवश्यकता है, और आपकी तालिका में डी या एम का उल्लेख नहीं है ... मैं इसे संपादित करूँगा। अंश।
coredump

8

HTML + JQuery, 288

एचटीएमएल

<canvas>

जे एस

    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}

बेला


कोई स्टैक स्निपेट नहीं?
ऑप्टिमाइज़र

@ ऑप्टिमाइज़र पूरी तरह से भूल गया कि अब हम
ट्विनटेन

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

कृपया कुछ परिणाम पोस्ट करें। यह न पूछने के लिए खेद है कि यह पहला स्थान है।
रिप लीब

3

गणितज्ञ 9 - 301 249 बाइट्स

: डी यह रोमन अंकों के लिए अंतर्निहित रूपांतरित करने के लिए धोखा देने वाला लगता है, लेकिन हे।

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}])

(जब मैंने पिछली रात ऐसा किया था तो मेरे पास ज्यादा समय नहीं था, लेकिन मुझे एहसास हुआ कि इसे और अधिक नीचे लाया जा सकता है। और मैंने डेविड झांग से कुछ संकेत भी लिए ... ... 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

स्क्रिप्ट संख्या को स्टड से परिवर्तित करने के लिए पढ़ता है, और छवि को एसवीजी मार्कअप के रूप में आउटपुट करता है।

.. मैं 'ब्लैक' के बजाय 'रेड' का उपयोग करता हूं, क्योंकि यह 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

जावास्क्रिप्ट 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);
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.