Inlägg

Inlägg som Ingetledigtnamn har skrivit i forumet
Av Ingetledigtnamn

@Mickur: I mitt indata förekom samma directory-namn på olika ställen i trädet. Kan du hantera det?

Av Ingetledigtnamn

Dag: 7
Språk: Python

I dag var jag tvungen att byta version på Ubuntu i WSL för att få Python 3.10. Denna uppgift blev så mycket enklare med match...

from collections import defaultdict import os contains = defaultdict(lambda:[]) sizes = defaultdict(lambda:0) def read_dirs(pwd = ""): for l in open("input07").readlines(): match l.strip().split(): case ['$', 'cd', d]: match d: case "..": pwd = os.path.dirname(pwd) case d: pwd = os.path.join(pwd, d) case ['$', 'ls']: pass case ['dir', d]: contains[pwd].append(os.path.join(pwd, d)) case [size, _]: sizes[pwd] += int(size) def add_subdirs(d): for i in contains[d]: add_subdirs(i) sizes[d] += sizes[i] read_dirs() add_subdirs("/") print(sum([sizes[d] for d in sizes if sizes[d] < 100000]), min([s for s in sizes.values() if 70000000 - sizes['/'] + s >= 30000000]))

Dold text
Av Ingetledigtnamn
Skrivet av Thex:

Skulle säga att Fringe var en sådan serie, där jag tyckte piloten var fantastiskt men resten var rätt tråkigt.

HUr långt såg du? Första säsongen var lite av en X-Files-wannabe och inte särskilt bra. Sedan tar det fart och Fringe blir en av de bättre serierna jag sett. Efter hand får till och med de avsnitten i säsong 1 som kändes som ren utfyllnad lite förklaringar och det var motiverat att de var där.

Av Ingetledigtnamn
Skrivet av Yoshman:

Intressant att explicit unrolling ger sådan utväxling! Känns som det fortfarande finns förbättringspotential i Go-kompilatorn...

Går att snabba upp en lite mer generell variant m.h.a. bit-operationer

Dold text

Maskningen testar mot alla tidigare lästa tecken i en operation, men när man får en träff så undviker man att läsa de kvarvarande av de 14 tecknen från minne vilka @Flexbert redan hade läst in före testerna. Din loop gör sannolikt livet lättre för branch prediction också.

Dold text
Av Ingetledigtnamn

Dag: 6
Språk: Python (oneliner)

print([(lambda n, s: [i + n for i in range(len(s)) if len(set(s[i:i+n ])) == n][0]) (n, open("input06").read()) for n in [4, 14]])

Dold text
Av Ingetledigtnamn

Dag: 5
Språk: Python

import re def read_creates(f): crates = ["" for _ in range(9)] while l := f.readline().strip('\n'): crates = [crates[i] + c for i, c in enumerate(l[1::4])] return [""] + [c[:-1][::-1].strip() for c in crates] def read_moves(f): return [map(int, re.findall(r'\d+', l)) for l in f.readlines()] def do_moves(crates, moves, reverse): for n, f, t in moves: crates[t] = crates[t] + crates[f][-n:][::reverse] crates[f] = crates[f][:-n] return crates def day05(reverse): with open("input05", "r") as f: crates = do_moves(read_creates(f), read_moves(f), reverse) return("".join([c[-1] for c in crates[1:]])) print([day05(r) for r in [-1, 1]])

Dold text
Av Ingetledigtnamn

Dag: 4
Språk: Python (oneliner)

print([sum([(lambda l1, h1, l2, h2, f: f(set(range(l1, h1 + 1)), set(range(l2, h2 + 1))))(*map(int, l.replace("-", ",").split(",")), f) for l in open("input04").readlines()]) for f in [lambda r1, r2: r1 & r2 in [r1, r2], lambda r1, r2: bool(r1 & r2)]])

Inte världens mest effektiva lösning med tanke på att jag genererar ett set med alla medlemmar i båda rangerna, men logiken blir ganska enkel. Sedan gör jag det två gånger.

Dold text
Av Ingetledigtnamn

Dag: 3
Språk: Python (Det hade gått att göra en oneliner av denna också, men jag bröt ut en funktion för läsbarhetens skull )

from functools import reduce def prio(s): return x - 96 if (x := ord(next(iter(s)))) > 96 else x - 38 packs = open("input03").read().split('\n') print(sum([prio([set(bp[:l]) & set(bp[l:]) for l in [len(bp) // 2]][0]) for bp in packs]), sum([prio(reduce(set.intersection, map(set,x))) for x in zip(packs[::3],packs[1::3],packs[2::3])]))

Dold text
Av Ingetledigtnamn

The Peripheral på Amazon Prime. SF baserat på William Gibsons bok och producerat av Lisa Joy och Jonathan Nolan (Westworld). Kan väl inte gå fel? Klart sevärt, 8.5/10.

Av Ingetledigtnamn
Skrivet av jclr:

Dag:2
Språk: Dyalog APL

A B C X Y Z←6⍴1-⍨⍳3 d←↑⍎¨⊃⎕NGET'2.txt'1 +/{⍵+1+3×3|1+⍵-⍺}/d ⍝ del1 +/{(⍵×3)+1+3|2+⍵+⍺}/d ⍝ del2

Dold text

Kan du berätta vad det gör? Jag tyckte mitt pythonhack skulle vara svårt tyda för den som inte skrivit det, men detta...

Av Ingetledigtnamn

Dag: 2
Språk: Python (oneliner)

print([sum([(lambda x,y,f: "XYZXY"["BCA".find(x):].find(f(x, y)) * 3 + " XYZ".find(f(x, y)))(*e, f) for e in [p.split() for p in open("input02").read().split('\n')]]) for f in [ lambda x, y: y, lambda x, y: "XYZXY"["BCA".find(x) + "XYZ".find(y)]]])

Dold text
Av Ingetledigtnamn

Dag: 1
Språk: Python 3

[sum(sorted(sum(map(int,e.split())) for e in open("input01").read().split('\n\n'))[-n:]) for n in [1,3]]

Dold text
Av Ingetledigtnamn

Red Dead Redemption 2 fick mig byta grafikkort (2070Super).

Av Ingetledigtnamn
Skrivet av perost:

Fast det är inte kylarens fel, det är fläktstyrningen på moderkortet som är problemet då. Man får ställa in en bättre fläktkurva, och det brukar även finnas inställningar för hysteres så att den inte reagerar lika snabbt på ändringar.

Jo, visst kan jag ställa in att fläkten inte går upp i varv så fort, men det betyder då å andra sidan att processorn sannolikt kommer upp i temperaturer så att thermal throttling sätter in.

Hela poängen med Noctuan var ju att den kylde bra och att den var tyst. Nu kunde jag välja på antingen eller...

Av Ingetledigtnamn

Jag rekommenderar en AIO-lösning. Till min 12900k körde jag med en Noctua NH-D15 från min förra burk. Jag höll ut ett par dagar innan jag bytte till en Be quiet Silent Loop 2. Noctua-fläkten gjorde ett toppenjobb på min gamla 6700k men 12900k skiftar i temperatur mycket fortare så ena sekunden var fläktarna helt tysta och sedan gick de i fullt blås en kort stund för att sedan gå ner till helt tyst igen, fullt blås, tyst, osv. Det var bara för störande.

Om du vill ha ett tyst bygge, köp inte en luftkylare.

Av Ingetledigtnamn

Nu är det lite knepigt att se vad koden gör eftersom den inte är korrekt indenterad. Du borde ha code-taggar runt.

[code]
din kod
[/code]

Om koden i sig kan jag säga att du tänkt rätt och är på god väg, men...

Funktionen dec2bin räknar ut om det skall vara en etta eller nolla, och skriver ut den siffran, men när du använder dig av dec2bin ser det ut som att du vill att den skall returnera ett värde snarare än att skriva ut det.

När du kollat om invarde är korrekt så tilldelar du bitvarde funktionen dec2bin (japp, det kan man göra i Python). Jag tror att du vill anropa funktionen istället: bitvarde = dec2bin(invarde, 8)

Av Ingetledigtnamn

Planescape: Torment är värt 20€ bara det. De övriga spelen är ren bonus.

Av Ingetledigtnamn

Sommarens skörd av brittiska deckare innehåller bland annat

Kommisarie Venn - Mord på brittiska landsbygden.

I min dotters namn - Mord i Dublin.

Grace - Mord i Brighton.

Alla tre är helt OK brittiska deckare på SVTplay. Inte världens bästa, men väl värda att se (7/10 för alla tre).

The Responder Gav upp efter första avsnittet. Lite för mycket diskbänksrealism. Inte riktigt vår stil.

Av Ingetledigtnamn
Skrivet av heretic16:

Titta på denna.
https://pastebin.com/eV3EqC1r

Jämför med denna
https://pastebin.com/bCLFE796

Du får gärna komma med förbättringar.

Jag måste hålla med Yoshman. Det finns bibliotek som gör detta åt dig. Men tillbaka till din din kod...

Vad förväntar du dig att kompilatorn skall göra med din kod? En av de klassiska optimeringarna som hanterar loopar brukar kallas loop strength reduction eller induktionsvariabeleliminering. Då skriver man om addressuttrycket från

for (int i = 0; i < n; ++i) a[i] *= 2;

till

for (iny *p = &a[0], tmp = n; --i; p += sizeof(a[0])) *p *= 2;

Denna stammar från den tid då multiplikationer var dyra (a[i] betyder ju egentligen *(&a[0] + i * sizeof(a[0]))) och man ville bli av med dem. Huruvida den gör någon nytta i dagsläget eller inte beror på om processorn har lämpliga instruktioner för array-adressering eller inte, storleken på steget, om det finns adresseringsmoder så p-inkrementet kan göras som en post-inc, osv. Och kör man sedan på en out-order-processor så vet man ändå vad som blir bäst. En kodsekvens med färre instruktioner är inte nödvändigvis snabbare än en med fler instruktioner.

Optimeringen bygger på att kompilatorn kan hitta en formel för det linjära sambandet (y = k * x + m) mellan adressen och indexuttrycket.

I din nästlade loop

for (int i = 0; i < n; ++i) for (int j = 0; i < n; ++i) a[i * n + j] *= 2;

är det uppenbart för dig och mig att det finns ett linjärt samband mellan i och j och att index rör sig mellan 0 och n*n, men varken GCC eller clang verkar se det.
Du skulle kunna skriva om loopen som

for (int i = 0; i < n * n; ++i) a[i] *= 2;

men det funkar inte så bra i de fallen du dessutom vill indexera med j.

Tyvärr har jag inget svar på vad skall göra men du kanske fick lite mer kött på benen om varför det inte blir som du vill. Om du nu ville det jag trodde att du ville

Av Ingetledigtnamn

OK, du vann, du skriver så bra kod att kompilatorn inte kan göra någonting åt den. Å andra sidan, är koden väldigt dålig är det också svårt för kompilatorn att göra någonting åt den.

Är din workload I/O-bound lär du inte se någon som helst effekt av kompilatoroptimeringar. Men att i det sammanhanget dra slutsatsen att de är verkninglösa är kanske inte helt korrekt. Om vi pratar om hur effektiva kompilatoroptimeringar är så är det givetvis en compute-bound workload vi pratar om.

Om inte @Thomas länk dög för att övertyga dig om optimeringar gör nytta så hittade jag några andra. Om du exempelvis kikar på https://www.diva-portal.org/smash/get/diva2:1114115/FULLTEXT0... så ser det ut som om skillnaderna mellan optimering och ingen optimering kan vara upp till 10 gånger (1000%!). Nu är detta små välkända bänkmärken så vi kan ju gissa att kompilatorskrivarna har kikat på dem och sett till att de kan optimera just den koden bra Men för andra, större, program har det observerat skillnader på 50 - 150% förbättring mellan -O0 och -O3. https://www.osti.gov/servlets/purl/1376448.

Kompilatoroptimeringar är inte verkningslösa.