चेबीशेव रोटेशन


36

एक नियमित ग्रिड पर विचार करें, जहां प्रत्येक सेल में पूर्णांक निर्देशांक होते हैं। हम कोशिकाओं को वर्ग (आकार के) "रिंग्स" में समूहित कर सकते हैं, जहां प्रत्येक रिंग में कोशिकाओं की उत्पत्ति के समान चेबीशेव दूरी (या शतरंज की दूरी) है। आपका कार्य इस तरह के सेल को समन्वित करना है और उस सेल को उसके रिंग के भीतर एक स्थिति काउंटर-क्लॉकवाइज द्वारा घुमाना है। यह निम्नलिखित मानचित्रण को लागू करता है:

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

इसलिए उदाहरण के लिए यदि इनपुट (3, -2)आप आउटपुट होना चाहिए (3, -1)। ध्यान दें कि (0, 0)एकमात्र ऐसा इनपुट है जो स्वयं को मैप करना चाहिए।

नियम

I / O प्रारूप काफी लचीला है। आप दो अलग-अलग संख्याओं का उपयोग कर सकते हैं, एक जोड़ी / सूची / सरणी / संख्याओं का ट्यूपल, एक एकल जटिल संख्या, दो संख्याओं वाला एक स्ट्रिंग आदि।

आप ऐसा मान सकते हैं -128 < x,y < 128

आप एक प्रोग्राम या फ़ंक्शन लिख सकते हैं और इनपुट प्राप्त करने और आउटपुट प्रदान करने के हमारे किसी भी मानक तरीके का उपयोग कर सकते हैं।

आप किसी भी प्रोग्रामिंग भाषा का उपयोग कर सकते हैं , लेकिन ध्यान दें कि इन खामियों को डिफ़ॉल्ट रूप से मना किया गया है।

यह , इसलिए सबसे छोटा वैध उत्तर - बाइट्स में मापा जाता है - जीतता है।

परीक्षण के मामलों

(0, 0)       => (0, 0)
(1, 0)       => (1, 1)
(1, 1)       => (0, 1)
(0, 1)       => (-1, 1)
(-1, 1)      => (-1, 0)
(-1, 0)      => (-1, -1)
(-1, -1)     => (0, -1)
(0, -1)      => (1, -1)
(1, -1)      => (1, 0)
(95, -12)    => (95, -11)
(127, 127)   => (126, 127)
(-2, 101)    => (-3, 101)
(-65, 65)    => (-65, 64)
(-127, 42)   => (-127, 41)
(-9, -9)     => (-8, -9)
(126, -127)  => (127, -127)
(105, -105)  => (105, -104)

क्या हम इनपुट और आउटपुट फॉर्मेट को मिक्स कर सकते हैं, उदाहरण के लिए, एक टपल ले सकते हैं और एक जटिल नंबर आउटपुट कर सकते हैं?
डेनिस

@ डेनिस हाँ यह ठीक है।
मार्टिन एंडर

जवाबों:


16

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

करी सिंटैक्स के साथ इनपुट लेता है (x)(y)और एक सरणी देता है [new_x, new_y]

x=>y=>(x|y&&((z=x+(y<0))>-y?z>y?y++:x--:z>y?x++:y--),[x,y])

यह काम किस प्रकार करता है

हमारा मुख्य कार्य यह निर्धारित करना है कि हम किस परिधि में हैं, ताकि हमें पता चले कि किस दिशा में बढ़ना है।

हम इस सूत्र को पहले सन्निकटन के रूप में उपयोग कर सकते हैं:

x > -y ? (x > y ? 0 : 1) : (x > y ? 2 : 3)

यहाँ हम क्या है:

3 1 1 1 1 1 1 1 1
3 3 1 1 1 1 1 1 0
3 3 3 1 1 1 1 0 0
3 3 3 3 1 1 0 0 0
3 3 3 3 3 0 0 0 0
3 3 3 3 2 2 0 0 0
3 3 3 2 2 2 2 0 0
3 3 2 2 2 2 2 2 0
3 2 2 2 2 2 2 2 2

लगभग वहाँ। लेकिन छल्ले के निचले बाएँ और नीचे दाएं कोने अमान्य हैं। हमें मैट्रिक्स के निचले आधे हिस्से को बाईं ओर एक स्थिति में बदलना होगा, इसलिए हम निम्नानुसार परिभाषित zकरते हैं:

z = y < 0 ? x + 1 : x

और हम अपने सूत्र से प्रतिस्थापित xकरते हैं z:

z > -y ? (z > y ? 0 : 1) : (z > y ? 2 : 3)

जिससे होता है:

3 1 1 1 1 1 1 1 1 
3 3 1 1 1 1 1 1 0 
3 3 3 1 1 1 1 0 0 
3 3 3 3 1 1 0 0 0 
3 3 3 3 3 0 0 0 0 
3 3 3 2 2 0 0 0 0 
3 3 2 2 2 2 0 0 0 
3 2 2 2 2 2 2 0 0 
2 2 2 2 2 2 2 2 0 

संपूर्ण मैट्रिक्स अब सही है, विशेष मामले को छोड़कर [0, 0](बिल्कुल भी कोई कदम नहीं) जिसे अलग से संबोधित किया जाना चाहिए।

परीक्षण के मामलों


13

जेली , 20 14 12 बाइट्स

S;IṠN0n/¦Ạ¡+

इनपुट और आउटपुट सरणियों के रूप में हैं। इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

पृष्ठभूमि

यह पता लगाने के लिए कि हमें किस दिशा में जाना है, हम क्वाडरंट बाइसेक्टर्स x + y = 0 (नीला) और x - y = 0 (लाल) में प्रारंभ बिंदु के सापेक्ष स्थिति का निरीक्षण कर सकते हैं ।

आरेख

  • मूल तय है। हम शुरुआती बिंदु पर [0, 0] जोड़कर आगे बढ़ते हैं ।

  • सबसे ऊपरी त्रिभुज में अंक - जिसमें पहले चतुर्थांश के द्विभाजक शामिल हैं - सकारात्मक राशि और गैर-नकारात्मक डेल्टा ( y - x ) हैं। हम शुरुआती बिंदु पर [-1, 0] जोड़कर आगे बढ़ते हैं ।

  • बाईं ओर के त्रिकोण में बिंदु - दूसरे चतुर्थांश के द्विभाजक सहित - गैर-सकारात्मक राशि और सकारात्मक डेल्टा है। हम शुरुआती बिंदु पर [0, -1] जोड़कर आगे बढ़ते हैं ।

  • बॉटलमॉस्ट त्रिकोण में अंक - तीसरे चतुर्थांश के द्विभाजक सहित - नकारात्मक राशि और गैर-सकारात्मक डेल्टा है। हम शुरुआती बिंदु पर [1, 0] जोड़कर आगे बढ़ते हैं ।

  • सबसे दाईं ओर के त्रिकोण में - चतुर्थांश के द्विभाजक सहित - गैर-नकारात्मक योग और नकारात्मक डेल्टा है। हम शुरुआती बिंदु पर [0, 1] जोड़कर आगे बढ़ते हैं ।

सही दिशा का पता लगाने के लिए, हम [-sign (x + y), -sign (y - x)] की गणना करते हैं , जिसमें केवल नौ संभावित परिणाम हैं।

निम्न तालिका यह बताती है कि किन दिशाओं में मैप किया जाना है।

    sign(x+y) |  sign(y-x) | -sign(x+y) | -sign(y-x) |     Δx     |     Δy
  ------------+------------+------------+------------+------------+------------
        0     |      0     |      0     |      0     |      0     |      0
        1     |      0     |     -1     |      0     |     -1     |      0
        1     |      1     |     -1     |     -1     |     -1     |      0
        0     |      1     |      0     |     -1     |      0     |     -1
       -1     |      1     |      1     |     -1     |      0     |     -1
       -1     |      0     |      1     |      0     |      1     |      0
       -1     |     -1     |      1     |      1     |      1     |      0
        0     |     -1     |      0     |      1     |      0     |      1
        1     |     -1     |     -1     |      1     |      0     |      1

यह तीन मामलों को छोड़ देता है।

  • यदि संकेतों में से कम से कम एक 0 है , [Δx, ]y] = [-sign (x + y), -sign (yx)]

  • यदि चिह्न समान और गैर-शून्य हों, [Δx, ]y] = [-sign (x + y), 0]

  • यदि संकेत अलग और गैर-शून्य हैं, तो [andx, ]y] = [0, -sign (yx)]

यह काम किस प्रकार करता है

S;IṠN0n/¦Ạ¡+  Main link. Argument: [x, y] (pair of integers)

S             Sum; compute x + y.
  I           Increments; compute [y - x].
 ;            Concatenate; yield [x + y, y - x].
   Ṡ          Sign; compute [sign(x + y), sign(y - x)].
    N         Negate; yield [-sign(x + y), -sign(y - x)].
          ¡   Do n times:
         Ạ      Set n to all([-sign(x + y), -sign(y - x)]), i.e., 1 if the signs
                are both non-zero and 0 otherwise.
        ¦       Conditional application:
      n/          Yield 1 if the signs are not equal, 0 if they are.
     0            Replace the coordinate at 1 or 0 with a 0.
              This returns [Δx, Δy].
           +  Add; yield  [Δx + x, Δy + y].


5

पायथन, 55 बाइट्स

lambda x,y:(x-(-y<x<=y)+(y<=x<-y),y+(~x<y<x)-(x<y<=-x))

चार विकर्ण चतुर्भुज का पता लगाता है, और उपयुक्त समन्वय को स्थानांतरित करता है।


4

हास्केल, 77 71 69 बाइट्स

x#y|y>=x,-x<y=(x-1,y)|y>x=(x,y-1)|y< -x=(x+1,y)|y<x=(x,y+1)|1>0=(0,0)

यह केवल उन झुके हुए चतुर्भुजों में से प्रत्येक की जाँच कर रहा है, और तदनुसार इनपुट को संशोधित कर रहा है। ध्यान दें कि रिक्त स्थान आवश्यक हैं, अन्यथा उदाहरण के >-लिए एक ऑपरेटर के रूप में समझा जाएगा (जो परिभाषित नहीं है)।

कुछ और बाइट्स निकालने के लिए @nimi धन्यवाद!


,&&पहले गार्ड के बजाय एक बाइट बचाता है। और फिर आप -x<yदूसरे बाइट के लिए दूसरी तुलना स्विच कर सकते हैं ।
nimi

धन्यवाद, मुझे पता नहीं था ,!
दोष

4

रूबी, 68

लैम्ब्डा फ़ंक्शन जटिल संख्या को तर्क के रूप में लेता है, जटिल संख्या देता है।

->z{k=1
4.times{z*=?i.to_c
x,y=z.rect
y*y>=x*x&&y<-x&&(z+=k;k=0)}
z} 

हम बिंदु को घुमाकर ९ ० डिग्री से ४ बार घुमाते हैं i। इसलिए यह सभी 4 चतुर्भुजों से होकर गुजरता है, और अपरिवर्तित लौटाया जाएगा - इस तथ्य को छोड़कर कि जब हम उनमें से किसी एक विशेष में होते हैं तो हम इसे संशोधित करते हैं। तथ्य यह है कि यह हमेशा एक ही चतुर्थांश में संशोधित किया जाता है संशोधन को सरल करता है।

यह पालन करना सबसे आसान है अगर हम इसे zसहीहैंड क्वाड्रेंट में बदलते हैं । इस मामले में हम y 1 से समन्वय बढ़ाने की आवश्यकता (यानी जोड़ने iके लिए z।)

हम और x.abs>=y.absके वर्गों की तुलना करके जाँच करते हैं । यह हमें बताता है कि बिंदु दाएं या बाएं खंड में है, ऊपर या नीचे नहीं। यह जाँचने के लिए कि वास्तव में दाहिने हिस्से में हम आगे की जाँच करते हैं (कड़ाई से अधिक क्योंकि हम उस मामले को बाहर करना चाहते हैं जो "शीर्ष" चतुर्थांश से संबंधित है।) जहाँ यह सच है हम जोड़ते हैं।xyx>yx=yiz

गोल्फ कारणों के लिए, जोड़ना iवांछनीय नहीं है। इसके बजाय हम उस संख्या को मापते हैं जब वह नीचे के चतुर्थांश में होती है, जिस स्थिति में हमें xसमन्वय में 1 जोड़ना पड़ता है (1 से 1 जोड़ें z।) इस मामले में हम परीक्षण करते हैं कि y*y>=x*xयह जाँचने के लिए कि यह शीर्ष या नीचे के चतुर्थांश में है। आगे यह सुनिश्चित करने के लिए कि हमें नीचे के चतुर्थांश में है, हमें जांच करने की आवश्यकता है y<-x(नीचे दाएं कोने के मामले को छोड़कर जहां y=-x)।

इस चेक का एक लाभ यह है कि समन्वय 0,0 के लिए कोई विशेष मामला नहीं है। दुर्भाग्य से यह पाया गया कि बिंदु को स्थानांतरित करने से इसे एक अलग चतुर्थांश में स्थानांतरित किया जा सकता है और इसका मतलब यह है कि एक दूसरे आंदोलन को दबाया जाना चाहिए ताकि उस चक्र को फिर से जांचा जा सके, जो संभवतः लाभ को नकारता है।

उदाहरण 1

Input                                        95,-12
Rotate 90deg                                 12,95    
Rotate 90deg                                -95,12    
Rotate 90deg                                -12,-95 
Rotate 90deg                                 95,-12
y.abs>=x.abs=TRUE, y<-x=TRUE, increase x     95,-11

The check and alteration of the coordinate is done AFTER the rotation.
Thus in this case it gets done in the 4th iteration of the loop, not the 1st.
If the code were rewritten to do the check and alteration BEFORE the rotation, 
it would be done in the 1st iteration instead of the 4th.

उदाहरण 2

Input                                        -1,0
Rotate 90deg                                  0,-1
y.abs>=x.abs=TRUE, y<-x=TRUE, increase x      1,-1
Rotate 90deg                                  1,1
Rotate 90deg                                  1,-1
Rotate 90deg                                 -1,-1
y.abs>=x.abs?=TRUE, y<-x=TRUE but DO NOT CHANGE x!

This is an unusual situation due to the fact that the first move caused the
point to advance by one quadrant. We do NOT want to move it again, for this
reason we need to set k to 0 the first time it is moved.

परीक्षण कार्यक्रम में

f=->z{k=1                   #amount to be added to coordinate
4.times{z*=?i.to_c          #iterate 4 times, rotating point by 90deg till it reaches the original orientation
x,y=z.rect                  #separate out x and y for testing
y*y>=x*x&&y<-x&&(z+=k;k=0)} #if y.abs>=x.abs and y negative and not equal -x, move the point and zero k.
z}                          #return z

puts f[Complex(0, 0)]       # (0, 0)
puts f[Complex(1, 0)]       # (1, 1)
puts f[Complex(1, 1)]       # (0, 1)
puts f[Complex(0, 1)]       # (-1, 1)
puts f[Complex(-1, 1)]      # (-1, 0)
puts
puts f[Complex(-1, 0)]      # (-1, -1)
puts f[Complex(-1, -1)]     # (0, -1)
puts f[Complex(0, -1)]      # (1, -1)
puts f[Complex(1, -1)]      # (1, 0)
puts f[Complex(95, -12)]    # (95, -11)
puts f[Complex(127, 127)]   # (126, 127)
puts
puts f[Complex(-2, 101)]    # (-3, 101)
puts f[Complex(-65, 65)]    # (-65, 64)
puts f[Complex(-127, 42)]   # (-127, 41)
puts f[Complex(-9, -9)]     # (-8, -9)
puts f[Complex(126, -127)]  # (127, -127)
puts f[Complex(105, -105)]  # (105, -104)

आरेख

निम्नलिखित छवि दिखाती है (नीला) वह क्षेत्र जहाँ x*x>=y*y, (पीला) वह क्षेत्र जहाँ y<-xऔर (हरा) इनका प्रतिच्छेदन है, जो कि वह क्षेत्र है जहाँ सही परिवर्तन 1 से करने का जोड़ है z

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


1
क्षमा करें, मैं स्पष्टीकरण का अनुसरण नहीं कर रहा हूं। क्या आप एक उदाहरण या एक चित्र जोड़ना चाहेंगे?
मार्टिन एंडर

@ मार्टिन स्पष्टीकरण जोड़ा गया। यह एक दिलचस्प दृष्टिकोण था, लेकिन पहली बार जब वे चलते हैं, तो चतुर्थांश को बदलने वाले बिंदुओं के दोहरे आंदोलन को दबाने की आवश्यकता के कारण, यह उतना सुंदर नहीं निकला जितना मैंने उम्मीद की थी।
लेवल रिवर सेंट

4

पायथन, 52 बाइट्स

h=lambda z:z and 1j*h(z/1j)if'-'in`z*1j-z-1`else z+1

जटिल इनपुट और आउटपुट। निचले विकर्ण चतुर्भुज में होने के लिए बिंदु का परीक्षण करने के लिए, पहले उस मानक (x> 0, y> 0) मानक चतुर्थांश में स्थानांतरित करने के लिए 135 वामावर्त घुमाएं, और परीक्षण करें यदि परिणाम में स्ट्रिंग प्रतिनिधित्व में कोई ऋण चिह्न नहीं है। 1 को घटाना पहले सीमा की स्थिति का ख्याल रखता है।

यदि यह उस चतुर्थांश में नहीं है, तो पूरी समस्या को 90 डिग्री पर घुमाएं। इनपुट शून्य है विशेष रूप से आउटपुट के लिए खुद को संभाला।

जटिल संख्या के साथ अन्य प्रयास:

## 56 bytes
## Coordinate input, complex output
q=lambda x,y:(y<=x<-y)*(1j*y-~x)or x+1j*y and 1j*q(y,-x)

## 60 bytes
h=lambda z:(z+1)*(z.imag<=z.real<-z.imag)or z and 1j*h(z/1j)

## 63 bytes
from cmath import*
h=lambda z:z and 1j**(phase(z*1j-z)*2//pi)+z

3

गणितज्ञ, 34 बाइट्स

±0=0
±z_:=z+I^Floor[2Arg@z/Pi+3/2]

यह एक एकीकृत ऑपरेटर को परिभाषित करता है ±जो एक जटिल संख्या लेता है और वापस करता है जिसके घटक प्रतिनिधित्व करते हैं xऔर y

अब जब लिन ने जटिल संख्या समाधान का खुलासा किया है और डेनिस ने मेरे स्कोर को हरा दिया है, तो मुझे अपने गोल्फ के संदर्भित कार्यान्वयन को पोस्ट करने के लिए इतना बुरा नहीं लगता। :) (यह वास्तव में लिन के उत्तर के समान है।)


क्या यह मदद करेगा? ± 0 = 0 ⁢ ± z_: = z + I ^ ⁢ 2 = Arg @ z / Pi + 3/2 3 (शायद फर्श कोष्ठक के लिए एक अलग चार्ट के साथ)
डेविडसी

@DavidC दुर्भाग्य से नहीं क्योंकि तब मुझे UTF-8 एन्कोडिंग का उपयोग करना होगा और फिर ± की लागत 2 बाइट्स होगी।
मार्टिन एंडर

यह 7 के बजाय 4 बाइट्स नहीं होगा, इस प्रकार 3 बाइट्स की अर्थव्यवस्था देनी चाहिए?
18

@DavidC नहीं, फर्श कोष्ठक प्रत्येक 3 बाइट होगा।
मार्टिन एंडर

मुझे इसकी जानकारी नहीं थी। लेकिन, फिर भी, आपको अभी भी 1 बाइट की बचत करनी चाहिए।
डेविड

3

MATL , 19 17 बाइट्स

t|?JGJq*X/EYP/k^+

यह इनपुट और आउटपुट के रूप में जटिल संख्याओं का उपयोग करता है।

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

व्याख्या

-127+42jएक उदाहरण के रूप में इनपुट लेते हैं ।

t|       % Implicit input. Duplicate and take absolute value
         % STACK: -127+42j, 133.764718816286
?        % If nonzero
         % STACK: -127+42j
  J      %   Push j (imaginary unit)
         %   STACK: -127+42j, j
  GJq*   %   Push input multiplied by -1+j. This adds 3*pi/4 to the phase of the input
         %   STACK: -127+42j, j, 85-169i
  X/     %   Phase of complex number
         %   STACK: -127+42j, j, -1.10478465600433
  EYP/   %   Divide by pi/2
         %   STACK: -127+42j, j, -0.703327756220671
  k      %   Round towards minus infinity
         %   STACK: -127+42j, j, -1
  ^      %   Power
         %   STACK: -127+42j, -j
  +      %   Add
         %   STACK: -127+41j
         % Implicit end
         % Implicit display

3

रूबी, 51 बाइट्स

मूल रूप

->x,y{d=x*x-y*y
[x+(d>0?0:-y<=>x),y+(d<0?0:x<=>y)]}

Xnor की टिप्पणी के अनुसार वैकल्पिक रूप

->x,y{[x+(x*x>y*y ?0:-y<=>x),y+(x*x<y*y ?0:x<=>y)]}

मेरे अन्य उत्तर के रूप में एक ही प्रकार की असमानताओं का उपयोग करता है, लेकिन एक अलग तरीके से।

परीक्षण कार्यक्रम में

f=->x,y{d=x*x-y*y
[x+(d>0?0:-y<=>x), #if y.abs>=x.abs: x+=1 if -y>x, x-=1 if -y<x 
y+(d<0?0:x<=>y)]}  #if x.abs>=y.abs: y+=1 if  x>y, y-=1 if  x<y

p f[0, 0]       # (0, 0)
p f[1, 0]       # (1, 1)
p f[1, 1]       # (0, 1)
p f[0, 1]       # (-1, 1)
p f[-1, 1]      # (-1, 0)
puts
p f[-1, 0]      # (-1, -1)
p f[-1, -1]     # (0, -1)
p f[0, -1]      # (1, -1)
p f[1, -1]      # (1, 0)
p f[95, -12]    # (95, -11)
p f[127, 127]   # (126, 127)
puts
p f[-2, 101]    # (-3, 101)
p f[-65, 65]    # (-65, 64)
p f[-127, 42]   # (-127, 41)
p f[-9, -9]     # (-8, -9)
p f[126, -12]   # (127, -127)
p f[105, -105]  # (105, -104)

क्या dअसाइनमेंट इसके लायक है? ऐसा लगता है कि आप सिर्फ तुलना कर सकते हैं x*x>y*y
xnor

@Xnor दुर्भाग्य से रूबी के बीच एक स्थान की आवश्यकता है y*yऔर ?इसलिए यह बिल्कुल समान लंबाई है। मैंने इसे शामिल किया है क्योंकि मुझे लगता है कि आपका रास्ता कुछ तरीकों से है। मुझे लगता है कि रूबी इसे पारित करने की कोशिश कर रही है, y?जो एक कानूनी कार्य नाम होगा।
लेवल रिवर सेंट

3

जूलिया, 38 34 बाइट्स

!z=z==0?0:z+im^int(2angle(z)/pi+1)

डेनिस ने चार बाइट बचाए। धन्यवाद!

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


लगता है जैसे मैं मिश्रित पूर्णांक के जूलिया (जो, मेरे बचाव में, है के विभिन्न संस्करणों में व्यवहार की बहुत असंगत)। जूलिया 0.4 (TIO पर संस्करण) राउंड यहां तक ​​कि आधा हो जाता है, इसलिए यह काम नहीं करेगा। जूलिया 0.3 में, आप int(2angle(z)/pi+5)एक ही बाइट काउंट के लिए उपयोग कर सकते हैं (नकारात्मक शक्तियां किसी भी कारण से त्रुटि पैदा करती हैं)।
डेनिस

इसके अलावा, आप !z=z+(z!=0)im^...सभी संस्करणों में एक बाइट बचा सकते हैं ।
डेनिस

2

सी ++, 94 बाइट्स

#define a(x) (x>0?x:-(x))
#define f(x,y) y>a(x-.5)?x--:-y>a(x+.5)?x++:x>a(y+.5)?y++:x|y?y--:x;

Ungolfed:

#define a(x) (x>0?x:-(x))  //shorter than std::abs from <cmath>
#define f(x,y) 
    y>a(x-.5)?      // shift absolute value function by 0.5 to the right to get upper fourth
        x--:
        -y>a(x+.5)? //same for lower fourth
            x++:
            x>a(y+.5)? //same for right fourth
                y++:
                x|y? //only left fourth and 0 are left
                    y--:
                    x; //can't be empty, just does nothing

उपयोग:

#include <iostream>
void test(int x, int y, int rx, int ry){
    std::cout << "(" << x << ", " << y << ")=>";
    f(x,y);
    std::cout << "(" << x << ", " << y << ") - " << ((x==rx&&y==ry)?"OK":"FAILURE") << std::endl;
}

//Using the test cases from the question
int main() {
    test(0, 0, 0, 0);
    test(1, 0, 1, 1);
    test(1, 1, 0, 1);
    test(0, 1, -1, 1);
    test(-1, 1, -1, 0);
    test(-1, 0, -1, -1);
    test(-1, -1, 0, -1);
    test(0, -1, 1, -1);
    test(1, -1, 1, 0);
    test(95, -12, 95, -11);
    test(127, 127, 126, 127);
    test(-2, 101, -3, 101);
    test(-65, 65, -65, 64);
    test(-127, 42, -127, 41);
    test(-9, -9, -8, -9);
    test(126, -127, 127, -127);
    test(105, -105, 105, -104);

    return 0;
}

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


मुझे पूरा यकीन है कि यह (x>0?x:-(x))हो सकता है (x>0?x:-x)
यति

दुर्भाग्य से नहीं, चूंकि टोकन x को x + .5 द्वारा प्रतिस्थापित किया जाएगा जो कि केवल -x + .5 होगा।
आदार

ठीक है। मेरी एक मानसिकता थी कि बिना कोष्ठक के नकारात्मकता ने संकेत को छोड़ दिया: D
Yytsi

कड़ाई से बोलते हुए, आपने सी प्रीप्रोसेसर का उपयोग किया है (जो कि वास्तव में सी ++ का एक हिस्सा है, लेकिन अन्य सी वेरिएंट और वंश के साथ भी साझा किया गया है)
tucuxi

2

आर, 131 110 बाइट्स

एक फ़ंक्शन जो दो पूर्णांक लेता है, x,y इनपुट के रूप और आउटपुट को stdout में लिखता है। समाधान @ डेनिस के नियंत्रण प्रवाह योजना का अनुसरण करता है, लेकिन शायद इसे गोल्फ किया जा सकता है।

संपादित करें: @ JDL के सुझावों के आधार पर अपडेट किया गया कोड और बाइट्स का एक गुच्छा बचाया।

function(x,y){X=sign(x+y);Y=sign(y-x);if(!X|!Y){x=x-X;y=y-Y}else if(X==Y&X&Y)x=x-X else if(X-Y&X)y=y-Y;c(x,y)}

Ungolfed

f=function(x,y){
    X=sign(x+y)                 # calculate sign 
    Y=sign(y-x)                 #  =||=
    if(!X|!Y){x=x-X;y=y-Y}      # if at least one is 0: subtract sign
    else if(X==Y&X&Y)x=x-X      # if signs are equal and non-zero: add sign to x
    else if(X-Y&X)y=y-Y         # if signs are not equal and non-zero: add sign to y
    c(x,y)                      # print to stdout
}

1
मुझे लगता है कि कुछ तार्किक स्थितियों को छोटा किया जा सकता है: as.logical(-1)है TRUE, इसलिए X==0|Y==0बन सकता है !X|!Y, और स्थिति if(X!=Y...)बन सकती है if(X-Y)। इसके अलावा, अगर X==Yऔर X!=0फिर Y!=0बेमानी है। दरअसल, सभी !=0हिस्से बेमानी हैं; if(X!=0)के बराबर है if(X)
JDL

1
इसके अलावा, यह देखते हुए कि "I / O प्रारूप काफी लचीला है", यह संभवत: निष्पक्ष खेल है जिसके c(x,y)बजाय इसके साथ अंतर्निहित रूप से उत्पादन करना है cat(x,y)
JDL

@JDL उन कुछ बहुत ही उपयोगी गोल्फ युक्तियाँ हैं जिनके बारे में मैंने कभी सोचा नहीं था, धन्यवाद! उत्तर अपडेट किया गया।
बिलीवोब

2

जावास्क्रिप्ट (ईएस 6), 57 बाइट्स (55-63,)

एक [x, y] सरणी को स्वीकार करता है, इसे इन-प्लेस संशोधित करता है, और इसे लौटाता है।

c=>([x,y]=c,i=x>y|x==y&x<0,c[i^x<-y|x==-y]-=-i|!!(x|y),c)

यह काम किस प्रकार करता है

c=>(

यह एक एकल-पैरामीटर तीर फ़ंक्शन है, जो एक returnसंक्षिप्त संक्षिप्त शरीर के साथ है।

[x,y]=c

पैरामीटर तुरंत xऔर yचरों में नष्ट हो जाता है।

,

अल्पविराम ऑपरेटर अंतिम के परिणाम का उपयोग करके एक में कई अभिव्यक्तियों को जोड़ता है।

i=x>y|x==y&x<0

iका उपयोग वेतन वृद्धि और वेतन वृद्धि के मामलों में अंतर करने के लिए किया जाता है। जब xअधिक से अधिक होता है y, तो हम नीचे या दाएं चतुर्थांश में होते हैं, और एक आयाम ( i=1बूलियन-टू-नंबर ज़बरदस्ती) में आगे बढ़ने की आवश्यकता होती है । इसी तरह जब हम विभाजित x = y विकर्ण के नकारात्मक भाग पर होते हैं । अन्य सभी मामलों में - मूल सहित - कोई वेतन वृद्धि की आवश्यकता नहीं है ( i=0)।

c[i^x<-y|x==-y]

हम समायोजन के लिए किस सरणी इंडेक्स को नियंत्रित करने के लिए कुछ समान अभिव्यक्ति का उपयोग करते हैं। जब हम incrementing कर रहे हैं और नहीं छोड़ दिया है या नीचे चतुर्थ भाग में (या जब हम कर रहे हैं नहीं incrementing और में छोड़ दिया या नीचे), तो बिटवाइज़ XOR उत्पादन करेगा 1और हम समायोजित करेगा y मूल्य। इसी तरह जब हम विभाजित x = -y विकर्ण (मूल सहित) पर होते हैं। अन्य सभी मामलों में, सूचकांक 0( x ) होगा।

-=-i|!!(x|y)

कब iहै 1, हम इसे निर्दिष्ट मूल्य में जोड़ देंगे। कब iहै 0, हम मान से 1 घटाएंगे यदि और केवल अगर हम मूल पर नहीं हैं। उत्तरार्द्ध का पता x|yनॉनजेरो की पैदावार से लगाया जाता है , जो बूलियन कुचक्र द्वारा {0, 1} से जुड़ा होता है, और iहमें बिटवाइस का उपयोग करने की अनुमति देता है या तार्किक (बजाय -1कोई शून्य बिट नहीं है, यह संशोधन से सुरक्षित है)।

c

सरणी अंतिम है, इसलिए इसे वापस कर दिया जाएगा।

परिक्षण

† बदलाव

सार्थक रिटर्न वैल्यू को छोड़ कर और केवल इनपुट म्यूटेशन का उपयोग करके हम दो और बाइट्स बचा सकते हैं :

c=>([x,y]=c,i=x>y|x==y&x<0,c[i^x<-y|x==-y]-=-i|!!(x|y))

... या हम इनपुट म्यूटेशन को छोड़ सकते हैं और एक शुद्ध कार्य के लिए छह बाइट्स की कीमत पर सभी चर को स्थानीय बना सकते हैं:

([x,y],i=x>y|x==y&x<0,c=[x,y])=>(c[i^x<-y|x==-y]-=-i|!!(x|y),c)

1

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

(x,y,s=Math.max(x,y,-x,-y))=>(s?x+s?y-s?x-s?x++:y++:x--:y+s?y--:x++:0,[x,y])

1

हास्केल, 53 बाइट्स

0%0=(0,0)
x%y|y>=0-x,y<x=(x,y+1)|(p,q)<-(-y)%x=(q,-p)

दो नंबर लेता है, एक ट्यूपल आउटपुट करता है। यदि बिंदु पूर्व खंड में है -x<=y<x, तो 1 से दूसरे समन्वय को बढ़ाएं। अन्यथा, इनपुट बिंदु 90 डिग्री को घुमाकर, उस पर फ़ंक्शन को कॉल करके, फिर घूर्णन करके, क्वाडंट को चक्रित करें।


1

रैकेट 191 बाइट्स

(cond[(= 0 x y)(list x y)][(= x y)(if(> x 0)(list(sub1 x)y)(list(add1 x)y))][(> x y)(if(>= x(abs y))
(list x(add1 y))(list(add1 x)y))][(< x y)(if(> y(abs x))(list(sub1 x)y)(list x(sub1 y)))])

अनगॉल्फ्ड (किसी भी मध्यवर्ती सूत्र का उपयोग किए बिना कोड में सीधे आंकड़ा दिशाओं का अनुवाद):

(define(f x y)
  (cond
    [(= 0 x y) (list x y)]
    [(= x y)
     (if (> x 0)
         (list (sub1 x) y)   ; left
         (list (add1 x) y))] ; right
    [(> x y)
     (if (>= x (abs y))
         (list x (add1 y))   ; up
         (list (add1 x) y))] ; right
    [(< x y)
     (if (> y (abs x))
         (list (sub1 x) y)   ; left
         (list x (sub1 y)))] ; down
    ))

परिक्षण:

(f 0  0)      
(f 1  0)     
(f 1  1)     
(f 0  1)     
(f -1  1)    
(f -1  0)    
(f -1  -1)   
(f 0  -1)    
(f 1  -1)    
(f 95  -12)  
(f 127  127) 
(f -2  101)  
(f -65  65)  
(f -127  42) 
(f -9  -9)    
(f 126  -127) 
(f 105  -105) 

आउटपुट:

'(0 0)
'(1 1)
'(0 1)
'(-1 1)
'(-1 0)
'(-1 -1)
'(0 -1)
'(1 -1)
'(1 0)
'(95 -11)
'(126 127)
'(-3 101)
'(-65 64)
'(-127 41)
'(-8 -9)
'(127 -127)
'(105 -104)

1

वास्तव में , 16 बाइट्स

यह एक जटिल संख्या को इनपुट के रूप में लेता है और एक अन्य जटिल संख्या को आउटपुट करता है। गोल्फ सुझाव आपका स्वागत है! इसे ऑनलाइन आज़माएं!

;`₧╦@/τuLïⁿ+0`╬X

Ungolfing

         Implicit input z.
;        Duplicate z.
`...`╬   If z is non-zero (any a+bi except 0+0j), run the following function.
           Stack: z, z
  ₧        Get phase(z).
  ╦@/      Divide phase(z) by pi.
  τuL      Push floor(2*phase(z)/pi + 1).
  ïⁿ       Push 1j ** floor(2*phase(z)/pi + 1).
  +        And add it to z. This is our rotated z.
  0        Push 0 to end the function.
X        Discard either the duplicate (0+0j) or the 0 from the end of function.
         Implicit return.

0

स्काला, 184 बाइट्स

val s=math.signum _
(x:Int,y:Int)=>{val m=x.abs max y.abs
if(x.abs==y.abs)if(s(x)==s(y))(x-s(x),y)else(x,y-s(y))else
if(x.abs==m)(x,y+Seq(0,x).indexOf(m))else(x-Seq(0,y).indexOf(m),y)}

Ungolfed:

import math._

(x: Int, y: Int) => {
  val max = max(x.abs, y.abs)
  if (x.abs == y.abs)
    if (signum(x) == signum(y))
      (x - signum(x), y)
    else
      (x, y - signum(y))
  else
    if (x.abs == max)
      (x, y + Seq(0, x).indexOf(max))
    else
      (x - Seq(0, y).indexOf(max), y)
}

स्पष्टीकरण:

val s=math.signum _             //define s as an alias to math.signum
(x:Int,y:Int)=>{                //define an anonymous function
  val m=x.abs max y.abs           //calculate the maximum of the absolute values,
                                  //which is 1 for the innermost circle and so on.
  if(x.abs==y.abs)                //if we have a cell at a corner of a circle
    if(s(x)==s(y))                  //if it's at the top-left or bottom-right, we need to
                                    //modify the x value
      (x-s(x),y)                      //if x is positive (bottom-right),
                                      //we need to return (x+1,y),
                                      //(x-1,y) If it's at the top-left.
                                      //This can be simplified to (x-s(x),y)
    else                            //for top-right and bottom-left, 
      (x,y-s(y))                      //modify y in the same way.
  else                            //we don't have a corner piece
    if(x.abs==m)                    //if we're at the left or right edge of the square
      (x,y+Seq(0,x).indexOf(m))       //if it's a piece from the right edge, add one
                                      //to y, else subtract 1
    else                            //it's a piece from the top or bottm edge
      (x-Seq(0,y).indexOf(m),y)       //subtract 1 from x if it's from the top edge,
                                      //else subtract -1
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.