नंबर सर्पिल समस्या


24

एक सर्पिल एक अनंत ग्रिड है जिसका ऊपरी-बाएँ वर्ग में नंबर 1 है। यहाँ सर्पिल की पहली पाँच परतें हैं:

यहाँ छवि विवरण दर्ज करें

आपका कार्य पंक्ति y और कॉलम x में संख्या का पता लगाना है।


उदाहरण:

Input: 2 3
Out  : 8
Input: 1 1
Out  : 1
Input: 4 2
Out  : 15

ध्यान दें:

  1. किसी भी प्रोग्रामिंग भाषा की अनुमति है।
  2. यह एक चुनौती है, इसलिए सबसे कम कोड जीतता है।
  3. शुभकामनाएँ!

स्रोत: https://cses.fi/problemset/task/1071


@Ww क्या मतलब है?
Agile_Eagle

1
ऐसा लगता है कि आपके इनपुट 1 अनुक्रमित हैं (1,1 पर निर्देशांक शुरू होते हैं) (हालाँकि यह परीक्षण के मामलों से जुड़ा होना है) क्या हम 0 इंडेक्सिंग का उपयोग कर सकते हैं (निर्देशांक 0,0 से शुरू होते हैं)?
गेहूं जादूगर

4
इसका क्या कारण है?
गेहूं जादूगर

7
मुझे लगता है कि निर्देशांक (1, 1) पर शुरू करना बिल्कुल ठीक है, खासकर अगर प्रोग्राम को सीएसईएस पर इस तरह से पोस्ट किया गया है, और ओपी को इसे औचित्य देने की आवश्यकता नहीं है। मुझे लगता है कि यहां गोल्फर कुछ ज्यादा ही मनमानी कर रहे हैं।
लिन

2
@ लीन I दूसरा स्थान
Agile_Eagle

जवाबों:


19

सी (जीसीसी),  44  43 बाइट्स

f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?y-x:x-y)-z;}

इसे ऑनलाइन आज़माएं!

सर्पिल में कई "हथियार" होते हैं:

12345
22345
33345
44445
55555

(x,y)max(x,y)zएन 2 एक्स वाई - n + 1 , - एन + 2 , ... , - 1 , 0 , 1 , ... , n - 1 , एन - 2 एन एन एन - 1 एन 2nn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2

बाइट बचाने के लिए मिस्टर एक्सकोडर का धन्यवाद ।


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}1 बाइट बचाता है।
श्री एक्सकोडर

@ Mr.Xcoder नीट चाल, धन्यवाद!
दरवाज़े


3
@RobertS। हां, यही वह कार्य है जिसे मैंने परिभाषित किया है ( TIO पर कोड अनुभाग में)। उदाहरण के लिए, f(1, 1)मान लौटाता है 1पाद अनुभाग के माध्यम से लूप x = 1 5 और y = 1 से 5 के माध्यम से, इस तरह के सभी मानों के लिए फ़ंक्शन को कॉल करने, और प्रदर्शित करने के लिए कि समारोह सवाल में दिखाया गया है सभी आदानों के लिए सही है एक ग्रिड में इसके उत्पादन प्रिंट।
दरवाज़े

1
@Agile_Eagle फ़ंक्शन संख्या वापस करता है (यह सर्पिल को आउटपुट नहीं कर सकता है - इसमें कोई लूप भी नहीं है!)।
दरवाज़े

7

पायथन,  54   50  49 बाइट्स

def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1

-4 बाइट्स @ChasBrown की बदौलत

-1 बाइट्स @ शुग्गी को धन्यवाद

इसे ऑनलाइन आज़माएं!

पहली बार गोल्फ! मुझे पता है कि यह अधिक से अधिक इष्टतम नहीं है, लेकिन जो भी हो।

अनिवार्य रूप से @Doorknob C कोड के समान सिद्धांत पर चलता है।


2
PPCG में आपका स्वागत है! इस मामले में आप def f(a,b):दृष्टिकोण का उपयोग करके 4 बाइट्स बचा सकते हैं, यहां देखें ।
चास ब्राउन

@ChasBrown बहुत दिलचस्प है, धन्यवाद!
डॉन थाउजेंड

@ शगुन शुक्रिया! मैंने कुछ चुनौतियां पोस्ट की हैं, लेकिन गोल्फ के लिए कभी भी अच्छा नहीं रहा है
डॉन थाउजेंड

उस स्थिति में, गोल्फ में आपका स्वागत है! :) मैं एक अजगर लड़का नहीं हूँ, लेकिन मुझे पूरा यकीन है कि M**2इसे बदला जा सकता है M*M
झबरा

@ शगुन शुक्रिया! अभी ठीक कर देंगे
डॉन थाउजेंड

7

MATL , 15 बाइट्स

X>ttq*QwoEqGd*+

इसे ऑनलाइन आज़माएं!
मैट्रिक्स के रूप में इकट्ठा करें और प्रिंट करें

कैसे?

संपादित करें: @ Doorknob के उत्तर के रूप में एक ही तकनीक, बस अलग तरीके से पहुंचे।

सर्पिल के विकर्ण तत्वों के बीच का अंतर अंकगणितीय अनुक्रम । इस के शब्दों का योग (सामान्य AP सूत्र द्वारा)। यह योग 1 से बढ़ा हुआ, विकर्ण तत्व को स्थिति ।0,2,4,6,8,nn(n1)(n,n)

यह देखते हुए , हम इन दोनों की अधिकतम खोज करते हैं, जो इस बिंदु से संबंधित सर्पिल की "परत" है। फिर, हम उस परत के विकर्ण मान को रूप में पाते हैं । समान परतों के लिए, विषम परतों लिए मान तब ।(x,y)v=n(n1)+1(x,y)v+xyvx+y

X>        % Get the maximum of the input coordinates, say n
ttq*      % Duplicate that and multiply by n-1
Q         % Add 1 to that. This is the diagonal value v at layer n
wo        % Bring the original n on top and check if it's odd (1 or 0)
Eq        % Change 1 or 0 to 1 or -1
Gd        % Push input (x, y) again, get y - x
*         % Multiply by 1 or -1
          % For odd layers, no change. For even layers, y-x becomes x-y
+         % Add that to the diagonal value v
          % Implicit output

वैकल्पिक 21 बाइट समाधान:

Pdt|Gs+ttqq*4/QJb^b*+

इसे ऑनलाइन आज़माएं!
मैट्रिक्स के रूप में इकट्ठा करें और प्रिंट
करें ऊपर से, हम जानते हैं कि हम जो फ़ंक्शन चाहते हैं वह है

f=m(m1)+1+(1)m(xy)

जहाँ ।m=max(x,y)

कुछ बुनियादी गणना से पता चलेगा कि अधिकतम दो संख्याओं के लिए एक अभिव्यक्ति है

m=max(x,y)=x+y+abs(xy)2

एक को दूसरे में प्लग करते हुए, हम पाते हैं कि लिए एक वैकल्पिक रूप है:f

f=(xy)ik+14((k2)k)+1

जहाँ ।k=abs(xy)+x+y

यह फंक्शन सॉल्यूशन इम्प्लीमेंट है।


5

जाप , 16 बाइट्स

कुछ बियर के ऊपर Doorknob के समाधान से अनुकूलित।

wV
nU²ÒNr"n-"gUv

कोशिश करो


व्याख्या

                  :Implicit input of integers U=x and V=y
wV                :Maximum of U & V
\n                :Reassign to U
 U²               :U squared
   Ò              :-~
      "n-"        :Literal string
           Uv     :Is U divisible by 2? Return 0 or 1
          g       :Get the character in the string at that index
    Nr            :Reduce the array of inputs by that, where n is inverse subtraction (XnY = Y-X)
n                 :Subtract U from the result of the above

3

अजगर, 20 बाइट्स

A~Qh.MZQh-+*-GH^_1Q*

परीक्षण सूट

रुषभ मेहता के उत्तर का लगभग शाब्दिक अनुवाद ।

स्पष्टीकरण:
A~Qh.MZQh-+*-GH^_1Q*    | Full code
A~Qh.MZQh-+*-GH^_1Q*QQQ | Code with implicit variables filled
                        | Assign Q as the evaluated input (implicit)
A                       | Assign [G,H] as
 ~Q                     |  Q, then assign Q as
   h.MZQ                |   Q's maximal value.
                        | Print (implicit)
        h-+*-GH^_1Q*QQQ |  (G-H)*(-1)^Q+Q*Q-Q+1




2

05AB1E , 12 11 बाइट्स

ZÐ<*>ŠGR}¥+

-1 बाइट के लिए धन्यवाद @Emigna को बदल रहा Èiहै G

@Sundar के MATL उत्तर का पोर्ट , इसलिए उसे उभारना सुनिश्चित करें!

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

Z              # Get the maximum of the (implicit) input-coordinate
               #  i.e. [4,5] → 5
 Ð             # Triplicate this maximum
  <            # Decrease it by 1
               #  i.e. 5 - 1 → 4
   *           # Multiply it
               #  i.e. 5 * 4 → 20
    >          # Increase it by 1
               #  i.e. 20 + 1 → 21
     Š         # Triple swap the top threes values on the stack (a,b,c to c,a,b)
               #  i.e. [4,5], 5, 21 → 21, [4,5], 5
      G }      # Loop n amount of times
       R       #  Reverse the input-coordinate each iteration
               #   i.e. 5 and [4,5] → [5,4]→[4,5]→[5,4]→[4,5] → [5,4]
         ¥     # Calculate the delta of the coordinate
               #  [5,4] → [1]
          +    # And add it to the earlier calculate value (output the result implicitly)
               #  21 + [1] → [22]

1
Èiहो सकता है G
एमिगा

@Eigna ओह स्मार्ट, धन्यवाद! : D
केविन क्रूज़सेन

0

पास्कल (एफपीसी) , 90 बाइट्स

uses math;var x,y,z:word;begin read(x,y);z:=max(x,y);write(z*z-z+1+(1and z*2-1)*(y-x))end.

इसे ऑनलाइन आज़माएं!

पोर्ट ऑफ डोरकनॉब के उत्तर , लेकिन सूंदर के उत्तर ने मुझे विचार दिया z mod 2*2-1जिसके लिए मैं 1and z*2-1अंतरिक्ष को हटाने में बदल गया ।




0

जावास्क्रिप्ट (ईएस 6), 46 बाइट्स

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c

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