Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  64 17481
Tenkte vi kunne ha en tråd for å dele forskjellige julekalendere av det nerdete slaget, og poste løsningene våre i forskjellige programmeringsspråk.

Advent of Code
Advent of Code is a series of small programming puzzles for a variety of skill levels. They are self-contained and are just as appropriate for an expert who wants to stay sharp as they are for a beginner who is just learning to code. Each puzzle calls upon different skills and has two parts that build on a theme.
Vis hele sitatet...
Advent of Code har ofte gøye og originale oppgaver, og anbefales på det sterkeste.


Knowit Julekalender
Hver dag frem til jul åpner det seg en ny luke i kalenderen. Bak hver av disse lukene skjuler det seg en julenøtt som må løses ved hjelp av programmering. Oppgavene er av varierende vanskelighetsgrad, og vi håper med dette å utfordre både deg som er en fersk utvikler og deg som alt har gjort dette i mange år. Du står fritt til å velge både fremgangsmåte og teknologi til å løse problemet. Felles for hver oppgave er at koden til løsningen din skal resultere i et svar på en linje som applikasjonen kan sjekke om er korrekt.
Hver luke du løser teller som et lodd i trekningen av en valgfri smarttelefon (innenfor visse rammer). Jo flere luker du løser, desto flere lodd og dermed større vinnersjanser.
Nye luker åpnes klokken 06:00 hver dag, og du har 24 timer på deg på å løse oppgaven. Etter at denne fristen er passert vil svaret på oppgaven bli synlig for alle, og det er dermed ikke lenger mulig å svare på luken. Om du har lyst kan du jo forsøke å kode deg fram til riktig løsning allikevel. Programmering er jo tross alt kjempegøy!
Vis hele sitatet...
Knowit kalenderen er litt mer standard, Project Euler-inspirert.

Oops! Siden Knowit-kalenderen har premier, vent til neste dag med å dele løsninger!
Knowit-luke 1 var ok, men Advent of Code tok det lengre tid før jeg klarte.

Jeg valgte å løse oppgavene så langt i Javascript.
Sist endret av Yochi; 2. desember 2016 kl. 00:26.
55535 HP
Ozma's Avatar
Trådstarter
Her er min løsning for dag 2, i Go. Den ble rimelig elegant synes jeg.

Kode

package main

import (
	"fmt"
	"io/ioutil"
	"strings"
)

var Pad = [][]rune{
	[]rune{' ', ' ', '1', ' ', ' '},
	[]rune{' ', '2', '3', '4', ' '},
	[]rune{'5', '6', '7', '8', '9'},
	[]rune{' ', 'A', 'B', 'C', ' '},
	[]rune{' ', ' ', 'D', ' ', ' '},
}

const numRows int = 5
const numCols int = 5

type State struct {
	m int
	n int
}

func (s State) Move(direction rune) State {
	var next State
	switch direction {
	case 'R':
		next = State{s.m, Clamp(s.n+1, 0, numCols-1)}
	case 'U':
		next = State{Clamp(s.m-1, 0, numRows-1), s.n}
	case 'L':
		next = State{s.m, Clamp(s.n-1, 0, numCols-1)}
	case 'D':
		next = State{Clamp(s.m+1, 0, numRows-1), s.n}
	default:
		panic("No such direction")
	}
	if next.GetRune() == ' ' {
		return s
	} else {
		return next
	}
}

func (s State) GetRune() rune {
	return Pad[s.m][s.n]
}

func main() {
	s := State{2, 0}
	code := make([]rune, 0)
	buf, _ := ioutil.ReadFile("input1.txt")
	for _, line := range strings.Split(strings.TrimSpace(string(buf)), "\n") {
		for _, direction := range line {
			s = s.Move(direction)
		}
		code = append(code, s.GetRune())
	}
	fmt.Println("The code is: ", string(code))
}

func Clamp(n, lo, hi int) int {
	if n <= lo {
		return lo
	} else if n >= hi {
		return hi
	} else {
		return n
	}
}
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Skrev en løsning på knowits #2 på 1.3µs i gjennomsnitt over 10k iterasjoner. Neat, men jeg mistenker jo at caching tar mye av æren.
Første implementasjon for luke 2.

Kode

#include <iostream>
#include <chrono>
#include <cmath>
int main()
{
	auto begin = std::chrono::high_resolution_clock::now();
	
	double i, sum, fib, run;
	for (run = 0; run < 5e6; run++)
	{
		for (i = sum = fib = 0; fib < 13e8; sum += ((int)fib & 1) ? fib : 0, (fib = floor(pow((1 + sqrt(5)) / 2, i++) / sqrt(5) + 0.5)));
	}

	auto end = std::chrono::high_resolution_clock::now();
	auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
	std::cout << "+ " << sum << std::endl;
	std::cout << (i*run) << " iterations run in " << (double)duration << "ns total, average : " << duration / (i*run) << "ns." << std::endl;

	return 0;
}

Kode

+ 1.48561e+09
2.35e+08 iterations run in 8.17514e+09ns total, average : 34.7878ns.
Sist endret av m0b; 3. desember 2016 kl. 04:23.
Luke 2, knowit i pytån.

Kode

import time


def main():
	max = 2000000000
	high = 1
	low = 1
	holder = 0
	sum = 0
	while(high < max):
		holder = high
		high += low
		low = holder
		if (high%2 == 0):
			sum += high
	return (sum)

if __name__ == "__main__":
	iterations = 1000000
	totaltime = 0
	print(main())
	for i in range (iterations):
		t0 = time.time()
		main()
		t1 = time.time()
		totaltime += t1-t0
	print (totaltime/iterations)

Kode

1485607536
9.918314456939697e-06
siden m0b begynner å skravle på irc så her er mine 4 minutter med python-tukling for knowits luke 2. Takk til myoxo for trikset med å utnytte at hvert tredje tall i rekken nødvendigvis må være et partall

Kode

def f(a, b, max):
    while a < max:
        yield a
        a, b = b, a + b
print sum([n for n in f(0, 1, 4000000000)][::3])
Her er min løsning i Javascript på AdventOfCode luke 3:

Kode

var fs = require('fs');

var triangles = fs.readFileSync('./input-triangles.txt', 'UTF-8');
triangles = triangles.split(""); // Splittet på linebreak her, men fikk problem med fremvisning på freak.no.


var possibles = 0;
var possibles2 = 0;

var i = 1;
var cols = [];

triangles.forEach(function(line) {
  line = line.replace(/^-/, '');
  
  var a = parseInt(line.substr(0, 3).trimLeft());
  var b = parseInt(line.substr(5, 3).trimLeft());
  var c = parseInt(line.substr(10, 3).trimLeft());
  
  if ((a + b > c) && (a + c > b) && (b + c > a)) {
    possibles = possibles + 1;
  }

  if (i < 3) {
    cols.push([a, b, c]);
    i++;
  }
  else if (i == 3){
    cols.push([a, b, c]);
    for (var k = 0; k < 3; k++) {

      var aa = parseInt(cols[0][k]);
      var bb = parseInt(cols[1][k]);
      var cc = parseInt(cols[2][k]);
      if ((aa + bb > cc) && (aa + cc > bb) && (bb + cc > aa)) {
        possibles2 = possibles2 + 1;
      }
    }
    cols = [];
    i = 1;
  }
});

console.log(possibles);
console.log(possibles2);
Etter påpekningen av det egentlig litt innlysende, fra myoxo og liasis har jeg oppdatert og rensket ut en variabel, samt nå unødvendig eveness bitsjekk.

Kode

for (i = fib = 0; fib < 13e8; (fib += floor(pow((1 + sqrt(5)) / 2, i+=3) / sqrt(5) + 0.5)));

Kode

+ 1.48561e+09
4.5e+08 iterations run in 5.47384e+09ns total, average : 12.1641ns.
Edit: Never mind that. Det ble samme kjøretid likevel. Jeg tok ikke hensyn til i+=3.
Sist endret av m0b; 3. desember 2016 kl. 23:00.
3. desember i Advent of Code. Dunka til med et script fra det elskverdige programmet MATLAB:

Kode

x = load('input.txt',' r ' );
cnt=0;
for i =1:length(x)
    j = sort(x(i,:));
    if j(1) + j(2) > j(3)
        cnt = cnt +1;
    end
end
fprintf(cnt)
Sist endret av cumfistsaksen; 3. desember 2016 kl. 23:39.
Sitat av Xasma Vis innlegg
Luke 2, knowit i pytån.
Vis hele sitatet...
Man kan ha det travelt i julestria,så PyPå

Kode

C:\pypy5.4
λ python Xasma_luke2.py
1485607536
1.1983016967773437e-05
--------------------
Code time 12.39 seconds

C:\pypy5.4
λ pypy Xasma_luke2.py
1485607536
4.82002496719e-07
--------------------
Code time 0.67 seconds

Advent of Code 3 Python:

Kode

sides =[list(map(int, line.split())) for line in open("input.txt")]
print([sum(i) > 2 * max(i) for i in sides].count(True))
Jula smyger seg innpå, her er luke 3b)

Kode

x = load('input3.txt',' r ');
cnt=0;
x = reshape(x,length(x)*3,1);
for i = 1:3:length(x)
    j = sort(x(i:i+2));
    if j(1) + j(2) > j(3)
        cnt = cnt +1;
    end

end
fprintf('%d', cnt);
Den fjerde luka fra AoC.
Ganske morsom å original oppgave, gleder meg til i morgen.

Kode

import re
import collections

def getSectorID( string ):
    return int(re.findall(r'\d+', string)[0])

def getCheckSum(string):
    return string[string.find('[')+1:string.find(']')]

def getRoomName(string):
    return string[0:-10].replace('-','')

    
def getFrequencyList(string):
    roomName = getRoomName(string)
    letters = collections.Counter(roomName)
    lst = letters.most_common()
    lst.sort(key=lambda j: j[0]) #sort on character
    lst.sort(key=lambda k: k[1], reverse=True) #sort on frequency
    checkSum=''
    for i in range(0,5):
        checkSum += lst[i][0]

    return checkSum 

if __name__ == '__main__':

# Part 1
    notcaloy = []
    sectorIDSum = 0
    with open("input4.txt") as f:
        input4 = f.read().strip()
    input4 = input4.split('\n')
    sectorIDSum = 0

    for line in input4:
        if getCheckSum(line) == getFrequencyList(line):
            notcaloy.append(line)
            sectorIDSum += getSectorID(line)
    f.close()
    print sectorIDSum

# Part 2

    for line in notcaloy:
        reminder  = getSectorID(line)%26
        dechipher = []
        for e in line:
            c = chr((ord(e) + reminder -97)%26 + 97)
            dechipher.append(c)
        spaceSign = dechipher[-4]
        for j in range(-1,-4,-1):
            dechipher[j] = str(getSectorID(line))[j]
        c = ''.join(dechipher)# .replace(spaceSign,' ')
        pattern = 'north'
        if c.find(pattern) > -1:
            print c
            break
Sist endret av cumfistsaksen; 4. desember 2016 kl. 22:49. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Artige oppgaver i Advent of Code.
Min for Advent of Code 5.

Kode

import hashlib

def hash_find():
    hash_lst = []
    i = 0
    while len(hash_lst) < 8:
        make = 'cxdnnyjw{}'.format(i)
        i += 1
        if hashlib.md5(str.encode(make)).hexdigest().startswith('00000'):
            hash_lst.append(hashlib.md5(str.encode(make)).hexdigest())
    return(hash_lst)

def password(hash_find):
    print(''.join(i[5] for i in hash_find()))

if __name__ == '__main__':
    password(hash_find)
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Dagens knowit er mer enn jeg takler. 10^15 iterasjoner, men en TOM loop på den størrelsen tar mange, mange timer, og jeg ser ikke noen annen måte å løse den på enn den naïve måten.
Sitat av robhol Vis innlegg
Dagens knowit er mer enn jeg takler. 10^15 iterasjoner, men en TOM loop på den størrelsen tar mange, mange timer, og jeg ser ikke noen annen måte å løse den på enn den naïve måten.
Vis hele sitatet...
Samme problem som deg, skjønner ikke hvordan jeg kan få det gjort uten å bruke mange mange timer.
Hint til knowit dag 6:
SPOILER ALERT! Vis spoiler

Tegn det opp, se mønsteret. Og husk det er springer, ikke løper. Btdt
Min for Advent of Code day 6.

Kode

from collections import Counter

def adv_6():
    with open('input_adv_6.txt') as f:
        data = [i.strip() for i in f]
        lenght_x = len(data[0])
        rows = [[i[c] for i in data] for c in range(lenght_x)]
        return ''.join([Counter(i).most_common(1)[0][0] for i in rows])

if __name__ == '__main__':
    print(adv_6())
Min løsning på Advent of Code, luke 7:

SPOILER ALERT! Vis spoiler

Kode

import regex as re


def get_super_hyper(ip):
    return (
        re.split(r'\[[^\]]*?\]', ip),
        re.findall(r'(?:\[)([^\]]*?)(?:\])', ip)
    )
def support_tls(ip):
    supernet_seqs, hypernet_seqs = get_super_hyper(ip)
    return any(re.search(r'([a-z])(?!\1)([a-z])\2\1', match) for match in supernet_seqs) and \
           not any(re.search(r'([a-z])(?!\1)([a-z])\2\1', match) for match in hypernet_seqs)

def support_ssl(ip):
    supernet_seqs, hypernet_seqs = get_super_hyper(ip)
    aba, bab = set(), set()

    for seq in supernet_seqs:
        aba |= set(re.findall(r'([a-z])(?!\1)([a-z])\1', seq, overlapped=True))

    for seq in hypernet_seqs:
        bab |= set(re.findall(r'([a-z])(?!\1)([a-z])\1', seq, overlapped=True))

    return any((match[1], match[0]) in bab for match in aba)


def seven(func):
    with open('7.txt') as ifile:
        return sum(func(ip.strip()) for ip in ifile)

if __name__ == '__main__':
    print '7a: {}'.format(seven(support_tls))
    print '7b: {}'.format(seven(support_ssl))
Jeg er ganske blank på regexp, men så ingen annen løsning enn å prøve meg. Først prøvde jeg å løse hver deloppgave med en enkel regexp, men fant etter hvert ut at det ble enklere hvis man separerte supernet- og hypernetdelene først.

Problemet med deloppgave b var at man også må finne overlappende varianter av ABA, for eksempel ABACA. Python sin regexp-modul støtter ikke overlapping, men det viser seg at en planlagt fremtidig regexp-modul støtter dette, så da fikk jeg det endelig til.
Sist endret av steili; 7. desember 2016 kl. 20:03.
Mitt bidrag til Advent of Code luke 7, del 2 i java:
https://github.com/Zepur/AdventOfCod.../src/Day7.java

Det er bare å PMe meg med forbedringer.
Luke 7 knowit

Kode

def move (line, position):
	if "north" in line[3]:
		position[0] += int(line[1])
	elif "south" in line[3]:
		position[0] -= int(line[1])
	elif "west" in line[3]:
		position[1] += int(line[1])
	else:
		position[1] -= int(line[1])
	return position

if __name__ == "__main__":
	file = open('luke7knowit.txt', 'r')
	c = [0, 0]
	for line in file:
		c = move(line.split(' '), c)
	print(c)
Min løsning for luke 7, Knowit.

Kode

from collections import defaultdict

with open('luke7.txt') as ifile:
    dist = defaultdict(int)
    for line in ifile:
        _, n, __, dir = line.strip().split(' ')
        dist[dir] += int(n)

print "{}, {}".format(dist['north']-dist['south'], dist['west']-dist['east'])
Luke 7, Knowit:

Kode

with open('skattekart.txt', 'r') as steps:
    steplist = [step.split()[1::2] for step in steps]
    ns = sum([int(dist)*(('north' in dir) - ('south' in dir)) for dist, dir in steplist])
    we = sum([int(dist)*(('west' in dir) - ('east' in dir)) for dist, dir in steplist])
    print("{}, {}".format(ns, we))
Luke 8, Advent of Code:

SPOILER ALERT! Vis spoiler

Mistenker at denne koden ikke akkurat er effektiv, men den fungerer. Brukte numpy, og transponerte bare matrisen for å "rulle" kolonnene.

Resultat:



Kode:

Kode

import numpy as np


def print_screen(screen):
    print '\n'.join(''.join('#' if i == 1 else ' '  for i in row) for row in screen)


def roll_row(screen, row, n):
    screen[row] = np.roll(screen[row], n)


def roll_col(screen, col, n):
    tmp = np.transpose(screen)
    tmp[col] = np.roll(tmp[col], n)
    screen = np.transpose(tmp)

def rect(screen, x, y):
    screen[0:y, 0:x] = 1

def day_8():
    screen = np.zeros((6, 50), dtype=np.int)
    with open('8.txt') as ifile:
        for instruction in ifile:
            words = instruction.strip().split(' ')
            if 'rect' in instruction:
                rect(screen, *map(int, words[1].split('x')))
            else:
                n = int(words[2][2:])
                x = int(words[-1])
                if words[1] == 'row':
                    roll_row(screen, n, x)
                else:
                    roll_col(screen, n, x)
    print_screen(screen)
    print '\nPixels lit: {}'.format(sum(sum(screen)))

if __name__ == '__main__':
    day_8()
Min løsning på luke 8 knowit. Siste linje er courtesy of ambientsound på IRC. Edit: skjerpet meg og fjernet elif.

SPOILER ALERT! Vis spoiler


Kode

def move(old_pos, throw):
    pos = old_pos + int(throw)
    ladder = False
    ladders = {3: 17, 8: 10, 15: 44, 22: 5, 39: 56, 49: 75, 62: 45, 64: 19, 65: 73, 80: 12, 87: 79}
    if pos in ladders:
        pos = ladders.get(pos)
        ladder = True
    elif pos > 90:
        pos = old_pos
    return [pos, ladder]


if __name__ == "__main__":
    ppos = [1] * 1337
    player = 0
    ladder_count = 0
    cur_pos = [0, False]
    with open('input8_knowit.txt') as file:
        for line in file:
            cur_pos = move(ppos[player], line)
            ppos[player] = cur_pos[0]
            if ppos[player] == 90:
                print("player:", player+1, "ladders:", ladder_count, (player+1)*ladder_count)
            ladder_count += cur_pos[1]
            player = (player+1) % 1337
Sist endret av Xasma; 8. desember 2016 kl. 23:23.
55535 HP
Ozma's Avatar
Trådstarter
Golang er ikke akkurat så smud som Python nei... Men gøy er det.

Kode

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func Max(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

type Screen struct {
	NumRows, NumCols int
	M                [][]uint8
	rowBuf, colBuf   []uint8
}

func NewScreen(numRows, numCols int) Screen {
	s := Screen{
		numRows,
		numCols,
		make([][]uint8, numRows),
		make([]uint8, numCols),
		make([]uint8, numRows),
	}
	for j, _ := range s.M {
		s.M[j] = make([]uint8, numCols)
	}
	return s
}

func (s Screen) String() string {
	str := make([]rune, 0)
	for j := 0; j < s.NumRows; j++ {
		for i := 0; i < s.NumCols; i++ {
			if s.M[j][i] == 0 {
				str = append(str, '.')
			} else {
				str = append(str, '#')
			}
		}
		str = append(str, '\n')
	}
	return string(str)
}

func (s Screen) Rect(numRows, numCols int) {
	for j := 0; j < numRows; j++ {
		for i := 0; i < numCols; i++ {
			s.M[j][i] = 1
		}
	}
}

func (s Screen) RotateRow(j, by int) {
	for i := 0; i < s.NumCols; i++ {
		s.rowBuf[i] = s.M[j][i]
	}
	for i := 0; i < s.NumCols; i++ {
		s.M[j][(i+by)%s.NumCols] = s.rowBuf[i]
	}
}

func (s Screen) RotateCol(i, by int) {
	for j := 0; j < s.NumRows; j++ {
		s.colBuf[j] = s.M[j][i]
	}
	for j := 0; j < s.NumRows; j++ {
		s.M[(j+by)%s.NumRows][i] = s.colBuf[j]
	}
}

func (s Screen) LitPixelsCount() int {
	count := 0
	for j := 0; j < s.NumRows; j++ {
		for i := 0; i < s.NumCols; i++ {
			if s.M[j][i] > 0 {
				count++
			}
		}
	}
	return count
}

func main() {
	s := NewScreen(6, 50)

	file, err := os.Open("input.txt")
	if err != nil {
		panic("Couldn't open input.txt")
	}
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		fields := strings.Fields(scanner.Text())
		if fields[0] == "rect" {
			numStrs := strings.Split(fields[1], "x")
			numCols, _ := strconv.Atoi(numStrs[0])
			numRows, _ := strconv.Atoi(numStrs[1])
			s.Rect(numRows, numCols)
		} else if fields[0] == "rotate" {
			by, _ := strconv.Atoi(fields[4])
			idx, _ := strconv.Atoi(fields[2][2:])
			if fields[1] == "row" {
				s.RotateRow(idx, by)
			} else if fields[1] == "column" {
				s.RotateCol(idx, by)
			}
		}
	}

	fmt.Printf("%v\n", s.String())
	fmt.Println("Lit pixels: ", s.LitPixelsCount())
}
Advent of Code dag 8, del 1 og 2. Fortsatt i sliten java..
SPOILER ALERT! Vis spoiler


Kode

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Day8 {
    private static char[][] grid = new char[50][6];

    public static void main(String[] args) throws IOException {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                grid[i][j] = '░';
            }
        }

        for (String line : Files.readAllLines(Paths.get("C:/Users/xxx/IdeaProjects/AdventOfCode/src/A8"))) {
            if (line.startsWith("r_"))
                rect(line.substring(2));
            else if (line.startsWith("y_"))
                row(line.substring(2));
            else if (line.startsWith("x_"))
                column(line.substring(2));
        }

        printResult();
    }

    private static void column (String col) {
        int colNum = Integer.parseInt(col.split("_")[0]);
        int shifts = Integer.parseInt(col.split("_")[1]);
        String old = "", newResult;

        for (int i = 0; i < grid[colNum].length; i++) {
            old += String.valueOf(grid[colNum][i]);
        }
        int subStart = old.length()-shifts;
        newResult = old.substring(subStart) + old.substring(0, subStart);

        for (int i = 0; i < grid[colNum].length; i++) {
            grid[colNum][i] = newResult.charAt(i);
        }
    }

    private static void row (String row) {
        int rowNum = Integer.parseInt(row.split("_")[0]);
        int shifts = Integer.parseInt(row.split("_")[1]);
        String old = "", newResult;

        for (int i = 0; i < grid.length; i++) {
            old += String.valueOf(grid[i][rowNum]);
        }
        int subStart = old.length()-shifts;
        newResult = old.substring(subStart) + old.substring(0, subStart);

        for (int i = 0; i < grid.length; i++) {
            grid[i][rowNum] = newResult.charAt(i);
        }
    }

    private static void rect (String rect) {
        int xLen = Integer.parseInt(rect.split("x")[0]);
        int yLen = Integer.parseInt(rect.split("x")[1]);
        for (int i = 0; i < xLen; i++) {
            for (int j = 0; j < yLen; j++) {
                grid[i][j] = '▓';
            }
        }
    }

    private static void printResult () {
        int count = 0;
        for (int j = 0; j < grid[0].length; j++) {
            for (int i = 0; i < grid.length; i++) {
                if (grid[i][j] == '▓')
                    count++;
                System.out.print(grid[i][j]);
                if (i == grid.length - 1)
                    System.out.println();
            }
        }
        System.out.println(count + " pixels is lit.");
    }
}
Sist endret av Dyret; 9. desember 2016 kl. 04:08.
Luke 8, Knowit:

Kode

ladders = {3: 17, 8: 10, 15: 44, 22: 5, 39: 56, 49: 75, 62: 45, 64: 19, 65: 73, 80: 12, 87: 79}
with open('stigekast.txt', 'r') as throws:
    ladders_climbed = 0
    player_pos = [1] * 1337
    for i, throw in enumerate(throws):
        player = i % 1337
        new_pos = player_pos[player] + int(throw)
        if new_pos == 90:
            print("Winner. Answer: {}".format(ladders_climbed * (player + 1)))
            break
        elif new_pos in ladders:
            ladders_climbed += 1
            player_pos[player] = ladders[new_pos]
        elif new_pos < 90:
            player_pos[player] = new_pos
Luke 9 knowit

Kode

w = {}
with open('t.txt') as trans_file:
    for l in trans_file:
        f,t,a = l.split(',')
        w[f] = w.get(f, 0) - int(a)
        w[t] = w.get(t, 0) + int(a)

x = len([x for x in w if w[x] > 10])
print(x)
Luke 9a, AoC:

SPOILER ALERT! Vis spoiler

Kode

import re


def nine_a():
    with open('9.txt') as ifile:
        compressed = ifile.read().strip()
        tail = 0
        length = 0
        for match in re.finditer(r'\(([0-9]+)x([0-9]+)\)', compressed):
            start, end = match.start(), match.end()
            # Skip matches that are part of compressed data
            if start < tail:
                continue
            chars, n = map(int, match.groups())
            length += (start - tail) + n*chars # (length of uncompressed data) + length of decompressed compressed data
            tail = end+chars

        # Add any uncompressed data from the end of the file
        return length + len(compressed)-tail


Jobber litt med deloppgave b nå - jeg tror jeg forstår hvordan den skal løses (jeg klarte ihvertfall test-casene på kalkulatoren), men jeg har ikke fått det ned som kode enda

Edit:

Luke 9b, AoC:

SPOILER ALERT! Vis spoiler

Etter å ha knotet en del, forstod jeg at jeg så å si hadde løst deloppgave b allerede, det eneste jeg behøvde å gjøre var et par mindre endringer i koden fra deloppgave a:

Kode

def length_of_data(data, mult=1, pattern=r'\(([0-9]+)x([0-9]+)\)'):
    tot = 0
    tail = 0
    for match in re.finditer(pattern, data):
        start, end = match.start(), match.end()
        if start < tail:
            continue
        chars, n = map(int, match.groups())
        tot += start-tail + length_of_data(data[end:end+chars], n)
        tail = end+chars
    tot += len(data)-tail
    return tot*mult

def nine_b():
    with open('9.txt') as ifile:
        return length_of_data(ifile.read().strip())
Sist endret av steili; 9. desember 2016 kl. 18:58. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Luke 10 AoC, quick'n'dirty:

SPOILER ALERT! Vis spoiler

Kode

import re
from collections import defaultdict

class Bot(object):
    def __init__(self, botid):
        self.botid = botid
        self.high = None
        self.low = None

    def ok(self):
        return (self.high != None) and (self.low != None)

    def add(self, num):
        if (self.high and self.low) or (num in (self.high, self.low)):
            return
        elif self.high:
            if num > self.high:
                self.low = self.high
                self.high = num
            else:
                self.low = num
        elif self.low:
            if num < self.low:
                self.high = self.low
                self.low = num
            else:
                self.high = num
        else:
            self.high = num

bots = {}
outputs = {}
instructions = open("10.txt").readlines()

for i in xrange(len(instructions)):
    for inst in instructions:
        m0 = re.match("value (\d*) goes to bot (\d*)", inst)
        m1 = re.match("bot (\d*) gives low to (bot|output) (\d*) and high to (bot|output) (\d*)", inst)
        if m0:
            val, bot = map(int, m0.groups())
            if bot not in bots:
                bots[bot] = Bot(bot)
            bots[bot].add(val)
        if m1:
            src_bot, dst_lo, dst_hi = map(int, [m1.group(1), m1.group(3), m1.group(5)])
            dst_lo_type, dst_hi_type = m1.group(2), m1.group(4)
            if (src_bot in bots) and bots[src_bot].ok():
                if dst_lo_type == 'bot':
                    if dst_lo not in bots:
                        bots[dst_lo] = Bot(dst_lo)
                    bots[dst_lo].add(bots[src_bot].low)
                else:
                    outputs[dst_lo] = bots[src_bot].low

                if dst_hi_type == 'bot':
                    if dst_hi not in bots:
                        bots[dst_hi] = Bot(dst_hi)
                    bots[dst_hi].add(bots[src_bot].high)
                else:
                    outputs[dst_hi] = bots[src_bot].high

for bot in bots:
    if bots[bot].high == 61 and bots[bot].low == 17:
        print "Part 1: %d" % bots[bot].botid
print "Part 2: %d" % (outputs[0]*outputs[1]*outputs[2])


Logikken var å bare gå gjennom hver instruksjon N^2 ganger, og forkaste en om den ikke ga mening enda. En optimalisering kunne ha vært å fjerne en instruksjon etter at all informasjonen i den er oppbrukt, men worst-case ville fortsatt vært N^2.

Den beste løsningen ville vært å bygge et avhengighetskart, og så regnet seg bakover til den riktige dronen, men inputfilen var såpass kort her at jeg tok meg friheten til å ta en snarvei.
Mine løsninger ligger her: https://github.com/loldot/AoC
55535 HP
Ozma's Avatar
Trådstarter
Her er dagens Advent of Code, del 1 og 2. En kjapp BFS var det som skulle til.

Kode

from hashlib import md5
from collections import deque
salt = bytearray(b"mmsxrhfx")
openvalues = "bcdef"

def opendoors(s):
    x = s.count("R") - s.count("L")
    y = s.count("D") - s.count("U")
    if y == 3 and x == 3:
        return None, True
    h = md5(salt + str.encode(s)).hexdigest()[:4]
    opendoors = []
    if y != 0 and h[0] in openvalues:
        opendoors.append("U")
    if y != 3 and h[1] in openvalues:
        opendoors.append("D")
    if x != 0 and h[2] in openvalues:
        opendoors.append("L")
    if x != 3 and h[3] in openvalues:
        opendoors.append("R")
    return opendoors, False

queue = deque([""])
while queue:
    path = queue.pop()
    doors, foundVault = opendoors(path)
    if foundVault:
        print(len(path), path)
    if not doors:
        continue
    for door in doors:
        queue.appendleft(path+door)
Her er også kjapp løsning av dag 13 i SciPy som demonstrerer hvordan sparse-matrix grafrutinene i SciPy funker.

Kode

import numpy as np
import matplotlib.pyplot as plt

# Vectorizing allows us to operate on NumPy arrays
is_wall = np.vectorize(lambda y, x: bin(x*x + 3*x +2*x*y + y + y*y + 1362).count("1") % 2 == 1)

max_pos = 70
Y, X = np.mgrid[0:max_pos, 0:max_pos]
wall = np.ones((max_pos+2, max_pos+2), dtype=bool)
wall[1:-1, 1:-1] = is_wall(Y, X)

from scipy.sparse import lil_matrix

# Map from coordinate to index in graph matrix
def getnode(y, x):
    return wall.shape[1]*y + x

# Map from index in graph matrix to coordinate
def getpos(node):
    return divmod(node, wall.shape[1])

graph = lil_matrix(((max_pos+2)**2, (max_pos+2)**2))
for x in range(1, max_pos+1):
    for y in range(1, max_pos+1):
        if wall[y,x]:
            continue
        if not wall[y+1,x]:
            graph[getnode(y,x), getnode(y+1,x)] = 1
        if not wall[y-1,x]:
            graph[getnode(y,x), getnode(y-1,x)] = 1
        if not wall[y,x+1]:
            graph[getnode(y,x), getnode(y,x+1)] = 1
        if not wall[y,x-1]:
            graph[getnode(y,x), getnode(y,x-1)] = 1
graph = graph.tocsr()

import scipy.sparse.csgraph
targetx = 32
targety = 40
path_length, predecessor = scipy.sparse.csgraph.shortest_path(graph, return_predecessors=True)
print(path_length[getnode(2,2), getnode(targety,targetx)])

dist = scipy.sparse.csgraph.floyd_warshall(graph)
nodes = np.where(dist[getnode(2,2),:] <= 50)[0]
print("Can reach", len(nodes), "distinct nodes")
Hei. Er det noen av dere som har fått til dagens luke i Knowit? Jeg har prøvd å implementere Dijkstras algoritme for å finne korteste vei, men jeg får den ikke til å funke ordentlig. Ser det er relativt få som har klart den, så forstår at den er litt ekstra vanskelig. :/ Håper på tips!
Mvh
55535 HP
Ozma's Avatar
Trådstarter
Hint til dagens Knowit-luke:
SPOILER ALERT! Vis spoiler
Grafen din trenger ikke ha 100000*100000 noder, det holder med 24.


Ja og forresten: Oppgaven spør om antall skritt, selv om det ikke er nevnt ordentlig i oppgaveteksten. Svaret er et femsifret heltall.
Sist endret av Ozma; 18. desember 2016 kl. 00:36.
Ah. Jeg prøvde å implementere det med 13 noder. Siden begge endene av en warp er 0 i fra hverandre, så tenkte jeg det kunne betraktes som en node. Hadde da i tillegg en funksjon som fant ut hvilken ende av warpen som til enhver tid var nærmest. Jeg fikk uansett ikke til å implementere Dijkstra, av en eller annen grunn. Aner ikke hvor feilen lå.


Uansett!

Dagens oppgave... hva i alle dager? Jeg har delt opp tallet i alskens ulike lengder, kjørt frekvensanalyser, sammenlignet med ASCII, Unicode, UTF og andre encodings. Tenkte til og med muligheten for at det er en melding tastet inn på et gammelt mobiltastatur (der antall ganger du trykker "7" avgjør om du skriver p, q, r eller s). Ser at Zepur er en av de ytterst få som har fått den til! Noen hint?
Sitat av MatFot Vis innlegg
Snip...
Dagens oppgave... hva i alle dager? Jeg har delt opp tallet i alskens ulike lengder, kjørt frekvensanalyser, sammenlignet med ASCII, Unicode, UTF og andre encodings. Tenkte til og med muligheten for at det er en melding tastet inn på et gammelt mobiltastatur (der antall ganger du trykker "7" avgjør om du skriver p, q, r eller s). Ser at Zepur er en av de ytterst få som har fått den til! Noen hint?
Vis hele sitatet...
Måtte registrere meg for å sjekke om det faktisk var korrekt det jeg så..

"Å, jul med din glede! Svaret ditt var korrekt. Du har nå løst 1 av 24 luker!"

SPOILER ALERT! Vis spoiler
Hva ser du, ev. hva myser du her?


Jeg kom frem til svaret ved bruk av:
SPOILER ALERT! Vis spoiler
pixlr.com
Haha... Det verste er at jeg faktisk tenkte på det også.

SPOILER ALERT! Vis spoiler
Da jeg limte tallet inn i teksteditoren, syntes jeg at jeg så noen "linjer" der, som jeg prøvde å studere litt, og myse litt, og bøye på skjermen. Men etter litt prøving og feiling uten å komme noen vei, og med tanke på at dette skal være programmeringsoppgaver, så vurderte jeg ikke egentlig det seriøst. Men OK! Takk for hint! :-)
Jeg hadde gledet meg til å kode i dag tidlig, men akk..
SPOILER ALERT! Vis spoiler
Det står ikke noe om key, og tallene så ikke ut til å kunne representere bokstaver på en fin måte, så jeg utelukket ciphers.
Så la jeg merke til at det ikke var partall i den øverste linjen, og at klumpene med noen individuelle tall var mer konsentrert enn andre.


Fint avbrekk fra BFS forøvrig.
▼ ... flere år senere ... ▼
Sitat av m0b Vis innlegg
Første implementasjon for luke 2.

Kode

#include <iostream>
#include <chrono>
#include <cmath>
int main()
{
	auto begin = std::chrono::high_resolution_clock::now();
	
	double i, sum, fib, run;
	for (run = 0; run < 5e6; run++)
	{
		for (i = sum = fib = 0; fib < 13e8; sum += ((int)fib & 1) ? fib : 0, (fib = floor(pow((1 + sqrt(5)) / 2, i++) / sqrt(5) + 0.5)));
	}

	auto end = std::chrono::high_resolution_clock::now();
	auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
	std::cout << "+ " << sum << std::endl;
	std::cout << (i*run) << " iterations run in " << (double)duration << "ns total, average : " << duration / (i*run) << "ns." << std::endl;

	return 0;
}

Kode

+ 1.48561e+09
2.35e+08 iterations run in 8.17514e+09ns total, average : 34.7878ns.
Vis hele sitatet...
Nå vekker jeg til live igjen en fire år gammel tråd, og beklager forsåvidt det, men jeg har ikke hatt helt fred i meg siden denne oppgaven. Var ganske sikker på at det var en løsning der ute som ville tillate meg å løse denne oppgaven uten for-loops, rekusjon, de mest normale kjente metodene og ikke minst konstant tid uavhengig av problemstørrelse. Har tidvis vært innom denne oppgaven innimellom for å finne metoder. Her bygger jeg videre på binet's formel som jeg brukte i første implementasjon og utnytter videre matriseform for å kjapt kalkulere det n-te tallet, samt at summen av n partall og n oddetall skal være lik.

Så jeg presenterer herved andre implementasjon for luke 2!

Kode

namespace fibs
{
    using System;
    using System.Text;
    using MathNet.Numerics.LinearAlgebra.Double;

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(@"Fibonaccirekken er en tallrekke som genereres ved at man adderer de to foregående tallene i rekken. f.eks. om man starter med 1 og 2 blir de første 10 termene 1, 1, 2, 3, 5, 8, 13, 21, 34 og 55 
Finn summen av alle partall i denne rekken som er mindre enn 4.000.000.000" + Environment.NewLine);

            var limit = 4e9;
            var phi = (1 + Math.Sqrt(5)) * 0.5;
            var nth = (int)Math.Floor((Math.Log(limit + 0.5) + (0.5 * Math.Log(5))) / Math.Log(phi));
            var m0 = DenseMatrix.OfArray(new[,] { { 1.0, 1.0 }, { 1.0, 0.0 } });
            var m1 = m0.Power(nth + 1);
            var fib = m1[1, 1];

            Console.WriteLine($"Fibonacci-tall nr. {nth} er {fib}, og summen av alle fibonacci partall opp til {limit}, er {(fib - 1) * 0.5}.");
        }
    }
}
Fibonaccirekken er en tallrekke som genereres ved at man adderer de to foregående tallene i rekken. f.eks. om man starter med 1 og 2 blir de første 10 termene 1, 1, 2, 3, 5, 8, 13, 21, 34 og 55
Finn summen av alle partall i denne rekken som er mindre enn 4.000.000.000

Fibonacci-tall nr. 47 er 2971215073, og summen av alle fibonacci partall opp til 4000000000, er 1485607536
Vis hele sitatet...
Fibonacci-tall nr. n finner en også slik med binet's formel om man ikke ønsker bruke matriseform:

Kode

var limit = 4e9;
var phi = (1 + Math.Sqrt(5)) * 0.5;
var nth = (int)Math.Floor((Math.Log(limit + 0.5) + (0.5 * Math.Log(5))) / Math.Log(phi));
var fib = Math.Floor(Math.Pow(phi, nth) / Math.Sqrt(5) + 0.5);
var sum = (fib - 1) * 0.5;
Alternativt

Kode

var fib = Math.Floor(Math.Exp(nth * Math.Log(phi)) / Math.Sqrt(5) + 0.5);
var sum = (fib - 1) * 0.5;
Kan også for ordensskyld nevne at jeg tidligere har forsøkt med en annen optimalisering. Nemlig å benytte SIMD, men her mister jeg presisjon etter rundt 100 iterasjoner. Her har jeg også benchmarks (med både doubles og floats) med for å se den potensielle tidsoptimaliseringa fra første implementasjon.

Kode

namespace fibs
{
    using System;
    using System.Diagnostics;
    using System.Numerics;
    using BenchmarkDotNet.Attributes;

    public class BenchmarkComputation<T>
    {
        public Action<T[], int> ComputeMultiple;
        public Action<T[], int> ComputeSingle;
    }

    public class Benchmark
    {
        readonly double phi_d = (1 + Math.Sqrt(5)) * 0.5;
        readonly float phi_f = (1 + MathF.Sqrt(5)) * 0.5f;
        int index, vecSize, numFibs = 1000;

        double[] doubles;
        float[] floats;
        BenchmarkComputation<double> computation_d;
        BenchmarkComputation<float> computation_f;

        public Benchmark()
        {
            doubles = new double[numFibs];
            computation_d = new BenchmarkComputation<double>();
            computation_d.ComputeMultiple = (numbers, index) => Compute4n_d(index).CopyTo(numbers, index);
            computation_d.ComputeSingle = (numbers, index) => numbers[index] = ComputeN_dexp(index);

            floats = new float[numFibs];
            computation_f = new BenchmarkComputation<float>();
            computation_f.ComputeMultiple = (numbers, index) => Compute8n_f(index).CopyTo(numbers, index);
            computation_f.ComputeSingle = (numbers, index) => numbers[index] = ComputeN_fexp(index);
        }
        
        [Benchmark]
        [Arguments(10)]
        public double ComputeN_d(double n) => Math.Floor(Math.Pow(phi_d, n) / Math.Sqrt(5) + 0.5);

        [Benchmark]
        [Arguments(10)]
        public float ComputeN_f(float n) => MathF.Floor(MathF.Pow(phi_f, n) / MathF.Sqrt(5) + 0.5f);

        [Benchmark]
        [Arguments(10)]
        public float ComputeN_fexp(float n) => MathF.Floor(MathF.Exp(n * MathF.Log(phi_f)) / MathF.Sqrt(5) + 0.5f);

        [Benchmark]
        [Arguments(10)]
        public double ComputeN_dexp(double n) => Math.Floor(Math.Exp(n * Math.Log(phi_d)) / Math.Sqrt(5) + 0.5);

        [Benchmark]
        [Arguments(10)]
        public Vector<double> Compute4n_d(double n) => new Vector<double>(new double[] {
            ComputeN_dexp(n),
            ComputeN_dexp(n + 1),
            ComputeN_dexp(n + 2),
            ComputeN_dexp(n + 3)
        });

        [Benchmark]
        [Arguments(10)]
        public Vector<float> Compute8n_f(float n) => new Vector<float>(new float[] {
            ComputeN_fexp(n),
            ComputeN_fexp(n + 1),
            ComputeN_fexp(n + 2),
            ComputeN_fexp(n + 3),
            ComputeN_fexp(n + 4),
            ComputeN_fexp(n + 5),
            ComputeN_fexp(n + 6),
            ComputeN_fexp(n + 7)
        });

        [Benchmark]
        public double[] RunDoubles()
        {
            vecSize = Vector<double>.Count;
            for (; index < numFibs - vecSize + 1; index += vecSize)
            {
                Compute4n_d(index).CopyTo(doubles, index);
            }
            while (index != numFibs)
            {
                doubles[index++] = ComputeN_dexp(index);
            }
            index = 0;
            return doubles;
        }

        [Benchmark]
        public float[] RunFloats()
        {
            vecSize = Vector<float>.Count;
            for (; index < numFibs - vecSize + 1; index += vecSize)
            {
                Compute8n_f(index).CopyTo(floats, index);
            }
            while (index != numFibs)
            {
                floats[index++] = ComputeN_fexp(index);
            }
            index = 0;
            return floats;
        }

        [Benchmark]
        public double[] RunGenericDoubles()
        {
            vecSize = Vector<double>.Count;
            for (; index < numFibs - vecSize + 1; index += vecSize)
            {
                computation_d.ComputeMultiple(doubles, index);
            }
            while (index != numFibs)
            {
                computation_d.ComputeSingle(doubles, index++);
            }
            index = 0;
            return doubles;
        }

        [Benchmark]
        public float[] RunGenericFloats()
        {
            vecSize = Vector<float>.Count;
            for (; index < numFibs - vecSize + 1; index += vecSize)
            {
                computation_f.ComputeMultiple(floats, index);
            }
            while (index != numFibs)
            {
                computation_f.ComputeSingle(floats, index++);
            }
            index = 0;
            return floats;
        }
    }
}

Kode

Method      	n      	Mean        	Error        	StdDev
ComputeN_d 	10 	27.57 ns 	0.6113 ns 	0.5419 ns
ComputeN_f 	10 	11.28 ns 	0.2628 ns 	0.2459 ns
ComputeN_fexp 	10 	14.41 ns 	0.3311 ns 	0.3400 ns
ComputeN_dexp 	10 	17.67 ns 	0.3013 ns 	0.2818 ns
Compute4n_d 	10 	76.58 ns 	1.4503 ns 	1.3566 ns
Compute8n_f 	10 	117.08 ns 	2.3343 ns 	2.4977 ns
RunDoubles 	? 	20,228.82 ns 	475.3984 ns 	711.5539 ns
RunFloats 	? 	48,781.02 ns 	952.1425 ns 	1,096.4888 ns
RunGenericDoubles 	? 	22,229.58 ns 	192.6551 ns 	160.8757 ns
RunGenericFloats 	? 	49,733.11 ns 	966.6905 ns 	992.7200 ns
Sist endret av m0b; 17. november 2020 kl. 02:33.
▼ ... noen uker senere ... ▼
Andre som er i gang att?

Eg køyrer AdventofCode, som virkar å vere heilt ok vanskegrad.

Dag 1 og 2 gjekk glatt, men håpar dette kan vere ein stad å spørre om eg skulle stå fast...
Luke 1 og 2 var veldig greie ja, redd for at det blir mye vanskeligere utover.
Advent of Code er rimelig grei de første par ukene, og så blir det ironisk nok mer jobb og stress når det nærmer seg jul, når folk flest har mer å gjøre. Det går fra å være en oppvarming under morgenkaffen på jobb, til å ta flere timer av lunsj, ettermiddag og kveld. Hopper man over en dag som virker stress, så kan den fort dukke opp igjen som en forutsetning for en senere oppgave. Jeg har derfor gitt opp AoC.

@snegler: AoC har en subreddit hvor man åpent deler hint, spoilere og løsninger - etter at topp 100 er avgjort for dagen. Så om ingen her kan hjelpe deg videre, så er det mange der.

I år så spiller jeg (N)PST sin CTF-julekalender (https://dass.npst.no) og knowit sin kodekalender.
Sitat av Yochi Vis innlegg
Luke 1 og 2 var veldig greie ja, redd for at det blir mye vanskeligere utover.
Vis hele sitatet...
I desse oppgåvene ligg nok utfordringa i å få det til å køyre effektivt.

Løyste oppgave1 på knowit, og sjølv det ikkje var vanskeleg å finne svaret, knelte mest maskina når den skulle køyre pythonkoden....

Sitat av Dyret Vis innlegg
I år så spiller jeg (N)PST sin CTF-julekalender (https://dass.npst.no) og knowit sin kodekalender.
Vis hele sitatet...
Du kunne ikkje gitt eit hint på dag 1 NPST? Slit med å kome i gang med denne typen oppgåver, og hadde jo vore kjekt å sjå kor langt eg kjem og eg først forstår kva i all verda eg skal gjere.

(Reknar med eg skal dekryptere stringen, og deretter gjere eit eller anna vidare...)
Sist endret av snegler; 2. desember 2020 kl. 14:04. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av Dyret Vis innlegg
Advent of Code er rimelig grei de første par ukene, og så blir det ironisk nok mer jobb og stress når det nærmer seg jul, når folk flest har mer å gjøre. Det går fra å være en oppvarming under morgenkaffen på jobb, til å ta flere timer av lunsj, ettermiddag og kveld. Hopper man over en dag som virker stress, så kan den fort dukke opp igjen som en forutsetning for en senere oppgave. Jeg har derfor gitt opp AoC.
Vis hele sitatet...
Ja, håper de ikke gjør det som i fjor. Da var vel 7-8 dager avhengig av dagene før.
Sitat av snegler Vis innlegg
Du kunne ikkje gitt eit hint på dag 1 NPST? Slit med å kome i gang med denne typen oppgåver, og hadde jo vore kjekt å sjå kor langt eg kjem og eg først forstår kva i all verda eg skal gjere.

(Reknar med eg skal dekryptere stringen, og deretter gjere eit eller anna vidare...)
Vis hele sitatet...
SPOILER ALERT! Vis spoiler

Koden har blitt mista i en velkjent salat som har rota den til.
Sitat av NAPse Vis innlegg
SPOILER ALERT! Vis spoiler

Koden har blitt mista i en velkjent salat som har rota den til.
Vis hele sitatet...
Sitat av Dyret Vis innlegg
Advent of Code er rimelig grei de første par ukene, og så blir det ironisk nok mer jobb og stress når det nærmer seg jul, når folk flest har mer å gjøre. Det går fra å være en oppvarming under morgenkaffen på jobb, til å ta flere timer av lunsj, ettermiddag og kveld. Hopper man over en dag som virker stress, så kan den fort dukke opp igjen som en forutsetning for en senere oppgave. Jeg har derfor gitt opp AoC.

@snegler: AoC har en subreddit hvor man åpent deler hint, spoilere og løsninger - etter at topp 100 er avgjort for dagen. Så om ingen her kan hjelpe deg videre, så er det mange der.

I år så spiller jeg (N)PST sin CTF-julekalender (https://dass.npst.no) og knowit sin kodekalender.
Vis hele sitatet...
Funnet noe smart på oppgave to i PST sin?

Sitter nå med
SPOILER ALERT! Vis spoiler

en tallrekke som representerer tonene i filen, og vurderer om jeg skal ta meg jobben med å oversette dem via et skjema som dette for å få bokstaver/noter i stedet


Er muligens helt på vidda..
Sist endret av Lanjelin; 2. desember 2020 kl. 20:34.
Sitat av Lanjelin Vis innlegg
Funnet noe smart på oppgave to i PST sin?

Sitter nå med
SPOILER ALERT! Vis spoiler

en tallrekke som representerer tonene i filen, og vurderer om jeg skal ta meg jobben med å oversette dem via et skjema som dette for å få bokstaver/noter i stedet


Er muligens helt på vidda..
Vis hele sitatet...
Sit med same tanken. Lurer på om det er overtenking, jmf. NPST-discorden...
For oppgave 2, så kan det være greit å tenke så simpelt som mulig. Det er folk som løste den på få minutter, og vi er bare på dag 2 når det kommer til vanskelighetsgrad.

SPOILER ALERT! Vis spoiler

Dere kan ignorere privat.7z og fokusere på mid-filen. Prøv ulike måter å visualisere filen på, helst så enkle som mulige, og fjern ting som ikke ser "flaggete" ut. Husk at flaggformatet er PST{...}
Sist endret av Dyret; 2. desember 2020 kl. 21:59.
Sitat av Dyret Vis innlegg
For oppgave 2, så kan det være greit å tenke så simpelt som mulig. Det er folk som løste den på få minutter, og vi er bare på dag 2 når det kommer til vanskelighetsgrad.

SPOILER ALERT! Vis spoiler

Dere kan ignorere privat.7z og fokusere på mid-filen. Prøv ulike måter å visualisere filen på, helst så enkle som mulige, og fjern ting som ikke ser "flaggete" ut. Husk at flaggformatet er PST{...}
Vis hele sitatet...
Har nok lett for å tenke litt for avansert ja..
SPOILER ALERT! Vis spoiler
Skammer meg nesten over å ikke ha sett med en gang hva disse tallene kunne representere...

Var innom alt fra franske seilbåter til kinesisk cryptosoftware, før det plutselig gikk opp for meg..
Sitat av Lanjelin Vis innlegg
Har nok lett for å tenke litt for avansert ja..
SPOILER ALERT! Vis spoiler
Skammer meg nesten over å ikke ha sett med en gang hva disse tallene kunne representere...

Var innom alt fra franske seilbåter til kinesisk cryptosoftware, før det plutselig gikk opp for meg..
Vis hele sitatet...

For ikke å nevne astronomi