יום 1 - Chronal Calibration

החידה:
https://adventofcode.com/2018/day/1

פיתרון בשפת Ruby חלק ראשון:

puts ARGF.each_line.map(&:to_i).sum

פיתרון בשפת Ruby חלק שני:

# Part 2
require 'set'

changes = ARGF.each_line.map(&:to_i)

sums = Enumerator.new do |y|
  s = 0
  changes.cycle.each do |val|
    s += val
    y << s
  end
end

s = Set.new
puts sums.lazy.detect { |freq| s.add?(freq).nil? }

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

החלטתי לפתור את החידות בשפת Go, זה הפתרון שלי לחידה הראשונה:
https://play.golang.org/p/dyS3lpBZIYP

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

לייק 1

וגם - החידה היא בשני חלקים, יכול להיות שדילגת על החלק השני? או שאני לא ראיתי?

אני בדיוק עובד על זה
כשאסיים אדביק את 2 הפתרונות כטקסט.

כתבתי בJS, הצבתי בX את ההדבקה של הנתון שלהם:

חלק א’:


x = x.split('\n');

var result = 0;


for (let index = 0; index < x.length; index++) {
     
    result += Number(x[index]);
}
console.log(result);

חלק ב:

x = x.split('\n');
var arr = [];
result = 0;
for (let index = 0; !arr[result] && index < x.length; index++) {
    arr[result] = true;
    result += Number(x[index]);
    result += element;
}
for (let index = 0; !arr[result]; index++) {
    arr[result] = true;
    const element = Number(x[index % x.length]);
    result += element;
}
console.log(result);
לייק 1

הי @zeldi272 כן החלק השני הוא מה שקשה כאן :slight_smile:

עדכנתי לך את הקוד כדי שיראה טוב בפורום, כלומר החלפתי את ה HTML בסימן השלושה ` עליו סיפרתי בהודעה קודמת. אפשר ללחוץ ״עריכה״ כדי לראות את זה לקראת ההודעות הבאות.

פתרון לחלק א’: קישור

nums := []int{-10,+18,+5,+1,+1,-19,-13,-4,-4,-5,-17,+13,-3,+18,-17,+14,+11,+14,+16,+6,-2,-3,-3,-5,+18,+17,-9,+14,+13,+3,-17,-3,+11,-4,-5,+3,+9,-20,-18,+10,+1,+1,-14,+9,-5,+20,-6,+1,+2,+2,-13,-11,+18,+18,+1,+2,-11,+23,+2,-7,+2,+7,-3,+6,+9,+8,+13,-8,+12,+7,+4,+9,-11,-19,+1,+13,+15,-14,+10,+19,-6,+1,+7,-14,+3,+17,+2,+2,+15,+15,+18,+6,-9,+8,+15,+12,+15,+5,+8,+1,+6,-13,+18,+10,+10,+7,+14,+4,+9,+17,+10,+6,+7,+9,+5,+1,+1,+19,+10,+18,-5,+10,+7,-6,-10,+17,-12,-15,-17,+5,+7,-11,+18,-12,-12,-3,+10,-4,-5,+13,+10,-1,+7,-12,-11,-9,-18,+3,-1,-15,-7,-15,+4,-7,-4,-7,+19,-3,+14,+9,-11,-7,+16,-10,-3,+10,+13,+10,-7,+13,+11,+17,+7,+4,+20,+19,-1,-5,+10,+7,-9,-14,-3,-15,+5,-19,+13,+9,-12,-6,-13,-15,-2,-15,-3,+11,+22,+19,+18,-6,+10,-9,+10,+19,-15,-2,+20,+12,-20,-8,+23,+15,-11,+10,-2,+8,-4,-19,+16,+16,-6,-22,-2,+9,+13,-19,+8,+16,+18,+21,+17,+26,-19,+16,+8,-14,-1,+8,+9,+2,+6,+4,-7,-2,+1,+14,-3,+17,+6,+19,-14,+10,+13,-17,-10,+11,-14,-13,-13,+11,+19,+18,+1,-12,+14,-17,+8,+11,+1,+15,+13,-12,+14,+2,-8,+9,+9,+2,+14,+7,+14,-1,-11,+13,-11,-3,-18,+7,-19,-1,-14,+4,-11,+12,-6,-19,+6,+15,-10,-9,+24,-9,-1,+14,+8,-5,-5,+12,+16,-14,+3,-6,+12,+11,-18,+9,+17,+10,+11,-19,+13,+9,+4,+15,+8,-21,+5,-12,+4,+13,+13,+6,+1,+6,+4,+6,-14,-6,+17,-4,+10,+13,+17,+3,-5,+19,+6,-16,-8,+21,-19,+4,-15,-5,+7,-11,-19,+18,-2,+10,-17,-8,-8,-10,+7,-19,-6,-11,+19,+5,+9,-11,+16,-13,-17,+5,-18,-1,+12,-9,-18,+25,-3,-8,-15,+9,-19,-5,+18,+5,+3,-1,-12,-12,+8,-21,+3,+1,-32,-8,+2,-3,+27,+12,+38,-17,+42,+27,+10,+5,-1,-1,+10,-17,+11,+18,+2,-19,-11,+18,+7,+23,-5,+21,-20,+2,-6,-20,-7,+16,-8,+41,+15,-3,-18,+16,+3,-2,+16,+8,-1,+3,+17,+21,+6,+19,+8,-14,+8,+4,-1,+10,+7,-9,-20,-9,-60,+40,-14,-19,+38,-52,-13,-203,-31,-15,+1,-9,-12,+17,+10,-9,-5,-21,-5,-6,-11,+19,+10,-11,-16,-37,-22,-13,+5,+19,-14,-7,+13,-8,+26,+16,+19,-7,+28,+16,-2,+18,+27,+13,-150,+5,+22,-6,-22,-14,-136,-91,-7,-14,+31,-278,-73081,+12,+15,-16,+6,-8,-3,+19,-3,+10,+1,+1,+8,+9,+9,-12,+9,-2,+14,+9,-19,+15,+21,+19,+1,+3,+19,-11,+8,+20,-14,+16,+4,+6,-16,-3,-3,-13,-4,+5,+16,-5,-10,+3,-19,-5,+7,-16,-7,+10,+1,+18,+10,-12,-14,-15,-7,+14,+12,+16,+17,+11,+4,+12,+15,-17,+13,-8,+1,-12,-16,-10,-9,-10,+8,-20,+8,-5,-7,-16,+9,-8,-13,-12,-8,+2,+3,+16,-15,+11,+11,+2,-3,-17,-17,-3,-7,-20,+18,-9,+3,-5,-10,-17,+16,-2,-19,-18,-12,-14,-17,-3,+6,+10,+16,+3,+2,-16,-16,-10,-10,+14,-6,-10,+9,+15,+15,+7,-14,-2,+10,-14,-11,-2,+14,+16,+5,+20,+12,-18,+11,+9,+9,-3,-5,+12,+15,+6,-8,+3,+14,+15,-6,-12,-15,+23,-7,+18,-4,+18,+4,+9,+19,-7,+6,+3,-10,+18,-19,-20,-6,+17,-15,+3,+20,-5,-10,-12,-23,+5,-1,-14,-16,-17,-12,+17,-14,+4,-12,+18,+20,-15,-19,-1,-15,+10,-9,+1,+3,-18,+19,-14,-19,+17,-11,-3,-13,+7,+19,-15,+7,-33,-8,+2,+2,-18,-10,+16,-7,+4,-14,+8,+13,-5,+20,-14,+15,-11,-7,-22,-10,+11,+1,+16,-8,+16,-3,+15,+6,-17,+27,+14,+15,+8,+18,+21,-19,-25,+11,+10,+65,-11,-36,-15,-11,-25,+18,+35,+72,+1,+58,+3,+12,+19,-10,+21,+16,+11,+9,+1,+1,+9,-6,+20,-12,-20,+5,+8,-7,+18,+19,-13,-15,-24,+8,-16,+3,+2,-14,-1,-10,-16,-17,+21,+4,+14,-17,+18,-12,+10,+11,+2,-15,-4,-19,+13,+1,-18,-6,-23,-17,+19,+28,+6,+29,+10,+17,-6,+5,-11,+26,+25,-22,+2,-10,-29,+43,+17,+5,+4,+26,+1,+11,+19,-12,+20,+17,-13,+1,+19,+14,-19,-9,+2,+13,+4,-2,+19,+10,-14,+10,-9,+1,+20,+16,+6,-13,+4,+19,+16,-6,-7,-25,-20,+5,+2,-3,-9,-21,-19,+12,-8,-7,+17,-15,-18,-11,+6,+3,+15,-5,-5,-6,-18,-5,+19,-5,+18,-1,+2,-16,-6,-16,+17,-8,+16,+30,+18,+5,-2,+16,+19,-8,+9,-23,+12,+3,+18,+36,+50,-133,+7,+9,-68,+7,+2,-113,-85,-23,-211,-19,-6,-21,-11,-16,+19,+15,-13,-4,+14,+27,-12,-5,-18,-20,-16,-15,-15,-12,+1,+6,+9,-11,+18,+5,-14,-19,-9,+18,+2,-18,-11,+3,+13,-4,-4,+9,-10,-17,-4,+16,+13,+19,-15,+6,-3,+4,+10,+20,+17,-24,-5,+1,+8,+27,+6,+4,+20,+8,-3,+66,-139,-21,+11,-19,+20,-13,-31,+7,-2,+5,-2,+4,-16,+7,+6,-21,-10,-12,+25,-7,-17,-13,+73906}
sum := 0
for _, num := range nums {
    	sum += num
}
fmt.Println("sum:", sum)

פתרון לחלק ב’: קישור


	changes := []int{...}
	sum := 0
	m := make(map[int]bool)
	m[0] = true

	for i := 0; i < len(changes); i++ {
		sum += changes[i]
		if m[sum] == true {
			fmt.Println("sum:", sum)
			return
		}
		m[sum] = true
		if (i == len(changes) - 1) {i = -1};
	}

בלולאות כאלה נהוג לקרוא ל m בשם seen (מפה שמייצגת איזה דברים כבר ראית)

2 לייקים

אני גם משתתף, בימים שיהיה לי זמן :slight_smile: הנה פתרון ליום הראשון בפייתון.

def f(words):
    return sum(int(w) for w in words)


assert f("+1, +1, +1".split(",")) == 3
assert f("+1, +1, -2".split(",")) == 0
assert f("-1, -2, -3".split(",")) == -6

print(f(open("day1.txt").read().split()))


def f2(words):
    total = 0
    seen = {total}
    while True:
        for n in words:
            total += int(n)
            if total in seen:
                return total
            seen.add(total)


assert f2("+1, -1".split(",")) == 0
assert f2("+3, +3, +4, -2, -4".split(",")) == 10
assert f2("-6, +3, +8, +5, -6".split(",")) == 5
assert f2("+7, +7, -2, -7, -4".split(",")) == 14

print(f2(open("day1.txt").read().split()))
לייק 1

אודי אם כבר פייתון לא היה עדיף עם accumulate?

https://docs.python.org/3/library/itertools.html#itertools.accumulate

אני כתבתי את זה ברובי והתבאסתי שאין שם משהו דומה

המממ… חמוד מאוד.
אם תרצה להשתמש ב-accumulate יהיה צריך גם להוסיף את cycle מכיוון שצריך לעבור על הרצף הרבה פעמים וכמובן את map:

from itertools import cycle, accumulate

def f2(words):
    seen = {0}
    for total in accumulate(cycle(map(int, words))):
        if total in seen:
            return total
        seen.add(total)

זה יוצא קצר יותר בשורות. האם זה קריא יותר מה-8 שורות הקצרות שהיו קודם? לא בטוח…

(דרך אגב, ה-cycle שומר בצד עותק של כל האיברים בשביל לחזור עליהם שוב ושוב)

פתרון שלי בפייתון לחלק א:

""" The program calculate the result frequency of the numbers in the file"""

path = r'C:\Python\Advent_of_code\2018\res_freq.txt'
path_1 = r'C:\Python\Advent_of_code\2018\res_freq_1.txt'

with open(path, "r") as f_r:
    p = [int(i) for i in f_r]
    res = sum(p)
    print res
לייק 1

אמיר איזה כיף שבאת עכשיו הזכרת לי שגם אני עצרתי באמצע (באזור יום 12) והגיע הזמן לחזור ולסיים את כל החודש

תיקון קל
עמיר ולא אמיר :slight_smile:

אני לא בטוח שהבנתי מה צריך לעשות בחלק השני…

דמיין שהרשימה שקיבלת ממשיכה לנצח (כלומר אחרי שסיימת לרוץ עליה פעם אחת אתה חוזר להתחלה וממשיך שוב). השאלה היא מתי הפעם הראשונה שהסכום שאתה רואה יופיע פעמיים

הכוונה איזה מספר (= תוצאה) מופיע ראשון פעמיים?
אבל יכול להיות שזה יקרה לפני שאסיים את הרשימה פעם אחת? (או שהקלט של אריק מוכוון לכך שרק אחרי שסיימתי פעם אחת זה יכול לקרות?)

אני לא חושב שזה יקרה לפני שתסיים את הרשימה, אבל כן זה יכול לקרות