געגועים ל ++

02/10/2018

הקוד הבא ב perl מקבל רשימה של מספרים ובכל סיבוב מגדיל אחד מהם באקראי עד שכל המספרים גדולים מאלף (וכן אני יודע שיש לכם אלף רעיונות יותר יעילים לממש את זה. זאת לא הנקודה כאן):

use v5.18;
use List::Util qw/min max/;

my @numbers = <>;
my $rounds = 0;

while (min(@numbers) < 1000) {
  my $idx = int(rand(@numbers));
  $numbers[$idx]++;
  $rounds += 1;
}

say "@numbers";
say "took $rounds rounds";

מסתבר שיש בקוד קסם אחד שדי קשה לתרגם לשפות אחרות. הקוד הבא נראה כמו גירסת רובי של אותו המנגנון:

numbers = ARGF.readlines.map(&:to_i)
rounds = 0

while numbers.min < 1000
  idx = rand(numbers.size)
  numbers[idx]++
  rounds += 1
end

puts "#{numbers}"
puts "took #{rounds} rounds"

נסו להריץ ותגלו שהקוד ב Ruby אף פעם לא מסתיים. זה די ברור כשנזכרים שאין ++ בשפת רובי. אז מה כן קרה שם? הנה הגירסא שיותר קל לקרוא:

numbers = ARGF.readlines.map(&:to_i)
rounds = 0

while numbers.min < 1000
  idx = rand(numbers.size)
  numbers[idx] + (+rounds += 1)
end

puts "#{numbers}"
puts "took #{rounds} rounds"

בהיעדר השמה של ערך חדש למערך כל המספרים נשארים בערכם המקורי בכל האיטרציות ולכן אף פעם לא עוברים את האלף.

אני עדיין אוהב את רובי אין ספק בכלל, אבל הייתי שמח אם היתה יודעת לתת לי פידבק יותר טוב על הטעויות שלי (או יותר טוב אם היתה כוללת את ++).