[-] [email protected] 1 points 3 days ago

Yes, most times gamescope isn't required. Thing is, sometimes it is and not having the option is an inconvenience in the best case and makes games unplayable in the worst case.

[-] [email protected] 2 points 4 days ago

My partner is currently running PopOS. They somehow managed to combine the chronically outdated Ubuntu packages with a rather counterintuitive UI.
Updates frequently fail, commonly used packages like gamescope aren't available, overall wouldn't recommend.

[-] [email protected] 3 points 5 days ago

Had it on my Fairphone 4 for a while, but was put off by the very iOS look-and-feel. Ditched it on favour of Lineage.

29
submitted 1 month ago by [email protected] to c/[email protected]

First tent-grow. Zkittlez OG Auto from Barney's Farm. Today marks day 70 since putting the seed into the peat pad. I expect maybe a week more. Two, tops.

12
Stuck on day 6, part 2 (sh.itjust.works)
submitted 5 months ago* (last edited 5 months ago) by [email protected] to c/[email protected]

I'm not looking for a solution or even code, just a hint. Here's what I currently do:

  1. Add the current position and heading to the recorded path
  2. Check if turning right would lead back onto the recorded path in the same direction we walked it before
  3. Check if the next field is obstructed
    1. If so, turn right
    2. Repeat until no longer blocked
  4. Update current position

This approach works fine for the unit test, but yields a result too low for the puzzle input. I tried adding recursion to the party check, but even 20 levels of recursion didn't sufficiently increase the amount of options found, suggesting I'm missing a mechanism to identify them.

Any clues?

Current state of affairs:

from math import sumprod
from operator import add
from pathlib import Path


def parse_input(input: str) -> list[list[int]]:
    return input.strip().splitlines()


def find_guard(world: list[list[int]]) -> tuple[int]:
    for y, line in enumerate(world):
        x = line.find("^")
        if x > -1:
            return (y, x)
    return (-1, -1)  # No guard


def turn(heading: tuple[int]) -> tuple[int]:
    mat = [(0, 1), (-1, 0)]
    return tuple([sumprod(col, heading) for col in mat])


def step(pos: tuple[int], heading: tuple[int]) -> tuple[int]:
    return tuple(map(add, pos, heading))


def is_blocked(world: list[list[str]], guard: tuple[int], heading: tuple[int]) -> bool:
    pos = step(guard, heading)
    try:
        return world[pos[0]][pos[1]] == "#"
    except IndexError:
        return False


def cast_ray(
    world: list[list[int]], start: tuple[int], heading: tuple[int]
) -> list[tuple[int]]:
    pos = step(start, heading)
    ray = []
    try:
        while world[pos[0]][pos[1]] != "#":
            ray.append(pos)
            pos = step(pos, heading)
    except IndexError:
        # Left the world
        ...
    return ray


def part_one(input: str) -> int:
    world = parse_input(input)
    guard = find_guard(world)
    heading = (-1, 0)
    while (
        guard[0] >= 0
        and guard[0] < len(world)
        and guard[1] >= 0
        and guard[1] < len(world[guard[0]])
    ):
        while is_blocked(world, guard, heading):
            heading = turn(heading)
        world[guard[0]] = f"{world[guard[0]][:guard[1]]}X{world[guard[0]][guard[1]+1:]}"
        guard = tuple(map(add, guard, heading))
    return sum([line.count("X") for line in world])


def part_two(input: str) -> int:
    world = parse_input(input)
    guard = find_guard(world)
    heading = (-1, 0)
    path = {}
    options = 0
    while (
        guard[0] >= 0
        and guard[0] < len(world)
        and guard[1] >= 0
        and guard[1] < len(world[guard[0]])
    ):
        path.setdefault(guard, []).append(heading)
        turned = turn(heading)
        if turned in path.get(guard, []) or turned in [
            d
            for p in set(cast_ray(world, guard, turned)).intersection(set(path.keys()))
            for d in path[p]
        ]:
            # Crossing previous path and turning would cause us to retrace our steps
            # or turning would lead us back into our previous path
            options += 1
        while is_blocked(world, guard, heading):
            heading = turned
        world[guard[0]] = f"{world[guard[0]][:guard[1]]}X{world[guard[0]][guard[1]+1:]}"
        guard = tuple(map(add, guard, heading))
    return options


if __name__ == "__main__":
    input = Path("input").read_text("utf-8")
    print(part_one(input))
    print(part_two(input))
26
100% Rye sourdough (sh.itjust.works)
submitted 8 months ago by [email protected] to c/[email protected]
56
submitted 8 months ago by [email protected] to c/[email protected]

Fermented with black cardamom and garlic (which I'm just noticing I forgot to put on the label 🤷) and puréed with mango and pear.
Added a little rice vinegar and salt to balance the fruit.
It's a little spicier than Sriracha, but not at all unpleasant. Nicely sweet and spicy. You can taste it with a spoon without regretting it.

1
submitted 9 months ago by [email protected] to c/[email protected]
35
submitted 10 months ago by [email protected] to c/[email protected]

I'm trying to get networkd to connect to a wireguard endpoint, specifically ProtonVPN, in case it matters. I just can't get it to connect. Has anyone had success with that? Specifically without using wg-quick.

18
submitted 1 year ago by [email protected] to c/[email protected]
10
submitted 2 years ago by [email protected] to c/[email protected]

Looking for someone to take over our lease for a 3 1/2 apartment in Petite-Patrie (H2S) starting February 1st 2024.
Lease goes until 31st of October 2024 with option of renewal.
Monthly rent is $1665 including hot water and parking behind the house (electric bill is extra).

The apartment was completely renovated in 2018 with new isolation, windows and doors. It is on the ground floor, very quiet and in walking distance to metro stations (Fabre and Beaubien), supermarkets, cafés and shops.
The bedroom and office both have built-in storage closets. You have full access to the garden in the back and can use it as you wish. Cats are no problem but you will have to check for other pets.
Appliances are NOT included in the lease and we bought them new in 2018 (Stove, fridge with freezer drawer, dishwasher, washing machine and dryer). All are good quality appliances (Whirlpool, Maytag) that work great and we'd prefer them taken over from us (price is negotiable).
All our furniture is also up for sale.

Please send me a message if interested.

https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/b1/b15abf7d-2828-4e00-ab1a-c3c5639e3260?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/76/760166c5-2421-4693-90fa-63658fff07cc?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/82/826354e8-a2e8-4246-8cb8-d831eeb1ef9f?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/e6/e6110cdd-c164-4e58-a83d-8f980e23ca5e?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/6f/6fb34ec2-cbc8-47da-9859-beaa414f3f6c?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/3e/3ef5d1ab-7c43-4edc-bcc8-afe22b2c4ce8?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/24/24b6ccd4-1159-48a8-a456-e5530561670c?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/7d/7d683809-d303-43fc-a78b-3e3677731aa2?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/9f/9f9c5d9c-fcc3-43f5-9395-350f4ff76015?rule=kijijica-640-webp
https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/6c/6cd0de76-e63b-4a7c-8e75-54b0d0dd6b5e?rule=kijijica-640-webp

1
WIP cardigan (sh.itjust.works)
submitted 2 years ago by [email protected] to c/[email protected]

Misread the pattern and now I get to redo 16 repeats of 16 rows of cabling plus some moss stitch.
On the plus side I can fix the mistakes I made. And hope I don't make more…

[-] [email protected] 137 points 2 years ago

What do they mean by "fake arrow decals?" They're real arrow decals. Just not helpful ones.

[-] [email protected] 114 points 2 years ago* (last edited 2 years ago)

Microsoft assumes their users are complete idiots, even when they (the users) are actively trying to convince them (Microsoft) otherwise. No matter how advanced the feature may be, they'll assume you found instructions somewhere to do something entirely unrelated and they constantly have to save you from yourself. As a result you constantly have to fight the OS for access and control to get it to do what you want.
If you're even a bit of a power user that is, of course.

But more often than not Microsoft's assumption is probably spot on.

[-] [email protected] 94 points 2 years ago

They vastly overestimated their users' willingness to pay for content and put up with their bullshit.

[-] [email protected] 139 points 2 years ago

No opt out? Expect trouble from the EU.

[-] [email protected] 186 points 2 years ago

And that's why people started sailing the high seas again.

[-] [email protected] 110 points 2 years ago

Du willst keine Photos von dir, die dich beim Spazieren mit Nazis zeigen? DANN GEH NICHT MIT NAZIS SPAZIEREN, DU PFOSTEN!

127
submitted 2 years ago by [email protected] to c/[email protected]

By that I mean randomly generated playlists. Based on either one or multiple tags, songs or artists. Finite or infinite.

Ideally it would allow combining local sources with remote ones for discovering new music. Thinking along the lines of audioscrobbler, Bandcamp and SoundCloud. Maybe one could even hook into Spotify's API, of they allow that.

Does something like this exist? I'm currently running Navidrome and while it's pretty and functional, it's very much a classic Mediaplayer, that just happens to be a website.

[-] [email protected] 110 points 2 years ago

Enjoy your bian, I guess.

9
Pizza Friday (i.imgur.com)
submitted 2 years ago* (last edited 2 years ago) by [email protected] to c/[email protected]

Sourdough crust with tomato sauce, topped with onions, pesto seitan sausage, artichoke, zucchini and cheese and half lemon olives.

[-] [email protected] 119 points 2 years ago

I refused to return to office.

2
submitted 2 years ago* (last edited 2 years ago) by [email protected] to c/[email protected]

Hope this fits here.

[-] [email protected] 92 points 2 years ago* (last edited 2 years ago)

Jesse's absolutely right. The only reason our politicians are governing us is because we let them. Occasionally they need to be reminded of that fact.

view more: next ›

Chais

0 post score
0 comment score
joined 2 years ago