2016-09-13 18 views
9

कोड गोल्फ के खेल में स्ट्रिंग बहुवचन अनुकूलित करने का प्रयास करते समय मैं इस quirk में आया था। मैं विचार बहुवचन के रूप में तार बारे में और उसके बाद substr का उपयोग अंतिम वर्ण काट था, सशर्त:String.prototype.slice() में, .slice (0, -0) और .slice (0, + 0) एक ही परिणाम आउटपुट चाहिए?

var counter = 1; 
var myText = counter + " units".substr(0, 6-(counter===1)); 

यह ठीक है - यह है कि मैं क्या चाहता था। लेकिन MDN docs for String.prototype.slice() को देखते हुए, मैंने सोचा कि मैं यह भी कम, कार्य करने के लिए दूसरा तर्क के रूप में नकारात्मक शून्य गुजर का उपयोग करके बनाने के लिए एक रास्ता मिल गया था। डॉक्स से:

endSlice

वैकल्पिक। शून्य-आधारित इंडेक्स जिस पर निष्कर्षण समाप्त होता है। यदि स्ट्रिंग के अंत तक छोड़ा जाता है, टुकड़ा() निष्कर्ष निकाला जाता है। नकारात्मक है, तो वह sourceLength + endSlice जहां sourceLength स्ट्रिंग की लंबाई है व्यवहार किया जाता है (उदाहरण के लिए, अगर endSlice -3 है यह sourceLength के रूप में व्यवहार किया जाता है - 3)।

var myText = counter + " units".slice(0,-(counter===1)); 

यह .slice(0,-1) का मूल्यांकन जब counter 1 के बराबर है, जो स्ट्रिंग से अंतिम अक्षर काटना होगा, या यह अन्यथा .slice(0,-0), जो डॉक्स के अनुसार मतलब यह होना चाहिए 0 वर्ण से घटाया गया करने के लिए मूल्यांकन करेगा स्ट्रिंग की लंबाई पर संचालित किया जा रहा है।

ऐसा होता है, -0 String.prototype.slice द्वारा +0 के रूप में ही किया जाता है। मैं अगर यह एक सम्मेलन था, इलाज के लिए -0 (मुझे मालूम है, उदाहरण के लिए, -0 === +0true का मूल्यांकन) +0 रूप में एक ही होने के रूप में सोचा। मैंने String.prototype.substr को देखा, लेकिन उस समारोह में +0 और -0 को उसी तरह संभाला जाना चाहिए।

किसी को भी इस में किसी भी समय आप अधिक जानकारी है? क्या भाषा डिजाइन में कुछ बुनियादी सम्मेलन है जो बताता है कि, शून्य पर हस्ताक्षर किए जाने पर एक भाषा सुविधा है, इसे कुछ परिदृश्यों (जैसे 1/-0) को छोड़कर अनदेखा किया जाना चाहिए?

tl; डॉ मैं नमकीन है कि मैं टुकड़ा करने की क्रिया द्वारा कोड गोल्फ जीतने बारे में मजाक नहीं कर सकता हूँ।

+0

[मानक] (http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.slice) भी कहते हैं, "अगर अंत नकारात्मक है, यह sourceLength + अंत जहां माना जाता है स्रोत लम्बाई स्ट्रिंग की लंबाई है। " मुझे लगता है कि वे यहां "नकारात्मक" शब्द के बारे में पर्याप्त सावधान नहीं थे। – user2357112

+0

आप "नकारात्मक अगर" कैसे कार्यान्वित करेंगे? मेरी कोड में मैं परीक्षण है कि कह 'अगर (वैल <0)', और यह देखते हुए कि '-0 <0' रिटर्न' FALSE' ... यह के रूप में करना चाहिए द्वारा: कल्पना अगर हम के बीच अंतर करना हमारे कोड के सभी लिखना पड़ा '-0' और' + 0' ... – nnnnnn

+1

दूसरा पैरामीटर शून्य के खिलाफ तुलना किए जाने से पहले एक पूर्णांक (ToLimit द्वारा) करने के लिए मजबूर कर रहा है। इंटीग्रर्स का ऋणात्मक शून्य नहीं है। यह ईसीएमए स्पेक में दर्दनाक विस्तार में समझाया गया है (जो सज़ा के लिए केवल वास्तविक गलटन पढ़ेगा)। एमडीएन एक सरलीकृत विवरण है। –

उत्तर

2

एक गणितीय दृष्टिकोण से कोई नकारात्मक शून्य होती है। सकारात्मक शून्य से अधिक संख्या है, और नकारात्मक शून्य से छोटा कोई भी संख्या है। शून्य उनमें से न तो है। तो मुझे लगता है कि आपके द्वारा वर्णित व्यवहार सही है।

वास्तविक संख्या या तो तर्कसंगत या तर्कहीन हो सकती है; या तो बीजगणित या अनुवांशिक; और या तो सकारात्मक, नकारात्मक, या शून्य।

https://en.wikipedia.org/wiki/Real_number

हालांकि, क्योंकि प्रोग्रामिंग हम चल बिन्दु संख्या है, जो वास्तविक संख्या का अनुमान कर रहे हैं के साथ काम में, वहाँ -0 की एक अवधारणा है, जो एक नकारात्मक संख्या बहुत करीब का प्रतिनिधित्व हो सकता है शून्य करने के लिए अन्यथा प्रतिनिधित्व करने वाला - http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/


अपने जावास्क्रिप्ट के बारे में, आप के रूप में यह लिख सकते हैं:

var counter = 1; 
var myText = counter + " unit" + (counter > 1 ? "s" : ""); 
+0

ठीक है, "पहले" नहीं, फ्लोटिंग पॉइंट नंबर आईईईई 754 हैं। यह सुनिश्चित नहीं है कि मानक स्वयं ही किसी भी अर्थशास्त्र (जैसे कि "नकारात्मक संख्या शून्य के करीब शून्य के करीब है") को '-0' मान में रखता है, लेकिन मुझे शायद ही इसमें संदेह है। – zerkms

+0

@zerkms - मुझे नहीं लगता कि यह परिभाषा की बात है, बल्कि एक शारीरिक सीमा, संख्या के लिए मजबूर कर कुछ बिंदु पर पूर्ण होना है। वैसे भी, मैं इस विषय पर एक विशेषज्ञ नहीं हूं, और कभी भी इस समस्या को पार नहीं किया है। हालांकि मैं यह इंगित करता हूं कि अवधारणा प्रोग्रामिंग में मौजूद है, भले ही यह गणितीय रूप से प्रासंगिक न हो। अधिक जानकारी के साथ कृपया उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें (या एक नया जोड़ें)। –

+0

उत्तर ठीक है, केवल एक चीज के साथ: यह कुछ अतिरिक्त बिंदु रखता है कि "जो शून्य के बहुत करीब ऋणात्मक संख्या का प्रतिनिधित्व हो सकता है"। जो मुझे सही नहीं लगता है: आप वास्तव में '-0' हो सकते हैं और इसका मतलब यह हो सकता है, ताकि यह अनुमानित या गोल करने वाली त्रुटि न हो। मैं उस हिस्से को बिल्कुल हटा दूंगा। – zerkms

संबंधित मुद्दे