मैं रूबी कोड नहीं लिख सकता, लेकिन मुझे यह रूबी कोड AEMO NMI के लिए चेकसम की गणना करने के लिए मिला है

def checksum
  summation = 0
  @nmi.reverse.split(//).each_index do |i|
    value = nmi[nmi.length - i - 1].ord
    value *= 2 if i.even?
    value = value.to_s.split(//).map(&:to_i).reduce(:+)
    summation += value
  end
  checksum = (10 - (summation % 10)) % 10
  checksum
end

क्या कोई कृपया मुझे यह समझाने में मदद कर सकता है कि इस पंक्ति का क्या अर्थ है?

value = value.to_s.split(//).map(&:to_i).reduce(:+)

मैं एक्सेल के लिए उपरोक्त कोड को वीबीए में बदलने की कोशिश करता हूं।

"4103738516" के इनपुट के लिए आपको 8 "4102030716" ==> 2 "क्यूएफएफएफ000एलवी" ==> 7

इस दस्तावेज़ के पृष्ठ 40 में इसकी गणना करने के लिए जावास्क्रिप्ट कोड है लेकिन मैं कोड को नहीं समझ सकता।

https://www.aemo.com.au/-/media/Files/PDF/0610-0008-pdf.pdf

शुक्रिया

0
Harry Duong 23 फरवरी 2017, 04:58

2 जवाब

सबसे बढ़िया उत्तर

नीचे दिए गए कोड से आपको उस कथन को बेहतर ढंग से समझना चाहिए:

# Say
value = 82478923    # any random number
value.to_s          # => "82478923"

# `split(//)` is similar to `split` and `split('')`, they split a string after each character to generate an array of characters.
ary = value.to_s.split(//)      # => ["8", "2", "4", "7", "8", "9", "2", "3"]

ary.map(&:to_i)     # => [8, 2, 4, 7, 8, 9, 2, 3]

# `inject(:+)` will iterate the array and calculate sum of all numbers
ary.map(&:to_i).inject(:+)      # => 43

इंजेक्ट के बारे में यहां और पढ़ें।

1
Jagdeep Singh 23 फरवरी 2017, 09:47

अगर किसी को जरूरत है तो मैं इस रूबी कोड को वीबीए में अनुवादित करता हूं।

उपयोग: कैल्क_चेकसम (एनएमआई)

Function StrReverse(strInput As String) As String

    Dim strRev As String
    Dim i As Integer
    Dim length As Integer


    strRev = ""
    length = Len(strInput)

    For i = 0 To length - 1
        strRev = strRev & Mid(strInput, length - i, 1)
    Next i

    StrReverse = strRev

End Function

Function Calc_Checksum(strNMI As String)

    Dim i As Integer
    Dim j As Integer
    Dim x As Integer
    Dim chrV As Integer
    Dim tmpStr As String

    Dim s As Integer

    s = 0
    ' Reverse strNMI
    strNMI = StrReverse(strNMI)


    'Loop through each char
    For i = 0 To Len(strNMI) - 1


        chrV = Asc(Mid(strNMI, i + 1, 1))
        'debug.Print chrV

        If i Mod 2 = 0 Then
            chrV = chrV * 2
        End If

        tmpStr = CStr(chrV)
        v = 0
        For j = 1 To Len(tmpStr)

            v = v + CInt(Mid(tmpStr, j, 1))

        Next j

        s = s + v

    Next i


    Calc_Checksum = (10 - (s Mod 10)) Mod 10

End Function
0
Harry Duong 27 फरवरी 2017, 09:06