फ्लोटिंग पॉइंट XOR


16

आपका कार्य बहुत सरल है। दो फ़्लोट्स को देखते हुए, बिटवाइज़ x बाइनरी प्रतिनिधित्व करते हैं, और एक फ्लोट के रूप में आउटपुट करते हैं।

उदाहरण के लिए,

Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110

Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000

Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101

प्रतिबंध / स्पष्टीकरण:

  • इनपुट / आउटपुट किसी भी सुविधाजनक विधि द्वारा दिया जा सकता है ।
  • कार्यक्रम एक पूर्ण कार्यक्रम या सिर्फ एक समारोह हो सकता है; कुछ भी चलेगा।
  • फ्लोट प्रकार किसी भी आकार का हो सकता है, लेकिन न्यूनतम आकार 2 बाइट्स है।
  • मानक खामियों को मना किया जाता है।
  • सबसे छोटा कोड जीतता है।

2
क्या बूलियन सूची को एक सुविधाजनक विधि के रूप में गिना जाता है?
आदम

23
एक फ्लोट का "बाइनरी प्रतिनिधित्व" बेहद अस्पष्ट है। आपको यह परिभाषित करने की आवश्यकता होगी कि आप किस प्रतिनिधित्व का उपयोग कर रहे हैं। इस ग्रह पर पहले से ही जीवन द्वारा उपयोग किए जाने वाले परिमित संख्या सहित, निरूपण की एक अनंत संख्या है, कुछ दूसरों की तुलना में अधिक लोकप्रिय हैं, जैसे कि IEEE 754
उलट गए इंजीनियर

7
यह प्रश्न "xor द रिप्रेजेंटेशन" की बजाय "xor the values " के रूप में अधिक दिलचस्प होगा । उत्तरार्द्ध निश्चित रूप से किसी भी भाषा में "xor दो 32-बिट पूर्णांक" के समान है, जिसमें एक प्रकार की प्रणाली का अभाव है या प्रकार की चकाचौंध को स्वीकार करता है, और इस प्रकार बहुत उबाऊ है ...
R .. GitHub STOP HELPING ICE

5
क्या हमें इनपुट या आउटपुट के रूप में इन्फिनिटी, सबऑर्मल या नकारात्मक 0 को संभालना है?
ग्रैमी

3
@ मर्क: नहीं, जैसा कि प्रश्न लिखा गया है कि उनके प्रतिनिधित्व केवल xor'ing के बारे में हैं, जो भी वे प्रतिनिधित्व हैं। परिणाम फ्लोटिंग पॉइंट फॉर्मेट पर निर्भर करता है, लेकिन एल्गोरिथ्म हमेशा प्रतिनिधित्व पर एक एकल xor निर्देश है, जो बहुत उबाऊ है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

जवाबों:


53

x86-64 मशीन कोड, 4 बाइट्स

0f 57 c1 c3

विधानसभा में:

xorps xmm0, xmm1
ret

यह एक कॉल करने योग्य फ़ंक्शन है जो दो फ्लोट्स या डबल्स को तर्क (में ) के रूप में लेता है xmm0और xmm1एक फ्लोट या डबल (इन xmm0) रिटर्न करता है ।

जो विंडोज x64 और x86-64 SysV ABI दोनों के कॉलिंग कन्वेंशन से मेल खाता है , और फ्लोट के साथ-साथ डबल्स के लिए भी काम करता है। (वे एक्सएमएम रजिस्टरों के कम 4 या 8 बाइट्स में पास / लौटे हैं)।


12

सी ++ (जीसीसी) , 74 32 बाइट्स

#define f(x,y)*(int*)x^=*(int*)y

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

मैंने पहले C ++ में गोल्फ नहीं किया है इसलिए मैं उन सभी का आभारी हूं जिन्होंने कोड के आकार को आधा करने में मदद की! एक मैक्रो जो दो तर्कों को अपने तर्कों के रूप में लेती है और परिणाम को वापस करने के लिए पहले संशोधित करती है।

2 बाइट्स बचाने के लिए @ 12M11 और 4 बचाने के लिए @Arnauld का धन्यवाद! एक और 14 को बचाने के लिए @ निशिओका का शुक्रिया, एक और 6 @ @ नील और एक दूसरे का @ निशिओका! 5 बाइट बचाने के लिए @PeterCordes को धन्यवाद!


1
आप 2 वर्णों को सहेजने के लिए लाइनब्रेक को हटा सकते हैं, और यह C
12Me21

1
आप के साथ 4 और बाइट्स बचा सकते हैं z=*(int*)x^*(int*)y;
अरनुलद

1
जीसीसी एक्सटेंशन के साथ, 54 बाइट्स:#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
निशिओका

2
चूंकि आप पॉइंटर्स का उपयोग कर रहे हैं, क्या आउटपुट में से किसी एक इनपुट का उपयोग करना कानूनी है? यदि हां, तो आप लिख सकते हैं (*(int*)x^=*(int*)y)
नील

1
@ नील के सुझाव को ध्यान में रखते हुए, यह 48 बाइट्स को प्राप्त होगा:#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
निशीओका

9

एआरएम अंगूठा मशीन कोड, 6 4 बाइट्स

४ 47 ४० 70० ४ 70

विधानसभा में:

Eors R0, R1; अनन्य या पहले दो पारमों के लिए, रिटर्न रजिस्टर में स्टोर परिणाम
बीएक्स एलआर; लिंक रजिस्टर (रिटर्न पता) में संग्रहीत मूल्य पर शाखा

मानक आर्म कॉलिंग कन्वेंशन के तहत, रजिस्टरों R0 और R1 में पहले दो मापदंडों को पारित किया जाता है, परिणाम R0 में वापस किए जाते हैं, और LR रिटर्न पता रखता है। मान लें कि आप 32 फ़्लोट वाले सॉफ्ट फ़्लोट एबीआई का उपयोग कर रहे हैं, यह 4 बाइट्स में वांछित ऑपरेशन करेगा।

कोडी ग्रे के लिए -2 बाइट्स धन्यवाद


2
EORS r0, r12 बाइट्स बचाने के लिए क्या इसके बजाय उपयोग करना संभव होगा ? 48 40आपके 4-बाइट की तुलना में यह केवल 2-बाइट अनुदेश ( ) है EOR। आप पहले से ही थम्ब को लक्षित कर रहे हैं, इसलिए इसे ठीक काम करना चाहिए, जहाँ तक मैं देख सकता हूँ। एकमात्र अंतर यह है कि यह स्टेटस फ्लैग अपडेट करता है, लेकिन आप इस मामले में उस साइड इफेक्ट की परवाह नहीं करते हैं।
कोडी ग्रे

2
आपको यह निर्दिष्ट करना चाहिए कि यह सॉफ्ट-फ्लोट एबीआई का उपयोग कर रहा है जो पूर्णांक रजिस्टरों में एफपी आर्ग पास करता है, न कि वीएफपी / नीयन s0और s1
पीटर कॉर्ड्स

6

पायथन 3 + सुन्न, 75 59 बाइट्स

lambda x,y:(x.view("i")^y.view("i")).view("f")
import numpy

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

एक लैम्ब्डा को परिभाषित करता है जो अपने तर्कों के रूप में दो संख्यात्मक फ़्लोट 32 सरणियों को लेता है और एक ख़स्ता फ़्लोट 32 सरणी देता है।

14 बाइट बचाने के लिए @ShadowRanger को धन्यवाद, और जोएल को आगे 2!

यदि आयात को गिराया जा सकता है (क्योंकि मेरा मेमना स्वयं किसी आधार संख्या वाले कार्यों के बजाय संख्यात्मक वस्तुओं पर विधियों को कॉल करता है), तो मैं एक और 13 बाइट्स बचा सकता था। मैं कोड गोल्फ मानक नियमों से इस पर अनिश्चित हूं।


यह जेली और रूबी के जवाबों से कम है। अच्छा!
एरिक डुमिनील

आप पूरी तरह से आयात को हटाकर 27 बाइट्स (इसे 48 बाइट्स पर छोड़ना) से दाढ़ी कर सकते हैं (बस यह मान लें कि आपने जो पास किया है numpy.float32ताकि आप उनके तरीकों का उपयोग कर सकें) और दोनों int32उपयोगों की जगह 'i'और float32उपयोग के साथ बदल दें 'f'; dtypeपैरामीटर एक स्ट्रिंग जो वास्तविक में परिवर्तित हो जाता हो सकता है dtypeआप के लिए, और आसानी से, 'i'और 'f'उन dtypes है, जो आयात करने के लिए समारोह के लिए की जरूरत को हटा बनाने के लिए कानूनी तरीके हैं numpyसब पर अपनी नेम स्पेस में सामान। यकीन नहीं है कि यह आयात को हटाने के लिए कोड गोल्फ कानूनी है, लेकिन अभी भी numpyइनपुट
मानें


मुझे लगा कि आयात को शामिल करना होगा, लेकिन मुझे यकीन नहीं है। टिप के लिए धन्यवाद फिर से dtypes!
निक केनेडी

@NickKennedy: हाँ, अगर आयात के लिए आवश्यक है, यह केवल 8 बाइट (से दोनों एक बचाता है int32करने के लिए 'i', चार से float32करने के लिए 'f'), लेकिन है कि अभी भी कुछ है। यदि आयात की सख्त आवश्यकता है, तो आप इसे import numpyपैकेज से प्राप्त करने के लिए बदल सकते हैं, इसके from numpy import*नाम को निकालने के लिए उपयोग किए बिना । आपको कुल छह बाइट्स मिलेंगे, कुल 61 बाइट्स।
शैडो रेंजर

6

जेली + सुन्न, 89 77 बाइट्स

“(F(“I^F(“IvF).item()”;"F“¢lẒṾ:/²)Ɓɱ¡vẠ⁷5Rʠ¡7ɼṆṪ{ė4¶Gẉn`¡Ð}ṫȥṄo{b»Ḳ¤¹ṣḢ}jʋƒŒV

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

पाइथन 3 कोड की तुलना में लंबे समय तक रहने का संदिग्ध सम्मान है जो इसे पुन: पेश करता है, मोटे तौर पर / के लिए संख्यात्मक ऑब्जेक्ट से परिवर्तित करने की आवश्यकता के कारण और तथ्य यह है कि जेली द्वारा सुपी को लोड नहीं किया गया है ताकि __import__()अंतर्निहित उपयोग किया जा सके।

एक मोनडिक लिंक दो नावों को एक सूची के रूप में अपने तर्क के रूप में ले रहा है और एक फ्लोट वापस कर रहा है।

निम्नलिखित पायथन 3 कोड का मूल्यांकन करता है:

(__import__('numpy').float32(x).view("i")^__import__('numpy').float32(y).view("i")).view(__import__('numpy').float32).item()

कहाँ xऔर yइनपुट के साथ प्रतिस्थापित कर रहे हैं।


5

एपीएल (Dyalog यूनिकोड) , 14 बाइट्स SBCS

पूरा कार्यक्रम। स्टड से दो IEEE 754 64-बिट फ्लोटिंग-पॉइंट नंबर (बाइनरी 64) के 1-कॉलम मैट्रिक्स के लिए संकेत। ऐसे एक नंबर को प्रिंट करने के लिए प्रिंट करता है।

645DR≠⌿11DR

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

 प्रॉम्प्ट (जो गैर-फ़्लोट्स में ढह जाते हैं, उन्हें फ़ंक्शन के साथ फ़्लोट में मजबूर किया जा सकता है ⊃⊢⎕DR⍨645,⍨⎕DR)

11⎕DR 1-बिट बाइनरी में परिवर्तित करें (1) डीआर आर इलिकेशन (2-पंक्ति, 64-कॉलम मैट्रिक्स)

≠⌿ ऊर्ध्वाधर XOR कमी

645⎕DR 64-बिट फ्लोट में परिवर्तित करें (5) डी एट आर इग्ज़ेनेशन (सिंगल नंबर)


4

वैक्स बेसिक (बाद में वीएमएस बेसिक, फिर कॉम्पैक बेसिक) , 11 बाइट्स

H = F XOR G

मुझे थोड़ा मूर्खतापूर्ण लगता है, जाहिर है, पुरानी भाषाएं बेहतर करेंगी क्योंकि उन्हें मजबूत-टाइपिंग मुद्दों की चिंता नहीं थी।


1
साइट पर आपका स्वागत है और अच्छा पहला उत्तर! मैंने संपादित किया है जो एक बाहरी हेडर प्रतीत होता है, लेकिन अगर इसे वापस संपादित करने के लिए स्वतंत्र महसूस नहीं होता है, साथ में किसी भी जानकारी के साथ
caird coinheringaahing

3

ऑक्टेव , 59 बाइट्स

@(a,b)(t=@typecast)(bitxor(t(a,u='int32'),t(b,u)),'single')

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

टाइपकास्ट अंतर्निहित बिट्स को बदलने के बिना कास्टिंग का MATLAB / ऑक्टेव तरीका है। यह आवश्यक है क्योंकि bitxorकेवल पूर्णांक पर काम करता है। पता नहीं क्यों उन्होंने फ़्लोटिंग पॉइंट नंबर को कभी लागू नहीं किया, भले ही आप स्पष्ट AssumedTypeरूप से तीसरे तर्क के रूप में निर्दिष्ट कर सकते हैं bitxor। मुझे लगता है कि केवल उपयोग मनोरंजक प्रोग्रामिंग है।


एफपी बिट पैटर्न पर बिटवाइज़ सामान साइन बिट के साथ चीजों को करने के लिए विधानसभा भाषा में उपयोगी है, या exp()कार्यान्वयन के हिस्से के रूप में शायद ही कभी एक पूर्णांक को प्रतिपादक क्षेत्र में सामान करने के लिए। लेकिन मुझे लगता है कि ऑक्टेव में पहले से ही नकल / निषेध के लिए कार्य / ऑपरेटर हैं। और वे माइक्रो-ऑप्टिमाइज़ेशन के बारे में परवाह नहीं करते हैं जैसे कि (और एक स्थिर मुखौटा के साथ) फिर XOR दूसरे के संकेत के आधार पर सशर्त रूप से एक मान का चिह्न फ्लिप करने के लिए। Asm में एक वास्तविक अनुकूलन परियोजना (वास्तव में AVX इंट्रिंसिक्स के साथ C) में मैंने XOR का उपयोग किया है, फिर शून्य के खिलाफ सीएमपी से बचने के लिए साइन बिट को देख रहा हूं।
पीटर कॉर्ड्स

2

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 92 बाइट्स

x=>BitConverter.Int32BitsToSingle(x.Aggregate(0,(a,b)=>a^BitConverter.SingleToInt32Bits(b)))

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


1
आप इसके लिए असुरक्षित कोड का उपयोग कर सकते हैं , हालांकि मुझे यकीन नहीं है कि "असुरक्षित" कीवर्ड को बायटेकाउंट को प्रभावित करना चाहिए या नहीं।
नकारात्मक सात



2

सी, 23 बाइट्स

f(int*x,int*y){*x^=*y;}

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

यह थोड़ा चमकदार हो सकता है; यह संकेत करने के लिए संकेत के floatरूप में एस को इंगित करता है int

हालांकि, यह काम करता है (यह सब के बाद सी है)।

यह वेरिएबल के लिए एक पॉइंटर लेकर स्वीकार्य इनपुट का फायदा उठाता है और इसे इन-प्लेस संशोधित करता है। नहीं (उपयोग करने योग्य) मान लौटाया जाता है।


2

जावास्क्रिप्ट (Node.js) ,  105  101 बाइट्स

@Neil द्वारा सुझाए गए Shorter Node संस्करण ने @ShieruAsakoto को
4 और बाइट्स दिए

के रूप में इनपुट लेता है (x)(y)

x=>y=>(v=Buffer(4),v.writeInt32LE((g=n=>v.writeFloatLE(n)&&v.readInt32LE())(x)^g(y)),v.readFloatLE())

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


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

2 फ़्लोट्स की एक सरणी के रूप में इनपुट लेता है।

a=>(v=new DataView(new ArrayBuffer(4))).getFloat32(v.setUint32([x,y]=a.map(n=>v.getUint32(v.setFloat32(0,n))),x^y))

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


FYI करें नोड के Bufferकुछ बाइट्स बचाता है a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE()):।
नील

@ नील धन्यवाद! (बजाय एक समारोह का उपयोग करके 2 और बाइट्स को बचाया map)
अरनुल्द

1
गिराने newमें new Buffer(4)भी iirc काम करना चाहिए
Shieru Asakoto

1

वोल्फ्राम मैथेमेटिका , 50 बाइट्स

BitXor@@(FromDigits[RealDigits[#,2,32,0][[1]],2]&)

हालाँकि मुझे दृढ़ता से संदेह है कि यह अधिक गोल्फ हो सकता है, RealDigitsसही परिणाम प्राप्त करने के लिए फ़ंक्शन में दो अतिरिक्त तर्क आवश्यक प्रतीत होते हैं।

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


1

लूआ , 73 बाइट्स

a,b=('II'):unpack(('ff'):pack(...))print((('f'):unpack(('I'):pack(a~b))))

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

यह कोड 4-बाइट्स को अहस्ताक्षरित पूर्णांक और फ़्लोट करता है जो कि कॉन्फ़िगरेशन पर है tio.run। तर्कों के रूप में इनपुट के साथ पूर्ण कार्यक्रम के रूप में चलाएं।


1

रूबी , 78 67 बाइट्स

-11 बाइट्स @grawity की बदौलत।

->x{[x.pack("gg").unpack("NN").inject(&:^)].pack(?N).unpack(?g)[0]}

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

इनपुट दो फ़्लोट्स की एक सरणी है।


x.map{|v|[v].pack(?g).unpack(?N)[0]}x.pack("gg").unpack("NN")
user1686

@ गौरव: बहुत बढ़िया, बहुत बहुत धन्यवाद! कोड हालांकि पाइथन की तुलना में अब भी लंबा है। : - /
एरिक डुमिनील

1

जावा (JDK) , 109 76 बाइट्स

(a,b)->Float.intBitsToFloat(Float.floatToIntBits(a)^Float.floatToIntBits(b))

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

कुछ समय के बाद से मैं जावा में गोल्फ रहा हूँ और मुझे निश्चित नहीं है कि मुझे बाइट काउंट के हिस्से के रूप में एलएचएस पर घोषणा की आवश्यकता है? यदि यह DoubleBinaryOperator का उपयोग करता है तो LHS कम होगा, लेकिन RHS को Double.doubleToLongBits और Double.longBitsToDouble का उपयोग करना होगा, इसलिए यह वास्तव में लंबा है।

बाइट काउंट पर पर्याप्त बचत के लिए नील को धन्यवाद!


1
IIRC आपको बाइट काउंट के हिस्से के रूप में असाइनमेंट की भी आवश्यकता नहीं है, केवल किसी भी परीक्षण सूट के हिस्से के रूप में जिसे आप अपने ऑनलाइन प्रयास में शामिल कर सकते हैं! हैडर।
नील

@ नील धन्यवाद! इससे बहुत फ़र्क पड़ता है!
डेविड कॉनरैड

0

साफ , 36 बाइट्स

f::!Real!Real->Real
f _ _=code{xor%}

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

शुक्र है कि प्रकार Realऔर Intप्रकार 64-बिट प्लेटफार्मों पर समान आकार के होते हैं ...
दुर्भाग्य से एक पूर्ण हस्ताक्षर की आवश्यकता होती है अन्यथा ग्राफ एक प्रेट्ज़ेल और सब कुछ सेग्मुल्स में बदल जाता है।

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