🌟 Advent of Code (AoC) 2021 🌟

PermalÀnk
Medlem ★
●
Skrivet av medbor:

Ska testa detta för första gÄngen... mÄste fÄ upp en miljö bara

Om du kör Python skulle du kunna anvÀnda Google Colab. Jag har inte anvÀnt det men vscode.dev finns ocksÄ och det finns stöd för en del sprÄk.

PermalÀnk
Medlem ★
●

Brukar alltid börja frÄn dag 1, men ge upp halvvÀgs.
MÄlet brukar alltid var att lÀgga sÄ lite tid som möjligt, men efter ett par dagar sÄ Àr det nÀstan enbart pÄbyggnadsövningar, vilket blir trÄkigt nÀr jag snabbt haffsat ihop nÄgot tidigare dagar.

PermalÀnk
Medlem ★
●
Skrivet av GannTrader:

Aha mÄste tydligen vara inloggad för att kunna se detta.

Yes. Din input Àr kopplad till din Session Cookie.

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●

Oh well. Jag var ju med förra Äret, ska nog vara med igen. Denna gÄng blir det pÄ Dart.

PermalÀnk
Skrivmaskin ★
●

Jag hade inte tid efter dag 10 förra Äret, och dÄ blev det Python eftersom det Àr det enda jag Àr hyfsat bekvÀm med. MÄlet Àr att hoppa över till C++ och ta mig hela fram till jul den hÀr drabbningen, men vi fÄr se hur det gÄr!

PermalÀnk
●

Ahh det börjar i övermorgon redan. Det blir python som vanligt för mig men orkar jag sÄ ska jag försöka porta lösningarna till Typescript dÀrefter. Ska försöka vara med frÄn klockan 06.00 men fÄr se hur mÄnga dagar man hÄller ut

PermalÀnk
Medlem
●

Förra Äret skrev jag de dagar jag hade tiden att vara med i python. Inte riktigt sÀker pÄ vad det blir i Är, Men dÄ Go-lang blivit lite av en ny kÀrlek under Äret sÄ lutar det starkt Ät Go

Visa signatur

Make the world a better place, make it open source

PermalÀnk
Medlem ★
●

För min del sÄ ska jag köra det i Python för att lÀra mig. Jobbar som fysiker och anvÀnder uteslutande Matlab (har kört tidigare Ärs AoC i Matlab till min brors förskrÀckelse), men försöker migrera över till nÄgot lite mer open source sÄ min forskning blir mer tillgÀnglig för dom som vill köra min kod.

Visa signatur

ASUS ROG Strix B650E-F Gaming WIFI | 2 TB Kingston Fury M.2 NVMe SSD | 32 GB Kingston DDR5 | Rysen 7 7800x3D | ASUS GeForce RTX 4070 12 GB | Fractal Design North

PermalÀnk
Medlem ★
●
Skrivet av Dakkie:

För min del sÄ ska jag köra det i Python för att lÀra mig. Jobbar som fysiker och anvÀnder uteslutande Matlab (har kört tidigare Ärs AoC i Matlab till min brors förskrÀckelse), men försöker migrera över till nÄgot lite mer open source sÄ min forskning blir mer tillgÀnglig för dom som vill köra min kod.

Ett annat sprÄk som uppskattas av fysiker Àr Julia, men Àn sÄ lÀnge nÄr du mÄnga fler med Python förstÄs

PermalÀnk
Medlem ★
●

Nu var jag för lat för att googla. Har hört talas om detta, men vet inte riktigt vilka sprÄk det riktar in sig pÄ.

Jag har programmerat Java, PHP, C++ i 10 Är. Inte jÀttemycket lÀngre.

Fungerar det att delta med ovan kunskaper, dÀr 80% av all erfarenhet ligger inom JAVA.

MVH
Jag

Visa signatur

[IT-Dept]
Ryzen 5700x - 32 - 1070

PermalÀnk
Medlem ★
●
Skrivet av AllMessedUp:

Nu var jag för lat för att googla. Har hört talas om detta, men vet inte riktigt vilka sprÄk det riktar in sig pÄ.

Jag har programmerat Java, PHP, C++ i 10 Är. Inte jÀttemycket lÀngre.

Fungerar det att delta med ovan kunskaper, dÀr 80% av all erfarenhet ligger inom JAVA.

MVH
Jag

PoÀngen Àr att man ska kunna anvÀnda vilket sprÄk som helst i princip

PermalÀnk
Medlem ★
●

Har tidigare tvÄ Är kört powershell men har bara kommit till dag 6-ish. Brukar gÄ bra i början men nÀr det kommer lite svÄrare uppgifter och man inte hinner lösa dom samma dag sÄ man hamnar efter mer och mer blir det tröttsamt till slut. Sen förr eller senare kommer verkligheten ifatt en ocksÄ

Kommer köra python i Är istÀllet för att komma in mer i det. Har nött lite codewars under Äret frÄn och till för att fÄ lite erfarenhet av att lösa den hÀr typen av uppgifter. Nu var det visserligen ett tag sen sÄ kanske skulle börja vÀrma upp lite innan kl.05

Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

TrÄd frÄn 2018.
TrÄd frÄn 2019.
TrÄd frÄn 2020.

Nytt Ă„r, nya möjligheter att tagga till och ta alla 50 stjĂ€rnor! ✹ Tack @Dimestam för pĂ„minnelsen om att det Ă€r dags för 2021 Ă„rs AoC-trĂ„d. I Ă„r kommer jag inte ha möjlighet att köra alla luckor vid publicering, men jag firar jul hos svĂ€rförĂ€ldrarna och hoppas ha tid att göra problemen dĂ„!

INSTRUKTIONER

Vi fortsÀtter nyttja samma leaderboard som förr.
Leaderboard: 115994-59705230

InlÀggsform
Dag:
SprÄk:
Lösning:

Om du vill dela med dig av kod, anvÀnd [spoiler]-taggar.

Vi kan vÀl börja med att ge lite tips och rÄd till eventuella nytillkomna?

Som förra Äret Àr mitt bÀsta rÄd, som man bör göra redan innan 1a december, att kolla pÄ föregÄende Ärs AoC och skriva boiler-plate-kod för inlÀsning/parsning av data. MÄnga ovÀrderliga minuter per dag kommer Àgnas detta, om man inte har en hyffsat flexibel mall att följa.

Dag: 1
SprÄk: Python 3
Lösning: GitHub

Jag var sÄ exalterad över att fÄ komma igÄng att jag tillredde kaffet pÄ fel sÀtt.... Aja.

Tabbade mig rejÀlt med ett indenteringsfel... Jag skrev först

def solution_1(input): prev_depth = 0 num_inc = 0 for v1 in input: if v1 > prev_depth: num_inc += 1 prev_depth = v1 return num_inc - 1

Notera nÀst sista raden... jag tÀnkte att djupet bara skulle uppdateras med avseende pÄ tidigare djupaste djupet; men i texten stÄr det ju tydligt att vi alltid bryr oss om senaste djupet.

Dold text
Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
●

Dag: 1
SprÄk: Scala

Om nÄgon vill se hur en lösning i Scala kan se ut.

println(readLines("1/data.txt") .map(_.toInt) .sliding(3).map(_.sum) .sliding(2) .count { case Seq(sum1, sum2) => sum1 < sum2 })

Dold text
PermalÀnk
Medlem
●

Dag: 1
SprÄk: Dyalog APL & Scala

Koden för del 1 i scala skrev copilot helt sjÀlv efter en kort kommentar

Dyalog APL: d←⍎¹⊃⎕nget'1.txt'1 +/2</d +/2</3+/d Scala: val input = Using.resource(Source.fromFile("""1.txt"""))(_.getLines().flatMap(_.toIntOption).toList) input.sliding(2).count(x => x.head < x.last) input.sliding(3).map(_.sum).sliding(2).count(x => x.head < x.last)

Dold text
Kotare dyalogkod - dumt att skriva kod innan man vaknat ordentligt
PermalÀnk
●

Dag: 1
SprÄk: Nim
Lösning: Github

I Är ska jag försöka att skriva lite mer ÄteranvÀndbar kod och inte bara slÀnga in allt i en enda funktion.

PermalÀnk
Medlem ★
●
Skrivet av jclr:

Dag: 1
SprÄk: Dyalog APL

Dyalog APL: d←⍎¹⊃⎕nget'1.txt'1 +/0>2-/d +/0>2-/3+/d

Dold text

AlltsÄ, det ser ju bedrövligt ut. Kan du förklara vad de olika tecknen stÄr för?

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem
●

En kompakt lösning i groovy 3.

Input finns sparad i filen "data".

def data = ("data" as File).text.split('\n').collect { s -> Integer.parseInt(s) }
println data.withIndex().count { v,i -> i > 0 && v > data[i-1] }

Dold text

Algorithm:

  1. read the data.

  2. count the number of data points where index > 0 and value > (value on previous index).

PermalÀnk
Medlem
●

Dag: 1
SprÄk: Go
Lösning: Github

package main import ( "bufio" "fmt" "os" "strconv" ) func part1(numbers []int) int { result := 0 for i := 1; i < len(numbers); i++ { if numbers[i] > numbers[i-1] { result++ } } return result } func part2(numbers []int) int { result := 0 for i := 0; i < len(numbers); i++ { if len(numbers)-i == 3 { break } else if numbers[i]+numbers[i+1]+numbers[i+2] < numbers[i+1]+numbers[i+2]+numbers[i+3] { result++ } } return result } func getMeasurements() []int { file, _ := os.Open("input.txt") defer file.Close() scanner := bufio.NewScanner(file) var numbers []int for scanner.Scan() { x, _ := strconv.Atoi(scanner.Text()) numbers = append(numbers, x) } return numbers } func main() { numbers := getMeasurements() fmt.Println("Part one", part1(numbers)) fmt.Println("Part two", part2(numbers)) }

Dold text

Började precis lÀra mig Go och tycker det Àr ett vÀldigt trevligt sprÄk. Inte vÀrldens snyggaste lösning men funkar.

PermalÀnk
Medlem ★
●
Skrivet av cjal:

Dag: 1
SprÄk: Go
Lösning: Github

package main import ( "bufio" "fmt" "os" "strconv" ) func part1(numbers []int) int { result := 0 for i := 1; i < len(numbers); i++ { if numbers[i] > numbers[i-1] { result++ } } return result } func part2(numbers []int) int { result := 0 for i := 0; i < len(numbers); i++ { if len(numbers)-i == 3 { break } else if numbers[i]+numbers[i+1]+numbers[i+2] < numbers[i+1]+numbers[i+2]+numbers[i+3] { result++ } } return result } func getMeasurements() []int { file, _ := os.Open("input.txt") defer file.Close() scanner := bufio.NewScanner(file) var numbers []int for scanner.Scan() { x, _ := strconv.Atoi(scanner.Text()) numbers = append(numbers, x) } return numbers } func main() { numbers := getMeasurements() fmt.Println("Part one", part1(numbers)) fmt.Println("Part two", part2(numbers)) }

Dold text

Började precis lÀra mig Go och tycker det Àr ett vÀldigt trevligt sprÄk. Inte vÀrldens snyggaste lösning men funkar.

Kul! Jag körde Go förra Äret [GitHub]. Var vÀldigt trevligt, mÄnga gÄnger.

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●

första gÄngen jag hoppar pÄ detta, verkar kul! Lösning i MATLAB:

depth Àr vektor med data

length(find(diff(depth) > 0))

Dold text

Kanske Äterkommer om jag lyckas i Python ocksÄ

Visa signatur

[Acase El Diablo][Intel Core I7 920][Moderkort Asus P6T Deluxe][3GB kit OCZ ddr 1333mhz][Asus HD4870x2][Corsair Powersupply 650W][1xSamsung Spinpoint 640gb][Windows Vista ultimate 64bit]

PermalÀnk
Medlem
●
Skrivet av GLaDER:

AlltsÄ, det ser ju bedrövligt ut. Kan du förklara vad de olika tecknen stÄr för?

LĂ€s frĂ„n höger till vĂ€nster. APL har en typ av datastruktur, Arrayer som Ă€r 1-indexerade som standard (⎕IO←0 Ă€ndrar till 0-indexerad).
Alla inbyggda funktioner och operatorer i APL Àr endast en symbol. Funktioner tar ett (monadisk) eller tvÄ (dyadisk) argument som Àr arrayer. Operatorer "modifierar" funktioner och finns ocksÄ i monadiska/dyadiska versioner.

d←⍎¹⊃⎕nget'1.txt'1 - LĂ€s in textfil, omvandla till siffror och spara till d

⎕nget '1.txt' 1 - Returnerar en array som innehĂ„ller tre vĂ€rden: (innhĂ„llet i filen som en array av teckenarrayer, encoding, newline tecken)

⊃ First - Plockar ut första vĂ€rdet i arrayen

⊃ 1 2 3 1 ⊃ 'abc' a ⊃ 'abc' 'def' 'ghi' 'abc'

š Each/Map - Är en operator som tar en funktion till vĂ€nster och utför den pĂ„ alla element i arrayen till höger

⊃¹'abc' 'def' 'ghi' adg

⍎ Execute expression - Kör innehĂ„llet i den efterföljande teckenarrayen som APL kod, anvĂ€nds för att omvandla teckenarrayen '42' till 42 som ett nummer.

⍎ '21×2' 42 ⍎ '42' 42 ⍎¹'1' '12' '123' 1 12 123

← Assignment

d ← 1 2 3 d 1 2 3 s ← 'foo' s foo

/ Reduce - Operator som tar en funktion till vÀnster och petar in den mellan varje element i arrayen till höger f/1 2 3 4 5 = 1 f 2 f 3 f 4 f 5

+/1 2 3 4 5 15

/ N-Wise Reduce - Samma som reduce men tar en fönsterstorlek till vÀnster ocksÄ. 3f/1 2 3 4 5 = (1 f 2 f 3) (2 f 3 f 4) (3 f 4 f 5)

2+/1 2 3 4 5 3 5 7 9 3+/1 2 3 4 5 6 9 12

> Greater Than - Funktioner i apl Àr storlekspolymorfa. Man kan tex jÀmföra en skalÀr (1 element array) med alla element i en annan array eller parvis om man har tvÄ lika stora arrayer.

5 > 1 1 5 > 1 8 4 9 1 0 1 0 1 8 4 9 > 5 0 1 0 1 2 9 3 8 > 1 8 4 9 1 1 0 0

Om man bygger upp lösningen för del 2 steg för steg med testdata sÄ ser det ut sÄ hÀr:

d←199 200 208 210 200 207 240 269 260 263 d 199 200 208 210 200 207 240 269 260 263 3+/d 607 618 618 617 647 716 769 792 2-/3+/d ¯11 0 1 ¯30 ¯69 ¯53 ¯23 0>2-/3+/d 1 0 0 1 1 1 1 +/0>2-/3+/d 5

Kortare/bÀttre/enklare lösning som anvÀnder less than reduce istÀllet för minus och jÀmföra med 0.
Jag Ă€ndrade först +/0>2-/3+/d till +/2>⍚/3+/d eftersom jĂ€mförelsen med noll Ă€r onödig men dĂ„ kommer argumenten till > i fel ordning. APL har en operator ⍚ som byter plats pĂ„ argumenten vilket Ă€r den sjĂ€lvklara lösningen om man inte alls tĂ€nker. Naturligtvis Ă€r </ (less than reduce) bĂ€ttre Ă€n >⍚/ (greater than reduce med swappade argument).

d←199 200 208 210 200 207 240 269 260 263 d 199 200 208 210 200 207 240 269 260 263 3+/d 607 618 618 617 647 716 769 792 2</3+/d 1 0 0 1 1 1 1 +/2</3+/d 5

Det gÄr att köra koden pÄ tryapl.org utan att ladda ner dyalog.

Dold text
PermalÀnk
Medlem ★
●
Skrivet av jclr:

LĂ€s frĂ„n höger till vĂ€nster. APL har en typ av datastruktur, Arrayer som Ă€r 1-indexerade som standard (⎕IO←0 Ă€ndrar till 0-indexerad).
Alla inbyggda funktioner och operatorer i APL Àr endast en symbol. Funktioner tar ett (monadisk) eller tvÄ (dyadisk) argument som Àr arrayer. Operatorer "modifierar" funktioner och finns ocksÄ i monadiska/dyadiska versioner.

d←⍎¹⊃⎕nget'1.txt'1 - LĂ€s in textfil, omvandla till siffror och spara till d

⎕nget '1.txt' 1 - Returnerar en array som innehĂ„ller tre vĂ€rden: (innhĂ„llet i filen som en array av teckenarrayer, encoding, newline tecken)

⊃ First - Plockar ut första vĂ€rdet i arrayen

⊃ 1 2 3 1 ⊃ 'abc' a ⊃ 'abc' 'def' 'ghi' 'abc'

š Each/Map - Är en operator som tar en funktion till vĂ€nster och utför den pĂ„ alla element i arrayen till höger

⊃¹'abc' 'def' 'ghi' adg

⍎ Execute expression - Kör innehĂ„llet i den efterföljande teckenarrayen som APL kod, anvĂ€nds för att omvandla teckenarrayen '42' till 42 som ett nummer.

⍎ '21×2' 42 ⍎ '42' 42 ⍎¹'1' '12' '123' 1 12 123

← Assignment

d ← 1 2 3 d 1 2 3 s ← 'foo' s foo

/ Reduce - Operator som tar en funktion till vÀnster och petar in den mellan varje element i arrayen till höger f/1 2 3 4 5 = 1 f 2 f 3 f 4 f 5

+/1 2 3 4 5 15

/ N-Wise Reduce - Samma som reduce men tar en fönsterstorlek till vÀnster ocksÄ. 3f/1 2 3 4 5 = (1 f 2 f 3) (2 f 3 f 4) (3 f 4 f 5)

2+/1 2 3 4 5 3 5 7 9 3+/1 2 3 4 5 6 9 12

> Greater Than - Funktioner i apl Àr storlekspolymorfa. Man kan tex jÀmföra en skalÀr (1 element array) med alla element i en annan array eller parvis om man har tvÄ lika stora arrayer.

5 > 1 1 5 > 1 8 4 9 1 0 1 0 1 8 4 9 > 5 0 1 0 1 2 9 3 8 > 1 8 4 9 1 1 0 0

Om man bygger upp lösningen för del 2 steg för steg med testdata sÄ ser det ut sÄ hÀr:

d←199 200 208 210 200 207 240 269 260 263 d 199 200 208 210 200 207 240 269 260 263 3+/d 607 618 618 617 647 716 769 792 2-/3+/d ÂŻ11 0 1 ÂŻ30 ÂŻ69 ÂŻ53 ÂŻ23 0>2-/3+/d 1 0 0 1 1 1 1 +/0>2-/3+/d 5 +/2>⍚/3+/d ⍝ ett tecken kortare lösning 5

Det gÄr att köra koden pÄ tryapl.org utan att ladda ner dyalog.

Dold text

KÀre vÀrld. Bra jobbat!

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●

Dag: 1
Ytterligare en Python

l = [int(i.strip()) for i in open("input1").readlines()] print(sum([x < y for x, y in zip(l[:-1], l[1:])])) print(sum([x < y for x, y in zip(l[:-3], l[3:])]))

Dold text
Lade till vilken dag. Det borde finna en mall :)
PermalÀnk
Medlem ★
●

Min högst amatörmÀssiga lösning i Python för dag 1

def read_input(): input = [] with open('day1_input.txt') as file: for line in file: input.append(int(line)) return input def part_one(input): increase = 0 prev_max = 0 for v in input: if v > prev_max: increase += 1 prev_max = v return increase - 1 def part_two(input): prev_max = 0 increase = 0 for i in range(len(input)): if i > len(input) - 3: break # avoid out of range res = input[i] + input[i + 1] + input[i + 2] if res > prev_max: increase += 1 prev_max = res return increase - 1 print('Part 1:', part_one(read_input())) print('Part 2:', part_two(read_input()))

Dold text
Visa signatur

EndeavourOS: Your search for the best Arch distro ends here
7800X3D » RX6950XT » G.SKILL 32GB » LG OLED42C35LA

PermalÀnk
Medlem ★
●
Skrivet av immutable:

Min högst amatörmÀssiga lösning i Python för dag 1

def read_input(): input = [] with open('day1_input.txt') as file: for line in file: input.append(int(line)) return input def part_one(input): increase = 0 prev_max = 0 for v in input: if v > prev_max: increase += 1 prev_max = v return increase - 1 def part_two(input): prev_max = 0 increase = 0 for i in range(len(input)): if i > len(input) - 3: break # avoid out of range res = input[i] + input[i + 1] + input[i + 2] if res > prev_max: increase += 1 prev_max = res return increase - 1 print('Part 1:', part_one(read_input())) print('Part 2:', part_two(read_input()))

Dold text

Det enda jag skulle sÀga Àr amatörmÀssigt med den hÀr lösningen Àr din break. Du kan loopa till range(len(input)-3) istÀllet Annars tycker jag det hÀr Àr en lÀttlÀst, lÀttförstÄelig, och vÀldisponerad lösning.

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Det enda jag skulle sÀga Àr amatörmÀssigt med den hÀr lösningen Àr din break. Du kan loopa till range(len(input)-3) istÀllet Annars tycker jag det hÀr Àr en lÀttlÀst, lÀttförstÄelig, och vÀldisponerad lösning.

FÄr hÄlla med om lÀttlÀst, men det finns detaljer som skulle kunna vara förvirrande. Kan man slippa subtraktionen med 1 i return?

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Det enda jag skulle sÀga Àr amatörmÀssigt med den hÀr lösningen Àr din break. Du kan loopa till range(len(input)-3) istÀllet Annars tycker jag det hÀr Àr en lÀttlÀst, lÀttförstÄelig, och vÀldisponerad lösning.

Tack för din input! Och ja sÄklart att man kan anvÀnda range(len(input)-3) istÀllet! Stod still i huvudet nÀr jag skrev det

Visa signatur

EndeavourOS: Your search for the best Arch distro ends here
7800X3D » RX6950XT » G.SKILL 32GB » LG OLED42C35LA

PermalÀnk
Medlem ★
●
Skrivet av Ingetledigtnamn:

FÄr hÄlla med om lÀttlÀst, men det finns detaljer som skulle kunna vara förvirrande. Kan man slippa subtraktionen med 1 i return?

Ja det kan man sÀkert, men jag ansÄg detta vara den lÀttaste lösningen för stunden. Jag Àr öppen för förslag dock, Àr vÀldigt mycket nybörjare

Visa signatur

EndeavourOS: Your search for the best Arch distro ends here
7800X3D » RX6950XT » G.SKILL 32GB » LG OLED42C35LA

PermalÀnk
Medlem ★
●
Skrivet av immutable:

Ja det kan man sÀkert, men jag ansÄg detta vara den lÀttaste lösningen för stunden. Jag Àr öppen för förslag dock, Àr vÀldigt mycket nybörjare

Varför behöver du dra bort ett?