2017-01-27 3 views
-2

Ich versuche den Wert von zwei Array-Elementen aus zwei getrennten Arrays vom Ende zum Anfang zu summieren, zu summieren, um zu sehen, ob die Summe größer als 9 istversuchen Arrayelementwerte aus zwei verschiedenen Arrays

Ich habe habe meinen Code getestet und der Teil der nicht funktioniert ist.

if halfa[i] + halfb[i] > 9 

Weiß jemand, wo ich falsch liege? Jede Hilfe würde sehr geschätzt werden.

text = gets.chomp 


    half1 = text.slice(0,10) 
    half2 = text.slice(text.length - 10,text.length) 
    puts half1 
    puts half2 

    halfa = half1.split("") 
    halfb = half2.split("") 

    halfa.map! { |i| i.to_i } 
    halfb.map! { |i| i.to_i } 

    count = 0 

     for i in halfa.length.downto(0) 
      if halfa[i] + halfb[i] > 9 
       count += 1 
      end 
     end 

    print count 
+1

Was bedeutet 'Text' aussehen wie? –

+0

Wie viele Zahlen sollen in jedem Array sein, denn text.slice (0, 10) wird 11 Zeichen geben, nicht 11 Zahlen –

+0

@TravisSmith Sie irren sich. Das zweite Argument zu "String # slice" ist eine Länge, kein Index. https://repl.it/FXp3 –

Antwort

1

for i in halfa.length.downto(0): halfa.length 10 ist, aber Arrays nullbasierte Indizes: Beginnen Sie mit Zählen 0. halfa[10] existiert nicht.

for i in (halfa.length-1).downto(0) wird ergeben - nun, zumindest etwas.

0

Ihre for Schleife bei halfa.length beginnen wird, die 10. ist der höchste Index in in halfa ist 9, so halfa[10] kehrt nil.

Sie könnten es beheben, indem Sie halfa.length zu (halfa.length - 1) ändern, aber Sie hätten immer noch einen sehr unidiomatischen Code. In Ruby ist es selten, for zu sehen, weil es so ziemlich immer eine bessere Alternative gibt. Zum Beispiel:

text = "31415926535897932384" 

half_size = text.size/2 

count = half_size.times.count do |i| 
    text[i].to_i + text[i+half_size].to_i > 9 
end 

puts count 
# => 4 

Der obige Code setzt voraus, dass der Text eine gerade Anzahl von Zeichen hat. Sie könnten auch half_size bis 10 fest codieren, wenn Sie wollten.

Die Integer#times Methode wird die Zahlen 0 durch ihren Empfänger, z. 5.times.to_a gibt [0, 1, 2, 3, 4] zurück. Die Methode Array#count gibt an, wie oft der Block einen Truthy-Wert ergeben hat.

Sehen Sie es auf repl.it: https://repl.it/FXpa

2

Sie haben hier ein Off-by-one Fehler bekam, eine der klassischen Programmierung Fehler, Sie Iterieren beginnen bei i die Länge des Arrays ist, noch halfa[5] ist nil, das Array geht von 0 bis 4.

Das Problem hier ist die Verwendung der klobigen for Loop-Methode zum Iterieren. Rubin, im Gegensatz zu fast allen anderen Sprache scheut, dass für Iteratormethoden mit:

halfa.each_index do |i| 
    if halfa[i] + halfb[i] > 9 
    count += 1 
    end 
end 

, die die meisten wörtliche Übersetzung ist von dem, was Sie haben. Beachten Sie Ihren Code aufzuräumen können sich erheblich, wenn es in einem Rubin wie Notation ausgedrückt ist:

text = "4443466664" 

# Define a variable here that represents the slice size to use 
slice_size = 5 

# Cut this into groups of 5 characters, convert each chunk by remapping 
# the values to integers, then save it all into one variable. 
halves = text.chars.each_slice(slice_size).map { |a| a.map(&:to_i) } 

# The result looks like this: 
# => [[4, 4, 4, 3, 4], [6, 6, 6, 6, 4]] 

# Count all pairs that add up to more than 9 using count with a block 
# that defines when to count them. Note the use of ... which goes up to 
# but does not include the upper bound. 
count = (0...slice_size).count do |i| 
    halves[0][i] + halves[1][i] > 9 
end 

# => 3 
2

Eine Möglichkeit, Ihren Code Refactoring mit Array#zip und Enumerable#count wäre:

text = "123456789098765" 
n  = 10 

digits = text.chars.map(&:to_i) 
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5] 

first = digits.first(n) 
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
last = digits.last(n) 
# [6, 7, 8, 9, 0, 9, 8, 7, 6, 5] 
pairs = first.zip(last) 
# [[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [6, 9], [7, 8], [8, 7], [9, 6], [0, 5]] 

count = pairs.count{ |a, b| a + b > 9 } 
# 6 
Verwandte Themen