mandag 23. desember 2013 Julekalender
Spenningen er til å ta og føle på! Luke 22 er unnagjort, men det er fortsatt veldig gjevnt i toppen. Her er en fremstilling av hvordan den første timen så ut søndag morgen:
Daniel T Johansen imponerte igjen med raskeste korrekte svar. Magnar overtok ledelsen, mens Stian og Eivind praktisk talt deler andreplassen.
Oppgaven denne gangen er interessant - den virker vanskelig, men i det øyeblikket den er løst virker den ganske enkel. Oppgaven var å avgjøre det minste tallet dbdcaacdbccdadccbdbcbaaaaaaaaa
kunne representere, gitt at hvert ulikt tegn representerer et unikt siffer, at vi ikke vet hvilken radiks det er, og at tallet ikke starter med null.
Her kommer et forsøk på en forklaring på hvordan man bør tenke, skrveet i Ruby.
# Vi begynner med et utenomjordisk nummer.. NUMBER = 'dbdcaacdbccdadccbdbcbaaaaaaaaa'
Hvor mange unike tegn har vi?
# Splitt opp strengen så vi kan jobbe med den.. digits = NUMBER.split '' unique_digits = digits.uniq puts "DIGITS: #{unique_digits}"
Output er DIGITS: ["d", "b", "c", "a"]
# Hvor mange fingre har de utenomjordiske? # Minimum radiks (basert på antall unike siffer) # gir minimum verdi, så det trenger vi å vite.. base = unique_digits.size puts "MINIMUM BASE: #{base}"
Output er MINIMUM BASE: 4
# Laveste siffer (bortsett fra 0) bør komme først # for å lage et minimalt tall... min_sequence = [1, 0] + (2..(base-1)).to_a puts "MINIMUM DIGIT SEQUENCE: #{min_sequence}"
Output er MINIMUM DIGIT SEQUENCE: [1, 0, 2, 3]
# Kombineeerer vi dette med tegnene fra det # utenomjordiske nummeret (i riktig rekkefølge), # får vi den optimale (minimalle) betydningen # avvv tegnene... digit_hash = Hash[unique_digits.zip(min_sequence)] puts "DIGIT REPRESENTATION: #{digit_hash}"
Output er DIGIT REPRESENTATION: {"d"=>1, "b"=>0, "c"=>2, "a"=>3}
# For hvert tegn i tallet (fra høyre), finn verdien # basert på posisjonen, og summer! puts "#{NUMBER} = " + digits. reverse. each_with_index. inject(0) { |memo, (d, i)| puts "#{ NUMBER[(-1*i)..-1].rjust(NUMBER.size) } = #{memo}" if i > 0 memo + digit_hash[d] * base**i }.to_s
Gir output:
a = 3 aa = 15 aaa = 63 aaaa = 255 aaaaa = 1023 aaaaaa = 4095 aaaaaaa = 16383 aaaaaaaa = 65535 aaaaaaaaa = 262143 baaaaaaaaa = 262143 cbaaaaaaaaa = 2359295 bcbaaaaaaaaa = 2359295 dbcbaaaaaaaaa = 19136511 bdbcbaaaaaaaaa = 19136511 cbdbcbaaaaaaaaa = 556007423 ccbdbcbaaaaaaaaa = 2703491071 dccbdbcbaaaaaaaaa = 6998458367 adccbdbcbaaaaaaaaa = 58538065919 dadccbdbcbaaaaaaaaa = 127257542655 cdadccbdbcbaaaaaaaaa = 677013356543 ccdadccbdbcbaaaaaaaaa = 2876036612095 bccdadccbdbcbaaaaaaaaa = 2876036612095 dbccdadccbdbcbaaaaaaaaa = 20468222656511 cdbccdadccbdbcbaaaaaaaaa = 161205711011839 acdbccdadccbdbcbaaaaaaaaa = 1005630641143807 aacdbccdadccbdbcbaaaaaaaaa = 4383330361671679 caacdbccdadccbdbcbaaaaaaaaa = 13390529616412671 dcaacdbccdadccbdbcbaaaaaaaaa = 31404928125894655 bdcaacdbccdadccbdbcbaaaaaaaaa = 31404928125894655 dbdcaacdbccdadccbdbcbaaaaaaaaa = 319635304277606399
Som vanlig er det gøy om andre deler hvordan de løste oppgaven!
PS: Både denne luken og oppgaven i luke 21 er basert på oppgaver fra Google Code Jam – en interessant konkurranse for dem som liker denne typen problemer og programmeringskonkurranser.