-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday11b.rb
116 lines (98 loc) · 2.21 KB
/
day11b.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# 11b
# Datenstruktur
# [1337 75 ] x 1001
# Zahl rounds-to-go count
# Beispiel
# 1337 0 0
# [ 1337 75] x 1
# [ 0 75] x 2
class NumRounds
def initialize( number, rounds_to_go)
@number=number
@rounds=rounds_to_go
end
def number
return @number
end
def rounds
return @rounds
end
def eql?(b)
if (@number == b.number) && (@rounds == b.rounds)
return true
end
return false
end
def hash
return (@number+1)*100+@rounds
end
def sortval
- (100000*(@rounds+1) + (100000-@number))
end
end
def prettyhash(h)
h.keys.sort_by { |o| o.sortval}.each do |k|
puts "num=#{k.number}, rounds=#{k.rounds}, cnt=#{h[k]}"
end
end
def iterateGamestate( state)
out=Hash.new
state.keys.sort_by{ |o| o.sortval}.each do |numRoundObject|
cnt=state[numRoundObject]
num=numRoundObject.number
rou=numRoundObject.rounds
if rou == 0
puts "Fertig! #{numRoundObject.inspect}"
end
res_a=iterateNum(num)
res_a.each do |n|
new=NumRounds.new(n,rou-1)
out[new] = 0 unless out.key?( new )
out[new] += cnt
end
end
return out
end
def iterateNum( input) #=> in int out array_of_int
out=Array.new
if input==0
out.push(1)
elsif input.to_s.length%2 == 0
numstr=input.to_s
left_s= numstr [ 0..(numstr.length/2)-1 ]
right_s= numstr [ (numstr.length/2).. ]
out.push(left_s.to_i)
out.push(right_s.to_i)
elsif
out.push( input * 2024 )
end
return out
end
# initiales Setup der Input-Datei
inputtarray=File.read(ARGV[0]).split(/\s+/).map( &:to_i)
puts inputtarray.inspect
gamestate=Hash.new(0)
inputtarray.each do |num|
puts "processing #{num}"
key=NumRounds.new(num, 75)
gamestate[ key ] = 0 unless gamestate.key?( key )
gamestate[ key ] += 1
end
prettyhash( gamestate)
# initiales Setup fertig
puts gamestate.inspect
gs_new=Marshal.load(Marshal.dump(gamestate))
75.times do |i|
puts "After #{i+1} blink:"
gs_new=iterateGamestate( gs_new)
prettyhash( gs_new)
end
#puzzlelösung
sum=0
gs_new.each do |k,v|
sum+=v
end
puts "Puzzlelösung #{sum}"
# Korrekte Lösung: 194782 teil-a
# 11b submission 65601038650482 - to low
# 11b submission 233007586663131 - korrekt