diff --git a/deploy/bots.py b/deploy/bots.py
new file mode 100644
index 0000000..ba95392
--- /dev/null
+++ b/deploy/bots.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python3
+"""Spil et helt spil med bots mod en kørende server (røgtest).
+
+Kør i CT143 (eller lokalt), hvor værts-headeren stoles på fra 127.0.0.1:
+ /opt/wpp/venv/bin/python deploy/bots.py --base http://127.0.0.1:8000 --players 3 --audience 1
+
+Opretter et rum som vært, joiner N spillere og M publikummer, og lader dem lyve,
+gætte og like tilfældigt, indtil spillet er slut. Afslutter med kode 0, hvis alle
+faser blev nået og slutstillingen blev vist.
+"""
+
+import argparse
+import asyncio
+import http.cookiejar
+import json
+import random
+import re
+import sys
+import urllib.parse
+import urllib.request
+
+import websockets
+
+HOST_HEADERS = {"X-authentik-username": "bot-host", "X-authentik-groups": "Familie"}
+
+
+def create_room(base: str) -> str:
+ jar = http.cookiejar.CookieJar()
+ opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
+ req = urllib.request.Request(f"{base}/host/", headers=HOST_HEADERS)
+ html = opener.open(req).read().decode()
+ token = re.search(r'name="csrfmiddlewaretoken" value="([^"]+)"', html).group(1)
+ data = urllib.parse.urlencode({"csrfmiddlewaretoken": token}).encode()
+ req = urllib.request.Request(f"{base}/host/new", data=data, headers={**HOST_HEADERS, "Referer": f"{base}/host/"})
+ resp = opener.open(req)
+ return resp.geturl().rstrip("/").rsplit("/", 1)[-1]
+
+
+async def host(ws_base, code, seen: list, done: asyncio.Event):
+ async with websockets.connect(f"{ws_base}/ws/host/{code}/", additional_headers=HOST_HEADERS) as ws:
+ async for raw in ws:
+ msg = json.loads(raw)
+ if msg["type"] != "state":
+ continue
+ st = msg["state"]
+ if not seen or seen[-1] != st["phase"]:
+ seen.append(st["phase"])
+ extra = st.get("question", {}).get("prompt", "") if st["phase"] == "lie" else ""
+ print(f"[vært] {st['phase']:8} {extra}")
+ if st["phase"] == "final":
+ for r in st["final"]["ranking"]:
+ name = next(p["name"] for p in st["players"] if p["id"] == r["player_id"])
+ print(f" {r['place']}. {name} {r['score']}")
+ for a in st["final"]["awards"]:
+ print(f" {a['title']}: {a['detail']}")
+ done.set()
+ return
+
+
+async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: random.Random):
+ async with websockets.connect(f"{ws_base}/ws/play/{code}/") as ws:
+ await ws.send(json.dumps({"action": "join", "name": name}))
+ acted = set()
+ while not done.is_set():
+ try:
+ raw = await asyncio.wait_for(ws.recv(), timeout=1)
+ except asyncio.TimeoutError:
+ continue
+ msg = json.loads(raw)
+ if msg["type"] == "error":
+ print(f"[{name}] fejl: {msg['code']} {msg['message']}")
+ continue
+ if msg["type"] != "state":
+ continue
+ st, me = msg["state"], msg["state"]["me"]
+ key = (st["phase"], (st.get("round") or {}).get("number"), (st.get("round") or {}).get("question_number"))
+ await asyncio.sleep(rng.uniform(0.05, 0.4))
+ if st["phase"] == "lobby" and me["vip"] and len(st["players"]) >= n_players and key not in acted:
+ acted.add(key)
+ await ws.send(json.dumps({"action": "start"}))
+ elif st["phase"] == "category" and me["is_chooser"] and key not in acted:
+ acted.add(key)
+ await ws.send(json.dumps({"action": "choose_category", "category_id": st["category"]["options"][0]["id"]}))
+ elif st["phase"] == "lie" and me["role"] == "player" and not me["lie"] and key not in acted:
+ acted.add(key)
+ if rng.random() < 0.3:
+ await ws.send(json.dumps({"action": "lie_for_me"}))
+ sug = json.loads(await ws.recv())
+ text = sug.get("text") if sug.get("type") == "suggestion" else None
+ else:
+ text = None
+ await ws.send(json.dumps({"action": "submit_lie", "text": text or f"{name}s løgn {rng.randint(1, 999)}"}))
+ elif st["phase"] == "guess" and not me["guess"] and key not in acted:
+ acted.add(key)
+ answer = rng.choice(st["answers"])
+ await ws.send(json.dumps({"action": "guess", "answer_id": answer["id"]}))
+ others = [a for a in st["answers"] if a["id"] != answer["id"] and a["id"] != me.get("own_answer_id")]
+ if others and rng.random() < 0.5:
+ await ws.send(json.dumps({"action": "like", "answer_id": rng.choice(others)["id"]}))
+
+
+async def main():
+ ap = argparse.ArgumentParser()
+ ap.add_argument("--base", default="http://127.0.0.1:8000")
+ ap.add_argument("--players", type=int, default=3)
+ ap.add_argument("--audience", type=int, default=1)
+ ap.add_argument("--seed", type=int, default=None)
+ args = ap.parse_args()
+ rng = random.Random(args.seed)
+ code = create_room(args.base)
+ print(f"Rum {code}")
+ ws_base = args.base.replace("http", "ws", 1)
+ seen, done = [], asyncio.Event()
+ names = ["Asger", "Sus", "Jørn", "Mette", "Kaj", "Bodil", "Ib", "Lis"][: args.players]
+ tasks = [asyncio.create_task(host(ws_base, code, seen, done))]
+ await asyncio.sleep(0.2)
+ for n in names:
+ tasks.append(asyncio.create_task(player(ws_base, code, n, args.players, done, rng)))
+ await asyncio.sleep(0.1)
+ # Publikum joiner, når spillet er i gang (i lobbyen ville de blive spillere).
+ for _ in range(200):
+ if "category" in seen:
+ break
+ await asyncio.sleep(0.1)
+ for i in range(args.audience):
+ tasks.append(asyncio.create_task(player(ws_base, code, f"Publikum{i + 1}", args.players, done, rng)))
+ try:
+ await asyncio.wait_for(done.wait(), timeout=600)
+ except asyncio.TimeoutError:
+ print("Spillet blev ikke færdigt inden for 10 minutter", file=sys.stderr)
+ return 1
+ for t in tasks:
+ t.cancel()
+ needed = {"lobby", "category", "lie", "guess", "reveal", "scores", "final"}
+ missing = needed - set(seen)
+ if missing:
+ print(f"Faser der aldrig blev nået: {missing}", file=sys.stderr)
+ return 1
+ print("OK: helt spil gennemført")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(asyncio.run(main()))
diff --git a/fupogfakta/data/questions_a.json b/fupogfakta/data/questions_a.json
index 7838fdf..24796e0 100644
--- a/fupogfakta/data/questions_a.json
+++ b/fupogfakta/data/questions_a.json
@@ -1,81 +1,1166 @@
[
-{"category": "Dyreriget", "prompt": "En flok ugler kaldes på engelsk et _____.", "answer": "parliament", "alternatives": ["et parliament", "parlament"], "decoys": ["library", "choir", "cabinet"], "note": "\"A parliament of owls\" er den klassiske engelske gruppebetegnelse for ugler, inspireret af uglens ry for visdom."},
-{"category": "Dyreriget", "prompt": "Ottearmede blæksprutter har _____ hjerter.", "answer": "tre", "alternatives": ["3"], "decoys": ["to", "fire", "otte"], "note": "To gællehjerter pumper blodet gennem gællerne, og ét systemisk hjerte pumper det rundt i resten af kroppen."},
-{"category": "Dyreriget", "prompt": "Koalaer har _____, der næsten ikke kan skelnes fra menneskers.", "answer": "fingeraftryk", "alternatives": ["fingeraftrykkene"], "decoys": ["tænder", "øjenvipper", "stemmebånd"], "note": "Koalaens fingeraftryk ligner menneskers så meget, at selv eksperter kan have svært ved at se forskel (Henneberg, 1996)."},
-{"category": "Dyreriget", "prompt": "Dolkhalens blod er _____ og bruges til at teste medicin for bakterieforurening.", "answer": "blåt", "alternatives": ["blå", "lyseblåt"], "decoys": ["grønt", "gult", "sort"], "note": "Dolkhaler bruger kobberholdigt hæmocyanin i stedet for jernholdigt hæmoglobin. Deres blod giver LAL-testen for bakterietoksiner."},
-{"category": "Dyreriget", "prompt": "Vombatten er kendt for at lave _____ lorte.", "answer": "terningformede", "alternatives": ["firkantede", "kubiske", "terningeformede"], "decoys": ["spiralformede", "stjerneformede", "trekantede"], "note": "Vombattens tarm har bløde og stive partier, der former afføringen til små terninger. Forskningen fik Ig Nobel-prisen i 2019."},
-{"category": "Dyreriget", "prompt": "En giraf har _____ halshvirvler, præcis lige så mange som et menneske.", "answer": "syv", "alternatives": ["7"], "decoys": ["tolv", "fjorten", "toogtyve"], "note": "Næsten alle pattedyr har syv halshvirvler. Girafens er bare op til 25 cm lange hver."},
-{"category": "Dyreriget", "prompt": "Rensdyrs øjne skifter farve fra gyldne om sommeren til _____ om vinteren.", "answer": "blå", "alternatives": ["dybblå", "blålige"], "decoys": ["røde", "grønne", "hvide"], "note": "Det reflekterende lag bag nethinden ændrer sig i det arktiske vintermørke, så mere lys opfanges (Jeffery m.fl., 2013)."},
-{"category": "Dyreriget", "prompt": "Kolibrier er de eneste fugle, der kan flyve _____ i længere tid.", "answer": "baglæns", "alternatives": ["bagud", "bagud i luften"], "decoys": ["på hovedet", "under vand", "i søvne"], "note": "Kolibriens skulderled lader vingerne rotere, så den kan svæve stille og flyve baglæns."},
-{"category": "Dyreriget", "prompt": "Søstjerner kan skubbe deres _____ ud af kroppen for at fordøje byttet udenfor.", "answer": "mave", "alternatives": ["mavesæk", "maven"], "decoys": ["tunge", "lunge", "hjerne"], "note": "Søstjernen vrænger sin mavesæk ud gennem munden og ind i fx en musling, hvor føden fordøjes."},
-{"category": "Dyreriget", "prompt": "Hannen hos næbdyret har _____ på bagbenene.", "answer": "giftsporer", "alternatives": ["giftpigge", "giftige sporer", "giftige pigge", "sporer"], "decoys": ["sugekopper", "små vinger", "en ekstra tå"], "note": "Næbdyr-hannen er et af de få giftige pattedyr. Giften fra sporerne giver voldsomme smerter hos mennesker."},
-{"category": "Dyreriget", "prompt": "Den europæiske ål, også den fra danske åer, gyder i _____.", "answer": "Sargassohavet", "alternatives": ["sargassohavet", "Sargassohavet i Atlanterhavet"], "decoys": ["Middelhavet", "Østersøen", "Det Kaspiske Hav"], "note": "Danskeren Johannes Schmidt sporede i 1920'erne ålelarverne tilbage til Sargassohavet i Vestatlanten."},
-{"category": "Dyreriget", "prompt": "Narhvalens lange spyd er i virkeligheden en _____.", "answer": "tand", "alternatives": ["hjørnetand", "stødtand"], "decoys": ["næseknogle", "hornplade", "forstenet tunge"], "note": "Spyddet er en hjørnetand, der hos hannen vokser spiralsnoet ud gennem overlæben, typisk på venstre side."},
-{"category": "Dyreriget", "prompt": "Katte kan slet ikke smage _____.", "answer": "sødt", "alternatives": ["sødme", "sukker", "søde ting"], "decoys": ["salt", "surt", "bittert"], "note": "Genet for den ene halvdel af sød-receptoren er defekt hos katte, så de kan ikke registrere sødme."},
-{"category": "Dyreriget", "prompt": "Sommerfugle smager med deres _____.", "answer": "fødder", "alternatives": ["ben", "fod"], "decoys": ["vinger", "øjne", "ryg"], "note": "Smagsreceptorer på fødderne lader hunnen tjekke, om en plante egner sig til at lægge æg på."},
-{"category": "Dyreriget", "prompt": "Ifølge en dansk ledet undersøgelse fra 2016 kan grønlandshajen blive omkring _____ år gammel.", "answer": "400", "alternatives": ["fire hundrede", "392", "næsten 400"], "decoys": ["120", "180", "900"], "note": "Kulstof-14-datering af øjenlinser gav et estimat på 392 ± 120 år, hvilket gør den til verdens længstlevende kendte hvirveldyr."},
-
-{"category": "Kroppen", "prompt": "Menneskekroppens mindste knogle sidder i _____.", "answer": "øret", "alternatives": ["mellemøret", "øre", "ørerne"], "decoys": ["lilletåen", "næsen", "lillefingeren"], "note": "Stigbøjlen i mellemøret er kun ca. 3 mm lang."},
-{"category": "Kroppen", "prompt": "_____ i øjet har ingen blodkar og får sin ilt direkte fra luften.", "answer": "hornhinden", "alternatives": ["hornhinde", "cornea", "Hornhinden"], "decoys": ["nethinden", "regnbuehinden", "synsnerven"], "note": "Hornhinden skal være helt gennemsigtig og har derfor ingen blodkar. Ilten optages fra tårefilmen og luften."},
-{"category": "Kroppen", "prompt": "Nyfødte har endnu ingen knæskaller af knogle, de består nemlig af _____.", "answer": "brusk", "alternatives": ["bruskvæv"], "decoys": ["fedt", "muskler", "væske"], "note": "Knæskallen begynder først at forbene sig i 3-6-årsalderen."},
-{"category": "Kroppen", "prompt": "Patienter kan være vågne under hjerneoperationer, fordi selve hjernevævet mangler _____.", "answer": "smertereceptorer", "alternatives": ["smertesensorer", "smertenerver", "nociceptorer", "smertefølere"], "decoys": ["blodkar", "nerveceller", "fedt"], "note": "Hjernen registrerer smerte i resten af kroppen, men hjernevævet selv har ingen smertereceptorer."},
-{"category": "Kroppen", "prompt": "Mavesækken undgår at fordøje sig selv ved hele tiden at danne et nyt lag _____.", "answer": "slim", "alternatives": ["slimhinde", "slimlag"], "decoys": ["fedt", "kalk", "hår"], "note": "Et tykt, basisk slimlag beskytter mavevæggen mod saltsyren og fordøjelsesenzymerne."},
-{"category": "Kroppen", "prompt": "Tandemalje er det _____ væv i menneskekroppen.", "answer": "hårdeste", "alternatives": ["stærkeste", "mest hårde"], "decoys": ["blødeste", "letteste", "mest elastiske"], "note": "Emaljen består af ca. 96 % mineral og er hårdere end knogle."},
-{"category": "Kroppen", "prompt": "Gåsehud er en rest fra dengang, vores forfædre havde _____.", "answer": "pels", "alternatives": ["mere pels", "mere hår", "kropsbehåring", "tæt pels"], "decoys": ["fjer", "skæl", "pigge"], "note": "Små muskler rejser hårene. Hos pelsdyr giver det isolering eller får dyret til at se større ud."},
-{"category": "Kroppen", "prompt": "Det lægelige navn for hikke er _____.", "answer": "singultus", "alternatives": ["singultation"], "decoys": ["diafragmose", "hiccupitis", "spasmus glottis"], "note": "Singultus kommer af latin og betyder noget i retning af et hulk eller en gisp."},
-{"category": "Kroppen", "prompt": "Babyer fødes med omkring 300 knogler, men en voksen har kun _____.", "answer": "206", "alternatives": ["to hundrede og seks"], "decoys": ["250", "180", "312"], "note": "Mange knogler vokser sammen gennem barndommen, fx i kraniet og bækkenet."},
-{"category": "Kroppen", "prompt": "Knæk i fingrene skyldes _____ i ledvæsken.", "answer": "gasbobler", "alternatives": ["bobler", "luftbobler", "gas", "en gasboble"], "decoys": ["kalkkrystaller", "små knoglesplinter", "størknet blod"], "note": "Når leddet trækkes fra hinanden, falder trykket, og der dannes en gasboble i ledvæsken (MR-studie, 2015)."},
-{"category": "Kroppen", "prompt": "Om ens ørevoks er tør eller våd, afgøres af ét enkelt _____.", "answer": "gen", "alternatives": ["genet", "arveanlæg"], "decoys": ["hormon", "vitamin", "mineral"], "note": "Varianter af genet ABCC11 bestemmer ørevoksens type. Tør voks er almindelig i Østasien (2006)."},
-{"category": "Kroppen", "prompt": "Hjernen udgør kun ca. 2 % af kropsvægten, men bruger omkring _____ af kroppens energi.", "answer": "20 procent", "alternatives": ["20 %", "20%", "en femtedel", "tyve procent"], "decoys": ["5 procent", "50 procent", "2 procent"], "note": "I hvile står hjernen for omkring en femtedel af kroppens energiforbrug."},
-{"category": "Kroppen", "prompt": "Den danske læge Niels Finsen fik Nobelprisen i 1903 for at behandle hudtuberkulose med _____.", "answer": "lys", "alternatives": ["lysbehandling", "koncentreret lys", "UV-lys"], "decoys": ["kulde", "radium", "honning"], "note": "Finsen brugte koncentreret lys mod lupus vulgaris og var Danmarks første nobelpristager i medicin."},
-{"category": "Kroppen", "prompt": "K-vitamin har sit bogstav fra ordet _____.", "answer": "koagulation", "alternatives": ["koagulering", "Koagulation"], "decoys": ["kalk", "kartoffel", "kost"], "note": "Danske Henrik Dam opdagede vitaminet og opkaldte det efter dets rolle i blodets størkning. Han fik Nobelprisen i 1943."},
-{"category": "Kroppen", "prompt": "Et voksent menneskehjerte slår omkring _____ gange i døgnet.", "answer": "100.000", "alternatives": ["100000", "hundrede tusind", "100 000"], "decoys": ["10.000", "30.000", "1 million"], "note": "Med en hvilepuls på 60-80 slag i minuttet giver det ca. 86.000-115.000 slag i døgnet."},
-
-{"category": "Mad og drikke", "prompt": "Jordnødder er botanisk set ikke nødder, men _____.", "answer": "bælgfrugter", "alternatives": ["bælgplanter", "ærteplanter", "bælgfrugt"], "decoys": ["rodknolde", "kornsorter", "citrusfrugter"], "note": "Jordnødden er i familie med ærter og bønner og modner sine bælge under jorden."},
-{"category": "Mad og drikke", "prompt": "Kiwifrugten hed oprindeligt _____.", "answer": "kinesisk stikkelsbær", "alternatives": ["kinesiske stikkelsbær", "Chinese gooseberry"], "decoys": ["australsk kartoffel", "abeæble", "behåret blomme"], "note": "Frugten stammer fra Kina. New Zealandske eksportører omdøbte den til kiwifrugt omkring 1959."},
-{"category": "Mad og drikke", "prompt": "De første dyrkede gulerødder var ikke orange, men _____.", "answer": "lilla", "alternatives": ["gule", "lilla og gule", "violette"], "decoys": ["blå", "grønne", "lyserøde"], "note": "Tidlige gulerødder fra Centralasien var lilla eller gule. Den orange gulerod blev udviklet i Europa, især i Holland."},
-{"category": "Mad og drikke", "prompt": "Kaffebønner er egentlig _____ fra en bærlignende frugt.", "answer": "frø", "alternatives": ["kerner", "stenkerner", "frøene"], "decoys": ["rødder", "blomsterknopper", "tørrede bær"], "note": "Hvert kaffebær indeholder normalt to frø, som ristes til det, vi kalder kaffebønner."},
-{"category": "Mad og drikke", "prompt": "Den wasabi, man får til sushi i Europa, er oftest farvet _____.", "answer": "peberrod", "alternatives": ["peberrødder"], "decoys": ["ingefær", "rucola", "ærter"], "note": "Ægte wasabi er dyr og svær at dyrke, så de fleste tuber indeholder peberrod med grøn farve."},
-{"category": "Mad og drikke", "prompt": "Frisk ananas får gelatine-dessert til ikke at stivne, fordi et enzym i frugten nedbryder _____.", "answer": "protein", "alternatives": ["proteiner", "proteinet"], "decoys": ["sukker", "fedt", "stivelse"], "note": "Ananas indeholder bromelain, der klipper gelatinens proteinkæder over. Dåseananas er varmebehandlet og virker fint."},
-{"category": "Mad og drikke", "prompt": "En grøn peberfrugt er som regel bare en _____ rød peberfrugt.", "answer": "umoden", "alternatives": ["ikke moden", "uopmoden"], "decoys": ["syg", "tørret", "frossen"], "note": "De fleste peberfrugter skifter fra grøn til gul, orange eller rød, når de modner på planten."},
-{"category": "Mad og drikke", "prompt": "Ægte parmesan er ikke vegetarisk, fordi den laves med løbe fra maven af _____.", "answer": "kalve", "alternatives": ["kalv", "unge kalve", "kalvemaver"], "decoys": ["grise", "heste", "kaniner"], "note": "Reglerne for Parmigiano Reggiano kræver naturlig kalveløbe, et enzym fra kalvens mave."},
-{"category": "Mad og drikke", "prompt": "Cashewnødder sælges aldrig i skal, fordi skallen indeholder samme hudirriterende stof som _____.", "answer": "giftsumak", "alternatives": ["poison ivy", "giftsumakken"], "decoys": ["brændenælder", "bjørneklo", "chili"], "note": "Skallen indeholder urushiol, det samme stof som i giftsumak. Cashew og giftsumak er i samme plantefamilie."},
-{"category": "Mad og drikke", "prompt": "Carlsberg er opkaldt efter brygger J.C. Jacobsens _____.", "answer": "søn", "alternatives": ["søn Carl", "Carl"], "decoys": ["hest", "hund", "kone"], "note": "Bryggeriet fra 1847 blev opkaldt efter sønnen Carl Jacobsen plus \"bjerg\" for bakken i Valby."},
-{"category": "Mad og drikke", "prompt": "Sort te og grøn te er lavet af blade fra _____, forskellen ligger kun i forarbejdningen.", "answer": "samme plante", "alternatives": ["den samme plante", "samme busk", "den samme busk", "teplanten"], "decoys": ["to forskellige buske", "to forskellige træer", "hver sin palme"], "note": "Begge kommer fra Camellia sinensis. Sort te oxideres, grøn te varmebehandles hurtigt for at undgå det."},
-{"category": "Mad og drikke", "prompt": "Bananer er en lille smule _____ på grund af deres indhold af kalium.", "answer": "radioaktive", "alternatives": ["radioaktiv"], "decoys": ["magnetiske", "selvlysende", "giftige"], "note": "En lille del af naturligt kalium er den radioaktive isotop kalium-40. Strålingen er helt ufarlig."},
-{"category": "Mad og drikke", "prompt": "Safran er tørrede støvfang fra en _____.", "answer": "krokus", "alternatives": ["safrankrokus", "krokusblomst"], "decoys": ["tulipan", "lilje", "orkidé"], "note": "Hver blomst af Crocus sativus giver kun tre støvfang, som plukkes i hånden. Derfor er safran så dyrt."},
-{"category": "Mad og drikke", "prompt": "Vanilje kommer fra frugten af en _____.", "answer": "orkidé", "alternatives": ["orkide", "vaniljeorkidé", "orkidéart"], "decoys": ["palme", "lilje", "krokus"], "note": "Vaniljestangen er en frøkapsel fra slyngplanten Vanilla planifolia, som er en orkidé."},
-{"category": "Mad og drikke", "prompt": "_____ kan ikke mærke det brændende i chili og spreder derfor frøene.", "answer": "fugle", "alternatives": ["fuglene", "fugl"], "decoys": ["køer", "rotter", "heste"], "note": "Fuglenes receptor reagerer ikke på capsaicin. Pattedyr, der ville knuse frøene, skræmmes væk af styrken."},
-
-{"category": "Rummet og naturen", "prompt": "Én omdrejning om Venus' egen akse tager længere tid end ét _____ på Venus.", "answer": "år", "alternatives": ["venusår", "Venus-år", "år på Venus"], "decoys": ["århundrede", "årti", "årtusinde"], "note": "Venus roterer på 243 jorddøgn, men kredser om Solen på kun 225 jorddøgn."},
-{"category": "Rummet og naturen", "prompt": "Månen bevæger sig hvert år ca. _____ længere væk fra Jorden.", "answer": "3,8 centimeter", "alternatives": ["3,8 cm", "4 centimeter", "4 cm", "knap 4 centimeter"], "decoys": ["3 millimeter", "40 centimeter", "1 meter"], "note": "Målt med laserstråler mod spejle, som Apollo-astronauterne efterlod på Månen."},
-{"category": "Rummet og naturen", "prompt": "Et lyn kan opvarme luften til ca. _____ gange Solens overfladetemperatur.", "answer": "fem", "alternatives": ["5"], "decoys": ["to", "hundrede", "tusind"], "note": "Lynkanalen kan nå op mod 30.000 °C, mens Solens overflade er ca. 5.500 °C."},
-{"category": "Rummet og naturen", "prompt": "Planeten Saturn har lavere massefylde end _____.", "answer": "vand", "alternatives": ["vand har", "almindeligt vand"], "decoys": ["luft", "helium", "vanddamp"], "note": "Saturns gennemsnitlige massefylde er ca. 0,69 g/cm³, mindre end vands 1 g/cm³."},
-{"category": "Rummet og naturen", "prompt": "Jorden er den eneste planet i solsystemet, der ikke er opkaldt efter en _____.", "answer": "gud", "alternatives": ["guddom", "gudinde", "gud eller gudinde", "mytologisk figur"], "decoys": ["farve", "stjerne", "romersk kejser"], "note": "De øvrige planeter har navne fra græsk eller romersk mytologi. Jorden har et gammelt germansk navn."},
-{"category": "Rummet og naturen", "prompt": "Den danske astronom Ole Rømer viste i 1676 ved hjælp af Jupiters måne Io, at _____ ikke bevæger sig uendelig hurtigt.", "answer": "lyset", "alternatives": ["lys"], "decoys": ["tyngdekraften", "magnetismen", "tiden"], "note": "Io's formørkelser kom for sent, når Jorden var langt fra Jupiter. Rømer forklarede det med lysets endelige hastighed."},
-{"category": "Rummet og naturen", "prompt": "Visse bambusarter kan vokse næsten _____ på ét døgn.", "answer": "en meter", "alternatives": ["1 meter", "91 centimeter", "90 centimeter"], "decoys": ["en millimeter", "en centimeter", "ti meter"], "note": "Nogle bambusarter er målt til at vokse op til 91 cm på 24 timer, blandt de hurtigste planter i verden."},
-{"category": "Rummet og naturen", "prompt": "Diamant og blyantens grafit består begge af rent _____.", "answer": "kulstof", "alternatives": ["carbon", "kul"], "decoys": ["silicium", "jern", "kvarts"], "note": "Forskellen ligger kun i, hvordan kulstofatomerne er bundet sammen."},
-{"category": "Rummet og naturen", "prompt": "Rav er forstenet _____.", "answer": "harpiks", "alternatives": ["træharpiks", "kåde", "harpiks fra træer"], "decoys": ["honning", "fiskeolie", "mos"], "note": "Det baltiske rav, der skyller op på danske strande, er omkring 40 millioner år gammel harpiks fra nåletræer."},
-{"category": "Rummet og naturen", "prompt": "Omkring halvdelen af Jordens ilt produceres af _____ i havet.", "answer": "plankton", "alternatives": ["planteplankton", "fytoplankton", "mikroalger", "alger"], "decoys": ["hvaler", "vandmænd", "fisk"], "note": "Mikroskopiske planteplankton står ifølge NOAA for ca. halvdelen af Jordens iltproduktion."},
-{"category": "Rummet og naturen", "prompt": "Toppen af Mount Everest består af kalksten med fossiler af _____.", "answer": "havdyr", "alternatives": ["dyr fra havet", "havdyr som trilobitter", "trilobitter", "søliljer"], "decoys": ["dinosaurer", "mammutter", "palmer"], "note": "Kalkstenen blev dannet på havbunden for ca. 450 millioner år siden og senere presset op af kontinentalpladerne."},
-{"category": "Rummet og naturen", "prompt": "Jordens indre kerne er omtrent lige så varm som _____ overflade.", "answer": "Solens", "alternatives": ["solens"], "decoys": ["Månens", "Mars'", "Venus'"], "note": "Den indre kerne er ca. 5.200-5.400 °C, næsten som Solens overflade på ca. 5.500 °C."},
-{"category": "Rummet og naturen", "prompt": "Ifølge en opgørelse fra 2015 findes der omkring 3.000 milliarder _____ på Jorden, flere end der er stjerner i Mælkevejen.", "answer": "træer", "alternatives": ["træ"], "decoys": ["fugle", "katte", "mennesker"], "note": "Studiet i Nature (Crowther m.fl., 2015) kom frem til ca. 3,04 billioner træer. Mælkevejen har 100-400 milliarder stjerner."},
-{"category": "Rummet og naturen", "prompt": "Målt på nedbør er Antarktis verdens største _____.", "answer": "ørken", "alternatives": ["ørkenområde", "polarørken"], "decoys": ["regnskov", "sump", "steppe"], "note": "En ørken defineres ud fra lidt nedbør, ikke varme. Indlandet på Antarktis får kun få centimeter om året."},
-{"category": "Rummet og naturen", "prompt": "Dværgplaneten Pluto blev i 1930 navngivet efter forslag fra en _____-årig skolepige.", "answer": "11", "alternatives": ["elleve"], "decoys": ["6", "8", "16"], "note": "Den 11-årige Venetia Burney fra Oxford foreslog navnet efter underverdenens romerske gud."},
-
-{"category": "Opfindelser", "prompt": "Den danske kemiker S.P.L. Sørensen indførte pH-skalaen i 1909, mens han arbejdede for _____.", "answer": "Carlsberg", "alternatives": ["Carlsberg Laboratorium", "Carlsbergs laboratorium", "Carlsberg Laboratoriet", "Carlsberg Laboratoriet i Valby"], "decoys": ["Tuborg", "Mærsk", "Københavns Zoo"], "note": "Sørensen ledte kemiafdelingen på Carlsberg Laboratorium og havde brug for et præcist mål for surhed i bryggeprocessen."},
-{"category": "Opfindelser", "prompt": "Navnet LEGO kommer af de danske ord _____.", "answer": "leg godt", "alternatives": ["\"leg godt\"", "leg-godt"], "decoys": ["lær godt", "let og god", "lege og gøre"], "note": "Ole Kirk Christiansen fandt på navnet i 1934 ud fra \"leg godt\"."},
-{"category": "Opfindelser", "prompt": "H.C. Ørsted var i 1825 den første til at fremstille metallet _____.", "answer": "aluminium", "alternatives": ["aluminum"], "decoys": ["titan", "zink", "magnesium"], "note": "Ørsted fremstillede som den første (uren) aluminium. Wöhler forbedrede metoden få år senere."},
-{"category": "Opfindelser", "prompt": "Danske Valdemar Poulsen opfandt i 1898 den første maskine, der kunne optage lyd _____.", "answer": "magnetisk", "alternatives": ["magnetisk på ståltråd", "på ståltråd", "magnetiske"], "decoys": ["digitalt", "optisk", "i stereo"], "note": "Poulsens telegrafon optog lyd magnetisk på ståltråd og er forfader til båndoptageren og harddisken."},
-{"category": "Opfindelser", "prompt": "Bobleplast blev oprindeligt opfundet som _____.", "answer": "tapet", "alternatives": ["tapet med struktur", "vægtapet"], "decoys": ["badeforhæng", "legetøj", "regnfrakker"], "note": "Al Fielding og Marc Chavannes forsøgte i 1957 at lave et moderne strukturtapet. Det blev ikke en succes."},
-{"category": "Opfindelser", "prompt": "Mikrobølgeovnen blev opfundet, efter at radarudstyr havde smeltet en _____ i ingeniørens lomme.", "answer": "chokoladebar", "alternatives": ["slikbar", "chokolade", "slik", "chokoladeplade"], "decoys": ["smørklat", "stearinlys", "ostemad"], "note": "Percy Spencer opdagede i 1945 effekten ved en magnetron og fik patent på mikrobølgeovnen."},
-{"category": "Opfindelser", "prompt": "Limen på Post-it-sedler var egentlig et fejlslagent forsøg på at lave en _____ lim.", "answer": "superstærk", "alternatives": ["meget stærk", "ekstra stærk", "stærk"], "decoys": ["spiselig", "vandopløselig", "selvlysende"], "note": "Spencer Silver hos 3M ville i 1968 lave en superstærk lim, men fik en svag lim, der kunne genbruges."},
-{"category": "Opfindelser", "prompt": "Burrebåndet (velcro) blev opfundet, efter at opfinderen undrede sig over _____ i sin hunds pels.", "answer": "burrer", "alternatives": ["burresnerre", "burresnerrer", "borrer", "frøstande"], "decoys": ["fuglefjer", "edderkoppespind", "tang"], "note": "Schweizeren George de Mestral studerede burrernes små kroge under mikroskop efter en gåtur i 1941."},
-{"category": "Opfindelser", "prompt": "Den allerførste computermus fra 1964 var lavet af _____.", "answer": "træ", "alternatives": ["en træklods", "træklods"], "decoys": ["glas", "porcelæn", "kork"], "note": "Douglas Engelbarts prototype var en træklods med to metalhjul under."},
-{"category": "Opfindelser", "prompt": "Bluetooth er opkaldt efter den danske konge _____.", "answer": "Harald Blåtand", "alternatives": ["Harald", "Harald Bluetooth", "Harald 1."], "decoys": ["Gorm den Gamle", "Svend Tveskæg", "Knud den Store"], "note": "Harald Blåtand samlede Danmark og Norge, ligesom teknologien skulle samle enheder. Logoet er hans runeinitialer."},
-{"category": "Opfindelser", "prompt": "Coca-Cola blev i 1886 oprindeligt solgt som _____.", "answer": "medicin", "alternatives": ["nervemedicin", "patentmedicin", "hovedpinemedicin", "et lægemiddel", "lægemiddel", "tonic"], "decoys": ["hårvand", "rengøringsmiddel", "rottegift"], "note": "Apotekeren John Pemberton markedsførte drikken som et middel mod bl.a. hovedpine og nervøsitet."},
-{"category": "Opfindelser", "prompt": "Danske Karl Krøyer hævede i 1964 et sunket skib i Kuwait ved at fylde det med _____.", "answer": "isoporkugler", "alternatives": ["flamingokugler", "polystyrenkugler", "isopor", "flamingo", "plastkugler", "polystyren"], "decoys": ["bordtennisbolde", "badebolde", "balloner"], "note": "Omkring 27 millioner små polystyrenkugler blev pumpet ned i skibet, så det fik opdrift nok til at flyde."},
-{"category": "Opfindelser", "prompt": "Verdens første webcam blev sat op i 1991 for at holde øje med en _____.", "answer": "kaffekande", "alternatives": ["kaffemaskine", "kaffekolbe", "kaffekande på universitetet"], "decoys": ["fuglerede", "parkeringsplads", "fiskedam"], "note": "Forskere på Cambridge Universitet kunne fra skærmen se, om der var kaffe i kanden i Trojan Room."},
-{"category": "Opfindelser", "prompt": "Den første vare, der blev scannet med stregkode i et supermarked i 1974, var en pakke _____.", "answer": "tyggegummi", "alternatives": ["Wrigley's tyggegummi", "Juicy Fruit"], "decoys": ["cigaretter", "havregryn", "kaffe"], "note": "En pakke Wrigley's Juicy Fruit blev scannet i Marsh Supermarket i Ohio den 26. juni 1974."},
-{"category": "Opfindelser", "prompt": "H.C. Ørsted opdagede i 1820, at elektrisk strøm kan få en _____ til at bevæge sig.", "answer": "kompasnål", "alternatives": ["magnetnål", "kompas"], "decoys": ["pendul", "termometersøjle", "barometernål"], "note": "Opdagelsen af elektromagnetismen lagde grunden til elmotoren, generatoren og telegrafen."}
-]
+ {
+ "category": "Dyreriget",
+ "prompt": "En flok ugler kaldes på engelsk et _____.",
+ "answer": "parliament",
+ "alternatives": [
+ "et parliament",
+ "parlament"
+ ],
+ "decoys": [
+ "library",
+ "choir",
+ "cabinet"
+ ],
+ "note": "\"A parliament of owls\" er den klassiske engelske gruppebetegnelse for ugler, inspireret af uglens ry for visdom."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Ottearmede blæksprutter har _____ hjerter.",
+ "answer": "tre",
+ "alternatives": [
+ "3"
+ ],
+ "decoys": [
+ "to",
+ "fire",
+ "otte"
+ ],
+ "note": "To gællehjerter pumper blodet gennem gællerne, og ét systemisk hjerte pumper det rundt i resten af kroppen."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Koalaer har _____, der næsten ikke kan skelnes fra menneskers.",
+ "answer": "fingeraftryk",
+ "alternatives": [
+ "fingeraftrykkene"
+ ],
+ "decoys": [
+ "tænder",
+ "øjenvipper",
+ "stemmebånd"
+ ],
+ "note": "Koalaens fingeraftryk ligner menneskers så meget, at selv eksperter kan have svært ved at se forskel (Henneberg, 1996)."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Dolkhalens blod er _____ og bruges til at teste medicin for bakterieforurening.",
+ "answer": "blåt",
+ "alternatives": [
+ "blå",
+ "lyseblåt"
+ ],
+ "decoys": [
+ "grønt",
+ "gult",
+ "sort"
+ ],
+ "note": "Dolkhaler bruger kobberholdigt hæmocyanin i stedet for jernholdigt hæmoglobin. Deres blod giver LAL-testen for bakterietoksiner."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Vombatten er kendt for at lave _____ lorte.",
+ "answer": "terningformede",
+ "alternatives": [
+ "firkantede",
+ "kubiske",
+ "terningeformede"
+ ],
+ "decoys": [
+ "spiralformede",
+ "stjerneformede",
+ "trekantede"
+ ],
+ "note": "Vombattens tarm har bløde og stive partier, der former afføringen til små terninger. Forskningen fik Ig Nobel-prisen i 2019."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "En giraf har _____ halshvirvler, præcis lige så mange som et menneske.",
+ "answer": "syv",
+ "alternatives": [
+ "7"
+ ],
+ "decoys": [
+ "tolv",
+ "fjorten",
+ "toogtyve"
+ ],
+ "note": "Næsten alle pattedyr har syv halshvirvler. Girafens er bare op til 25 cm lange hver."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Rensdyrs øjne skifter farve fra gyldne om sommeren til _____ om vinteren.",
+ "answer": "blå",
+ "alternatives": [
+ "dybblå",
+ "blålige"
+ ],
+ "decoys": [
+ "røde",
+ "grønne",
+ "hvide"
+ ],
+ "note": "Det reflekterende lag bag nethinden ændrer sig i det arktiske vintermørke, så mere lys opfanges (Jeffery m.fl., 2013)."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Kolibrier er de eneste fugle, der kan flyve _____ i længere tid.",
+ "answer": "baglæns",
+ "alternatives": [
+ "bagud",
+ "bagud i luften"
+ ],
+ "decoys": [
+ "på hovedet",
+ "under vand",
+ "i søvne"
+ ],
+ "note": "Kolibriens skulderled lader vingerne rotere, så den kan svæve stille og flyve baglæns."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Søstjerner kan skubbe deres _____ ud af kroppen for at fordøje byttet udenfor.",
+ "answer": "mave",
+ "alternatives": [
+ "mavesæk",
+ "maven"
+ ],
+ "decoys": [
+ "tunge",
+ "lunge",
+ "hjerne"
+ ],
+ "note": "Søstjernen vrænger sin mavesæk ud gennem munden og ind i fx en musling, hvor føden fordøjes."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Hannen hos næbdyret har _____ på bagbenene.",
+ "answer": "giftsporer",
+ "alternatives": [
+ "giftpigge",
+ "giftige sporer",
+ "giftige pigge",
+ "sporer"
+ ],
+ "decoys": [
+ "sugekopper",
+ "små vinger",
+ "en ekstra tå"
+ ],
+ "note": "Næbdyr-hannen er et af de få giftige pattedyr. Giften fra sporerne giver voldsomme smerter hos mennesker."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Den europæiske ål, også den fra danske åer, gyder i _____.",
+ "answer": "Sargassohavet",
+ "alternatives": [
+ "sargassohavet",
+ "Sargassohavet i Atlanterhavet"
+ ],
+ "decoys": [
+ "Middelhavet",
+ "Østersøen",
+ "Det Kaspiske Hav"
+ ],
+ "note": "Danskeren Johannes Schmidt sporede i 1920'erne ålelarverne tilbage til Sargassohavet i Vestatlanten."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Narhvalens lange spyd er i virkeligheden en _____.",
+ "answer": "tand",
+ "alternatives": [
+ "hjørnetand",
+ "stødtand"
+ ],
+ "decoys": [
+ "næseknogle",
+ "hornplade",
+ "forstenet tunge"
+ ],
+ "note": "Spyddet er en hjørnetand, der hos hannen vokser spiralsnoet ud gennem overlæben, typisk på venstre side."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Katte kan slet ikke smage _____.",
+ "answer": "sødt",
+ "alternatives": [
+ "sødme",
+ "sukker",
+ "søde ting"
+ ],
+ "decoys": [
+ "salt",
+ "surt",
+ "bittert"
+ ],
+ "note": "Genet for den ene halvdel af sød-receptoren er defekt hos katte, så de kan ikke registrere sødme."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Sommerfugle smager med deres _____.",
+ "answer": "fødder",
+ "alternatives": [
+ "ben",
+ "fod"
+ ],
+ "decoys": [
+ "vinger",
+ "øjne",
+ "ryg"
+ ],
+ "note": "Smagsreceptorer på fødderne lader hunnen tjekke, om en plante egner sig til at lægge æg på."
+ },
+ {
+ "category": "Dyreriget",
+ "prompt": "Ifølge en dansk ledet undersøgelse fra 2016 kan grønlandshajen blive omkring _____ år gammel.",
+ "answer": "400",
+ "alternatives": [
+ "fire hundrede",
+ "392",
+ "næsten 400"
+ ],
+ "decoys": [
+ "120",
+ "180",
+ "900"
+ ],
+ "note": "Kulstof-14-datering af øjenlinser gav et estimat på 392 ± 120 år, hvilket gør den til verdens længstlevende kendte hvirveldyr."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Menneskekroppens mindste knogle sidder i _____.",
+ "answer": "øret",
+ "alternatives": [
+ "mellemøret",
+ "øre",
+ "ørerne"
+ ],
+ "decoys": [
+ "lilletåen",
+ "næsen",
+ "lillefingeren"
+ ],
+ "note": "Stigbøjlen i mellemøret er kun ca. 3 mm lang."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "_____ i øjet har ingen blodkar og får sin ilt direkte fra luften.",
+ "answer": "hornhinden",
+ "alternatives": [
+ "hornhinde",
+ "cornea",
+ "Hornhinden"
+ ],
+ "decoys": [
+ "nethinden",
+ "regnbuehinden",
+ "synsnerven"
+ ],
+ "note": "Hornhinden skal være helt gennemsigtig og har derfor ingen blodkar. Ilten optages fra tårefilmen og luften."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Nyfødte har endnu ingen knæskaller af knogle, de består nemlig af _____.",
+ "answer": "brusk",
+ "alternatives": [
+ "bruskvæv"
+ ],
+ "decoys": [
+ "fedt",
+ "muskler",
+ "væske"
+ ],
+ "note": "Knæskallen begynder først at forbene sig i 3-6-årsalderen."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Patienter kan være vågne under hjerneoperationer, fordi selve hjernevævet mangler _____.",
+ "answer": "smertereceptorer",
+ "alternatives": [
+ "smertesensorer",
+ "smertenerver",
+ "nociceptorer",
+ "smertefølere"
+ ],
+ "decoys": [
+ "blodkar",
+ "nerveceller",
+ "fedt"
+ ],
+ "note": "Hjernen registrerer smerte i resten af kroppen, men hjernevævet selv har ingen smertereceptorer."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Mavesækken undgår at fordøje sig selv ved hele tiden at danne et nyt lag _____.",
+ "answer": "slim",
+ "alternatives": [
+ "slimhinde",
+ "slimlag"
+ ],
+ "decoys": [
+ "fedt",
+ "kalk",
+ "hår"
+ ],
+ "note": "Et tykt, basisk slimlag beskytter mavevæggen mod saltsyren og fordøjelsesenzymerne."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Tandemalje er det _____ væv i menneskekroppen.",
+ "answer": "hårdeste",
+ "alternatives": [
+ "stærkeste",
+ "mest hårde"
+ ],
+ "decoys": [
+ "blødeste",
+ "letteste",
+ "mest elastiske"
+ ],
+ "note": "Emaljen består af ca. 96 % mineral og er hårdere end knogle."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Gåsehud er en rest fra dengang, vores forfædre havde _____.",
+ "answer": "pels",
+ "alternatives": [
+ "mere pels",
+ "mere hår",
+ "kropsbehåring",
+ "tæt pels"
+ ],
+ "decoys": [
+ "fjer",
+ "skæl",
+ "pigge"
+ ],
+ "note": "Små muskler rejser hårene. Hos pelsdyr giver det isolering eller får dyret til at se større ud."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Det lægelige navn for hikke er _____.",
+ "answer": "singultus",
+ "alternatives": [
+ "singultation"
+ ],
+ "decoys": [
+ "diafragmose",
+ "hiccupitis",
+ "spasmus glottis"
+ ],
+ "note": "Singultus kommer af latin og betyder noget i retning af et hulk eller en gisp."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Babyer fødes med omkring 300 knogler, men en voksen har kun _____.",
+ "answer": "206",
+ "alternatives": [
+ "to hundrede og seks"
+ ],
+ "decoys": [
+ "250",
+ "180",
+ "312"
+ ],
+ "note": "Mange knogler vokser sammen gennem barndommen, fx i kraniet og bækkenet."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Knæk i fingrene skyldes _____ i ledvæsken.",
+ "answer": "gasbobler",
+ "alternatives": [
+ "bobler",
+ "luftbobler",
+ "gas",
+ "en gasboble"
+ ],
+ "decoys": [
+ "kalkkrystaller",
+ "små knoglesplinter",
+ "størknet blod"
+ ],
+ "note": "Når leddet trækkes fra hinanden, falder trykket, og der dannes en gasboble i ledvæsken (MR-studie, 2015)."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Om ens ørevoks er tør eller våd, afgøres af ét enkelt _____.",
+ "answer": "gen",
+ "alternatives": [
+ "genet",
+ "arveanlæg"
+ ],
+ "decoys": [
+ "hormon",
+ "vitamin",
+ "mineral"
+ ],
+ "note": "Varianter af genet ABCC11 bestemmer ørevoksens type. Tør voks er almindelig i Østasien (2006)."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Hjernen udgør kun ca. 2 % af kropsvægten, men bruger omkring _____ af kroppens energi.",
+ "answer": "20 procent",
+ "alternatives": [
+ "20 %",
+ "20%",
+ "en femtedel",
+ "tyve procent"
+ ],
+ "decoys": [
+ "5 procent",
+ "50 procent",
+ "2 procent"
+ ],
+ "note": "I hvile står hjernen for omkring en femtedel af kroppens energiforbrug."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Den danske læge Niels Finsen fik Nobelprisen i 1903 for at behandle hudtuberkulose med _____.",
+ "answer": "lys",
+ "alternatives": [
+ "lysbehandling",
+ "koncentreret lys",
+ "UV-lys"
+ ],
+ "decoys": [
+ "kulde",
+ "radium",
+ "honning"
+ ],
+ "note": "Finsen brugte koncentreret lys mod lupus vulgaris og var Danmarks første nobelpristager i medicin."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "K-vitamin har sit bogstav fra ordet _____.",
+ "answer": "koagulation",
+ "alternatives": [
+ "koagulering",
+ "Koagulation"
+ ],
+ "decoys": [
+ "kalk",
+ "kartoffel",
+ "kost"
+ ],
+ "note": "Danske Henrik Dam opdagede vitaminet og opkaldte det efter dets rolle i blodets størkning. Han fik Nobelprisen i 1943."
+ },
+ {
+ "category": "Kroppen",
+ "prompt": "Et voksent menneskehjerte slår omkring _____ gange i døgnet.",
+ "answer": "100.000",
+ "alternatives": [
+ "100000",
+ "hundrede tusind",
+ "100 000"
+ ],
+ "decoys": [
+ "10.000",
+ "30.000",
+ "1 million"
+ ],
+ "note": "Med en hvilepuls på 60-80 slag i minuttet giver det ca. 86.000-115.000 slag i døgnet."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Jordnødder er botanisk set ikke nødder, men _____.",
+ "answer": "bælgfrugter",
+ "alternatives": [
+ "bælgplanter",
+ "ærteplanter",
+ "bælgfrugt"
+ ],
+ "decoys": [
+ "rodknolde",
+ "kornsorter",
+ "citrusfrugter"
+ ],
+ "note": "Jordnødden er i familie med ærter og bønner og modner sine bælge under jorden."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Kiwifrugten hed oprindeligt _____.",
+ "answer": "kinesisk stikkelsbær",
+ "alternatives": [
+ "kinesiske stikkelsbær",
+ "Chinese gooseberry"
+ ],
+ "decoys": [
+ "australsk kartoffel",
+ "abeæble",
+ "behåret blomme"
+ ],
+ "note": "Frugten stammer fra Kina. New Zealandske eksportører omdøbte den til kiwifrugt omkring 1959."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "De første dyrkede gulerødder var ikke orange, men _____.",
+ "answer": "lilla",
+ "alternatives": [
+ "gule",
+ "lilla og gule",
+ "violette"
+ ],
+ "decoys": [
+ "blå",
+ "grønne",
+ "lyserøde"
+ ],
+ "note": "Tidlige gulerødder fra Centralasien var lilla eller gule. Den orange gulerod blev udviklet i Europa, især i Holland."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Kaffebønner er egentlig _____ fra en bærlignende frugt.",
+ "answer": "frø",
+ "alternatives": [
+ "kerner",
+ "stenkerner",
+ "frøene"
+ ],
+ "decoys": [
+ "rødder",
+ "blomsterknopper",
+ "tørrede bær"
+ ],
+ "note": "Hvert kaffebær indeholder normalt to frø, som ristes til det, vi kalder kaffebønner."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Den grønne wasabi, man får til sushi i Europa, er oftest farvet _____.",
+ "answer": "peberrod",
+ "alternatives": [
+ "peberrødder"
+ ],
+ "decoys": [
+ "ingefær",
+ "rucola",
+ "ærter"
+ ],
+ "note": "Ægte wasabi er dyr og svær at dyrke, så de fleste tuber indeholder peberrod med grøn farve."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Frisk ananas får gelatine-dessert til ikke at stivne, fordi et enzym i frugten nedbryder _____.",
+ "answer": "protein",
+ "alternatives": [
+ "proteiner",
+ "proteinet"
+ ],
+ "decoys": [
+ "sukker",
+ "fedt",
+ "stivelse"
+ ],
+ "note": "Ananas indeholder bromelain, der klipper gelatinens proteinkæder over. Dåseananas er varmebehandlet og virker fint."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "En grøn peberfrugt er som regel bare en _____ rød peberfrugt.",
+ "answer": "umoden",
+ "alternatives": [
+ "ikke moden",
+ "uopmoden"
+ ],
+ "decoys": [
+ "syg",
+ "tørret",
+ "frossen"
+ ],
+ "note": "De fleste peberfrugter skifter fra grøn til gul, orange eller rød, når de modner på planten."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Ægte parmesan er ikke vegetarisk, fordi den laves med løbe fra maven af _____.",
+ "answer": "kalve",
+ "alternatives": [
+ "kalv",
+ "unge kalve",
+ "kalvemaver"
+ ],
+ "decoys": [
+ "grise",
+ "heste",
+ "kaniner"
+ ],
+ "note": "Reglerne for Parmigiano Reggiano kræver naturlig kalveløbe, et enzym fra kalvens mave."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Cashewnødder sælges aldrig i skal, fordi skallen indeholder samme hudirriterende stof som _____.",
+ "answer": "giftsumak",
+ "alternatives": [
+ "poison ivy",
+ "giftsumakken"
+ ],
+ "decoys": [
+ "brændenælder",
+ "bjørneklo",
+ "chili"
+ ],
+ "note": "Skallen indeholder urushiol, det samme stof som i giftsumak. Cashew og giftsumak er i samme plantefamilie."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Carlsberg er opkaldt efter brygger J.C. Jacobsens _____.",
+ "answer": "søn",
+ "alternatives": [
+ "søn Carl",
+ "Carl"
+ ],
+ "decoys": [
+ "hest",
+ "hund",
+ "kone"
+ ],
+ "note": "Bryggeriet fra 1847 blev opkaldt efter sønnen Carl Jacobsen plus \"bjerg\" for bakken i Valby."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Sort te og grøn te er lavet af blade fra _____, forskellen ligger kun i forarbejdningen.",
+ "answer": "samme plante",
+ "alternatives": [
+ "den samme plante",
+ "samme busk",
+ "den samme busk",
+ "teplanten"
+ ],
+ "decoys": [
+ "to forskellige buske",
+ "to forskellige træer",
+ "hver sin palme"
+ ],
+ "note": "Begge kommer fra Camellia sinensis. Sort te oxideres, grøn te varmebehandles hurtigt for at undgå det."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Bananer er en lille smule _____ på grund af deres indhold af kalium.",
+ "answer": "radioaktive",
+ "alternatives": [
+ "radioaktiv"
+ ],
+ "decoys": [
+ "magnetiske",
+ "selvlysende",
+ "giftige"
+ ],
+ "note": "En lille del af naturligt kalium er den radioaktive isotop kalium-40. Strålingen er helt ufarlig."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Safran er tørrede støvfang fra en _____.",
+ "answer": "krokus",
+ "alternatives": [
+ "safrankrokus",
+ "krokusblomst"
+ ],
+ "decoys": [
+ "tulipan",
+ "lilje",
+ "orkidé"
+ ],
+ "note": "Hver blomst af Crocus sativus giver kun tre støvfang, som plukkes i hånden. Derfor er safran så dyrt."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "Vanilje kommer fra frugten af en _____.",
+ "answer": "orkidé",
+ "alternatives": [
+ "orkide",
+ "vaniljeorkidé",
+ "orkidéart"
+ ],
+ "decoys": [
+ "palme",
+ "lilje",
+ "krokus"
+ ],
+ "note": "Vaniljestangen er en frøkapsel fra slyngplanten Vanilla planifolia, som er en orkidé."
+ },
+ {
+ "category": "Mad og drikke",
+ "prompt": "_____ kan ikke mærke det brændende i chili og spreder derfor frøene.",
+ "answer": "fugle",
+ "alternatives": [
+ "fuglene",
+ "fugl"
+ ],
+ "decoys": [
+ "køer",
+ "rotter",
+ "heste"
+ ],
+ "note": "Fuglenes receptor reagerer ikke på capsaicin. Pattedyr, der ville knuse frøene, skræmmes væk af styrken."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Én omdrejning om Venus' egen akse tager længere tid end ét _____ på Venus.",
+ "answer": "år",
+ "alternatives": [
+ "venusår",
+ "Venus-år",
+ "år på Venus"
+ ],
+ "decoys": [
+ "århundrede",
+ "årti",
+ "årtusinde"
+ ],
+ "note": "Venus roterer på 243 jorddøgn, men kredser om Solen på kun 225 jorddøgn."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Månen bevæger sig hvert år ca. _____ længere væk fra Jorden.",
+ "answer": "3,8 centimeter",
+ "alternatives": [
+ "3,8 cm",
+ "4 centimeter",
+ "4 cm",
+ "knap 4 centimeter"
+ ],
+ "decoys": [
+ "3 millimeter",
+ "40 centimeter",
+ "1 meter"
+ ],
+ "note": "Målt med laserstråler mod spejle, som Apollo-astronauterne efterlod på Månen."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Et lyn kan opvarme luften til ca. _____ gange Solens overfladetemperatur.",
+ "answer": "fem",
+ "alternatives": [
+ "5"
+ ],
+ "decoys": [
+ "to",
+ "hundrede",
+ "tusind"
+ ],
+ "note": "Lynkanalen kan nå op mod 30.000 °C, mens Solens overflade er ca. 5.500 °C."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Planeten Saturn har lavere massefylde end _____.",
+ "answer": "vand",
+ "alternatives": [
+ "vand har",
+ "almindeligt vand"
+ ],
+ "decoys": [
+ "luft",
+ "helium",
+ "vanddamp"
+ ],
+ "note": "Saturns gennemsnitlige massefylde er ca. 0,69 g/cm³, mindre end vands 1 g/cm³."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Jorden er den eneste planet i solsystemet, der ikke er opkaldt efter en _____.",
+ "answer": "gud",
+ "alternatives": [
+ "guddom",
+ "gudinde",
+ "gud eller gudinde",
+ "mytologisk figur"
+ ],
+ "decoys": [
+ "farve",
+ "stjerne",
+ "romersk kejser"
+ ],
+ "note": "De øvrige planeter har navne fra græsk eller romersk mytologi. Jorden har et gammelt germansk navn."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Den danske astronom Ole Rømer viste i 1676 ved hjælp af Jupiters måne Io, at _____ ikke bevæger sig uendelig hurtigt.",
+ "answer": "lyset",
+ "alternatives": [
+ "lys"
+ ],
+ "decoys": [
+ "tyngdekraften",
+ "magnetismen",
+ "tiden"
+ ],
+ "note": "Io's formørkelser kom for sent, når Jorden var langt fra Jupiter. Rømer forklarede det med lysets endelige hastighed."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Visse bambusarter kan vokse næsten _____ på ét døgn.",
+ "answer": "en meter",
+ "alternatives": [
+ "1 meter",
+ "91 centimeter",
+ "90 centimeter"
+ ],
+ "decoys": [
+ "en millimeter",
+ "en centimeter",
+ "ti meter"
+ ],
+ "note": "Nogle bambusarter er målt til at vokse op til 91 cm på 24 timer, blandt de hurtigste planter i verden."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Diamant og blyantens grafit består begge af rent _____.",
+ "answer": "kulstof",
+ "alternatives": [
+ "carbon",
+ "kul"
+ ],
+ "decoys": [
+ "silicium",
+ "jern",
+ "kvarts"
+ ],
+ "note": "Forskellen ligger kun i, hvordan kulstofatomerne er bundet sammen."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Rav er forstenet _____.",
+ "answer": "harpiks",
+ "alternatives": [
+ "træharpiks",
+ "kåde",
+ "harpiks fra træer"
+ ],
+ "decoys": [
+ "honning",
+ "fiskeolie",
+ "mos"
+ ],
+ "note": "Det baltiske rav, der skyller op på danske strande, er omkring 40 millioner år gammel harpiks fra nåletræer."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Omkring halvdelen af Jordens ilt produceres af _____ i havet.",
+ "answer": "plankton",
+ "alternatives": [
+ "planteplankton",
+ "fytoplankton",
+ "mikroalger",
+ "alger"
+ ],
+ "decoys": [
+ "hvaler",
+ "vandmænd",
+ "fisk"
+ ],
+ "note": "Mikroskopiske planteplankton står ifølge NOAA for ca. halvdelen af Jordens iltproduktion."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Toppen af Mount Everest består af kalksten med fossiler af _____.",
+ "answer": "havdyr",
+ "alternatives": [
+ "dyr fra havet",
+ "havdyr som trilobitter",
+ "trilobitter",
+ "søliljer"
+ ],
+ "decoys": [
+ "dinosaurer",
+ "mammutter",
+ "palmer"
+ ],
+ "note": "Kalkstenen blev dannet på havbunden for ca. 450 millioner år siden og senere presset op af kontinentalpladerne."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Jordens indre kerne er omtrent lige så varm som _____ overflade.",
+ "answer": "Solens",
+ "alternatives": [
+ "solens"
+ ],
+ "decoys": [
+ "Månens",
+ "Mars'",
+ "Venus'"
+ ],
+ "note": "Den indre kerne er ca. 5.200-5.400 °C, næsten som Solens overflade på ca. 5.500 °C."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Ifølge en opgørelse fra 2015 findes der omkring 3.000 milliarder _____ på Jorden, flere end der er stjerner i Mælkevejen.",
+ "answer": "træer",
+ "alternatives": [
+ "træ"
+ ],
+ "decoys": [
+ "fugle",
+ "katte",
+ "mennesker"
+ ],
+ "note": "Studiet i Nature (Crowther m.fl., 2015) kom frem til ca. 3,04 billioner træer. Mælkevejen har 100-400 milliarder stjerner."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Målt på nedbør er Antarktis verdens største _____.",
+ "answer": "ørken",
+ "alternatives": [
+ "ørkenområde",
+ "polarørken"
+ ],
+ "decoys": [
+ "regnskov",
+ "sump",
+ "steppe"
+ ],
+ "note": "En ørken defineres ud fra lidt nedbør, ikke varme. Indlandet på Antarktis får kun få centimeter om året."
+ },
+ {
+ "category": "Rummet og naturen",
+ "prompt": "Dværgplaneten Pluto blev i 1930 navngivet efter forslag fra en _____-årig skolepige.",
+ "answer": "11",
+ "alternatives": [
+ "elleve"
+ ],
+ "decoys": [
+ "6",
+ "8",
+ "16"
+ ],
+ "note": "Den 11-årige Venetia Burney fra Oxford foreslog navnet efter underverdenens romerske gud."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Den danske kemiker S.P.L. Sørensen indførte pH-skalaen i 1909, mens han arbejdede for _____.",
+ "answer": "Carlsberg",
+ "alternatives": [
+ "Carlsberg Laboratorium",
+ "Carlsbergs laboratorium",
+ "Carlsberg Laboratoriet",
+ "Carlsberg Laboratoriet i Valby"
+ ],
+ "decoys": [
+ "Tuborg",
+ "Mærsk",
+ "Københavns Zoo"
+ ],
+ "note": "Sørensen ledte kemiafdelingen på Carlsberg Laboratorium og havde brug for et præcist mål for surhed i bryggeprocessen."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Navnet LEGO kommer af de danske ord _____.",
+ "answer": "leg godt",
+ "alternatives": [
+ "\"leg godt\"",
+ "leg-godt"
+ ],
+ "decoys": [
+ "lær godt",
+ "let og god",
+ "lege og gøre"
+ ],
+ "note": "Ole Kirk Christiansen fandt på navnet i 1934 ud fra \"leg godt\"."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "H.C. Ørsted var i 1825 den første til at fremstille metallet _____.",
+ "answer": "aluminium",
+ "alternatives": [
+ "aluminum"
+ ],
+ "decoys": [
+ "titan",
+ "zink",
+ "magnesium"
+ ],
+ "note": "Ørsted fremstillede som den første (uren) aluminium. Wöhler forbedrede metoden få år senere."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Danske Valdemar Poulsen opfandt i 1898 den første maskine, der kunne optage lyd _____.",
+ "answer": "magnetisk",
+ "alternatives": [
+ "magnetisk på ståltråd",
+ "på ståltråd",
+ "magnetiske"
+ ],
+ "decoys": [
+ "digitalt",
+ "optisk",
+ "i stereo"
+ ],
+ "note": "Poulsens telegrafon optog lyd magnetisk på ståltråd og er forfader til båndoptageren og harddisken."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Bobleplast blev oprindeligt opfundet som _____.",
+ "answer": "tapet",
+ "alternatives": [
+ "tapet med struktur",
+ "vægtapet"
+ ],
+ "decoys": [
+ "badeforhæng",
+ "legetøj",
+ "regnfrakker"
+ ],
+ "note": "Al Fielding og Marc Chavannes forsøgte i 1957 at lave et moderne strukturtapet. Det blev ikke en succes."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Mikrobølgeovnen blev opfundet, efter at radarudstyr havde smeltet en _____ i ingeniørens lomme.",
+ "answer": "chokoladebar",
+ "alternatives": [
+ "slikbar",
+ "chokolade",
+ "slik",
+ "chokoladeplade"
+ ],
+ "decoys": [
+ "smørklat",
+ "stearinlys",
+ "ostemad"
+ ],
+ "note": "Percy Spencer opdagede i 1945 effekten ved en magnetron og fik patent på mikrobølgeovnen."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Limen på Post-it-sedler var egentlig et fejlslagent forsøg på at lave en _____ lim.",
+ "answer": "superstærk",
+ "alternatives": [
+ "meget stærk",
+ "ekstra stærk",
+ "stærk"
+ ],
+ "decoys": [
+ "spiselig",
+ "vandopløselig",
+ "selvlysende"
+ ],
+ "note": "Spencer Silver hos 3M ville i 1968 lave en superstærk lim, men fik en svag lim, der kunne genbruges."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Burrebåndet (velcro) blev opfundet, efter at opfinderen undrede sig over _____ i sin hunds pels.",
+ "answer": "burrer",
+ "alternatives": [
+ "burresnerre",
+ "burresnerrer",
+ "borrer",
+ "frøstande"
+ ],
+ "decoys": [
+ "fuglefjer",
+ "edderkoppespind",
+ "tang"
+ ],
+ "note": "Schweizeren George de Mestral studerede burrernes små kroge under mikroskop efter en gåtur i 1941."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Den allerførste computermus fra 1964 var lavet af _____.",
+ "answer": "træ",
+ "alternatives": [
+ "en træklods",
+ "træklods"
+ ],
+ "decoys": [
+ "glas",
+ "porcelæn",
+ "kork"
+ ],
+ "note": "Douglas Engelbarts prototype var en træklods med to metalhjul under."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Bluetooth er opkaldt efter den danske konge _____.",
+ "answer": "Harald Blåtand",
+ "alternatives": [
+ "Harald",
+ "Harald Bluetooth",
+ "Harald 1."
+ ],
+ "decoys": [
+ "Gorm den Gamle",
+ "Svend Tveskæg",
+ "Knud den Store"
+ ],
+ "note": "Harald Blåtand samlede Danmark og Norge, ligesom teknologien skulle samle enheder. Logoet er hans runeinitialer."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Coca-Cola blev i 1886 oprindeligt solgt som _____.",
+ "answer": "medicin",
+ "alternatives": [
+ "nervemedicin",
+ "patentmedicin",
+ "hovedpinemedicin",
+ "et lægemiddel",
+ "lægemiddel",
+ "tonic"
+ ],
+ "decoys": [
+ "hårvand",
+ "rengøringsmiddel",
+ "rottegift"
+ ],
+ "note": "Apotekeren John Pemberton markedsførte drikken som et middel mod bl.a. hovedpine og nervøsitet."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Danske Karl Krøyer hævede i 1964 et sunket skib i Kuwait ved at fylde det med _____.",
+ "answer": "isoporkugler",
+ "alternatives": [
+ "flamingokugler",
+ "polystyrenkugler",
+ "isopor",
+ "flamingo",
+ "plastkugler",
+ "polystyren"
+ ],
+ "decoys": [
+ "bordtennisbolde",
+ "badebolde",
+ "balloner"
+ ],
+ "note": "Omkring 27 millioner små polystyrenkugler blev pumpet ned i skibet, så det fik opdrift nok til at flyde."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Verdens første webcam blev sat op i 1991 for at holde øje med en _____.",
+ "answer": "kaffekande",
+ "alternatives": [
+ "kaffemaskine",
+ "kaffekolbe",
+ "kaffekande på universitetet"
+ ],
+ "decoys": [
+ "fuglerede",
+ "parkeringsplads",
+ "fiskedam"
+ ],
+ "note": "Forskere på Cambridge Universitet kunne fra skærmen se, om der var kaffe i kanden i Trojan Room."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "Den første vare, der blev scannet med stregkode i et supermarked i 1974, var en pakke _____.",
+ "answer": "tyggegummi",
+ "alternatives": [
+ "Wrigley's tyggegummi",
+ "Juicy Fruit"
+ ],
+ "decoys": [
+ "cigaretter",
+ "havregryn",
+ "kaffe"
+ ],
+ "note": "En pakke Wrigley's Juicy Fruit blev scannet i Marsh Supermarket i Ohio den 26. juni 1974."
+ },
+ {
+ "category": "Opfindelser",
+ "prompt": "H.C. Ørsted opdagede i 1820, at elektrisk strøm kan få en _____ til at bevæge sig.",
+ "answer": "kompasnål",
+ "alternatives": [
+ "magnetnål",
+ "kompas"
+ ],
+ "decoys": [
+ "pendul",
+ "termometersøjle",
+ "barometernål"
+ ],
+ "note": "Opdagelsen af elektromagnetismen lagde grunden til elmotoren, generatoren og telegrafen."
+ }
+]
\ No newline at end of file
diff --git a/fupogfakta/data/questions_b.json b/fupogfakta/data/questions_b.json
index 170b66b..57863a9 100644
--- a/fupogfakta/data/questions_b.json
+++ b/fupogfakta/data/questions_b.json
@@ -1,20 +1,4 @@
[
- {
- "category": "Danmark",
- "prompt": "Navnet LEGO er dannet af de to danske ord _____.",
- "answer": "leg godt",
- "alternatives": [
- "leg godt",
- "\"leg godt\"",
- "leggodt"
- ],
- "decoys": [
- "lille gode",
- "lad os lege",
- "let og god"
- ],
- "note": "Ole Kirk Christiansen dannede i 1934 navnet LEGO af \"LEg GOdt\"."
- },
{
"category": "Danmark",
"prompt": "Den Lille Havfrues krop er modelleret efter billedhuggerens _____.",
@@ -160,23 +144,6 @@
],
"note": "Præsten Rasmus Malling-Hansens skrivekugle var en af de første kommercielle skrivemaskiner; Nietzsche brugte en i 1882."
},
- {
- "category": "Danmark",
- "prompt": "Den trådløse teknologi Bluetooth er opkaldt efter _____.",
- "answer": "Harald Blåtand",
- "alternatives": [
- "harald blåtand",
- "harald bluetooth",
- "harald 1.",
- "kong harald"
- ],
- "decoys": [
- "Gorm den Gamle",
- "Svend Tveskæg",
- "Knud den Store"
- ],
- "note": "Navnet hylder vikingekongen der samlede Danmark, ligesom teknologien skulle samle enheder; logoet er hans runeinitialer."
- },
{
"category": "Danmark",
"prompt": "Dyrehavsbakken, der regnes for verdens ældste forlystelsespark, går tilbage til år _____.",
@@ -1057,23 +1024,6 @@
],
"note": "Aleuterne krydser 180. længdegrad, så Alaskas yderste øer ligger på østlig længde."
},
- {
- "category": "Geografi",
- "prompt": "Verdens største ørken er _____.",
- "answer": "Antarktis",
- "alternatives": [
- "antarktis",
- "antarktika",
- "sydpolen",
- "antarktisk ørken"
- ],
- "decoys": [
- "Gobi",
- "Arabiske Ørken",
- "Kalahari"
- ],
- "note": "En ørken defineres ved lav nedbør; Antarktis er ca. 14 mio. km², større end Sahara."
- },
{
"category": "Geografi",
"prompt": "Det sted i havet, der ligger længst fra land, kaldes Point _____.",
diff --git a/party/static/party/common.js b/party/static/party/common.js
new file mode 100644
index 0000000..e5337cb
--- /dev/null
+++ b/party/static/party/common.js
@@ -0,0 +1,322 @@
+/* Fup og Fakta – fælles hjælpere (plain script, eksporterer window.WPP). */
+(function () {
+ 'use strict';
+ var WPP = (window.WPP = window.WPP || {});
+
+ /* ---------- tekst ---------- */
+ var ESC = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' };
+ WPP.esc = function (s) {
+ return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return ESC[c]; });
+ };
+ /* "Asger, Bo og Sus" – input skal allerede være escaped HTML */
+ WPP.joinNames = function (arr) {
+ arr = (arr || []).filter(Boolean);
+ if (arr.length <= 1) return arr.join('');
+ return arr.slice(0, -1).join(', ') + ' og ' + arr[arr.length - 1];
+ };
+ /* Spørgsmål med pænt stylet blank. fill = tekst der indsættes (sandheden) */
+ WPP.promptHtml = function (prompt, fill) {
+ var html = WPP.esc(prompt);
+ var inner = fill ? '' + WPP.esc(fill) + '' : '';
+ if (/_{3,}/.test(html)) return html.replace(/_{3,}/, inner);
+ return html;
+ };
+ WPP.fmt = function (n) {
+ n = Math.round(Number(n) || 0);
+ return String(Math.abs(n)).replace(/\B(?=(\d{3})+(?!\d))/g, '.').replace(/^/, n < 0 ? '−' : '');
+ };
+ WPP.signed = function (n) { n = Number(n) || 0; return (n >= 0 ? '+' : '−') + WPP.fmt(Math.abs(n)); };
+ WPP.playerMap = function (state) {
+ var m = {};
+ ((state && state.players) || []).forEach(function (p) { m[p.id] = p; });
+ return m;
+ };
+ WPP.chip = function (p, extra) {
+ if (!p) return '';
+ return '' +
+ '' + WPP.esc(p.name) + '';
+ };
+ WPP.roundTitle = function (round) {
+ if (!round) return '';
+ var name = WPP.esc(round.name || ('Runde ' + (round.number || '')));
+ var m = round.multiplier || 1;
+ if (m === 2) return name + ' – dobbelt point!';
+ if (m === 3) return name + ' – tredobbelt point!';
+ if (m > 3) return name + ' – ×' + m + ' point!';
+ return name;
+ };
+
+ /* ---------- lokal lagring (kan kaste i privat-vindue) ---------- */
+ WPP.ls = {
+ get: function (k) { try { return localStorage.getItem(k); } catch (e) { return null; } },
+ set: function (k, v) { try { localStorage.setItem(k, v); } catch (e) { /* ignorér */ } },
+ del: function (k) { try { localStorage.removeItem(k); } catch (e) { /* ignorér */ } }
+ };
+
+ /* ---------- server-ur ---------- */
+ var offset = 0;
+ WPP.setServerTime = function (t) { if (typeof t === 'number' && isFinite(t)) offset = t - Date.now(); };
+ WPP.now = function () { return Date.now() + offset; };
+ WPP.secondsLeft = function (deadline) {
+ if (!deadline) return null;
+ return Math.max(0, Math.ceil((deadline - WPP.now()) / 1000));
+ };
+ var KNOWN = { category: 15000, lie: 60000, guess: 30000, scores: 10000 };
+ var seenTotals = {};
+ WPP.totalFor = function (phase, deadline) {
+ if (!deadline) return 0;
+ var left = deadline - WPP.now();
+ if (KNOWN[phase]) return Math.max(KNOWN[phase], left);
+ var k = phase + ':' + deadline;
+ if (!seenTotals[k]) seenTotals[k] = Math.max(1000, left);
+ return seenTotals[k];
+ };
+
+ /* Nedtællings-markup. Opdateres af den globale ticker. kind: 'pill' | 'ring' | 'bar' */
+ WPP.timerHtml = function (state, kind) {
+ if (!state || !state.deadline) return '';
+ var total = WPP.totalFor(state.phase, state.deadline);
+ var attrs = ' data-deadline="' + state.deadline + '" data-total="' + total + '"';
+ var s = ''; /* udfyldes af tick() – holder markup stabil mellem renders */
+ if (kind === 'ring') {
+ return '
' +
+ '' + s + '
';
+ }
+ if (kind === 'bar') return '
';
+ return '' + s + '';
+ };
+ var tickers = [];
+ WPP.onTick = function (fn) { tickers.push(fn); };
+ function tick() {
+ var els = document.querySelectorAll('.js-timer');
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i];
+ var dl = Number(el.getAttribute('data-deadline'));
+ var total = Number(el.getAttribute('data-total')) || 1;
+ var leftMs = Math.max(0, dl - WPP.now());
+ var s = Math.ceil(leftMs / 1000);
+ var frac = Math.max(0, Math.min(1, leftMs / total));
+ var num = el.querySelector('.num');
+ if (num && num.textContent !== String(s)) num.textContent = s;
+ el.style.setProperty('--frac', frac.toFixed(4));
+ el.classList.toggle('urgent', s <= 5);
+ el.classList.toggle('over', leftMs <= 0);
+ }
+ for (var j = 0; j < tickers.length; j++) {
+ try { tickers[j](); } catch (e) { if (window.console) console.error(e); }
+ }
+ }
+ setInterval(tick, 200);
+ WPP.tick = tick;
+
+ /* ---------- DOM-patch: genbrug uændrede [data-k]-noder ----------
+ Top-level-børn med data-k sammenlignes på deres genererede HTML; uændrede noder
+ bevares (fokus, inputtekst og animationer overlever). Noder med data-patch
+ patches rekursivt i stedet for at blive erstattet. */
+ function syncAttrs(o, n) {
+ var i, a;
+ for (i = o.attributes.length - 1; i >= 0; i--) {
+ a = o.attributes[i].name;
+ if (!n.hasAttribute(a)) o.removeAttribute(a);
+ }
+ for (i = 0; i < n.attributes.length; i++) {
+ a = n.attributes[i];
+ if (o.getAttribute(a.name) !== a.value) o.setAttribute(a.name, a.value);
+ }
+ }
+ function patchChildren(target, newParent) {
+ var old = {}, keep = new Set(), desired = [];
+ Array.prototype.forEach.call(target.children, function (el) {
+ var k = el.getAttribute('data-k');
+ if (k && !old[k]) old[k] = el;
+ });
+ Array.prototype.slice.call(newParent.children).forEach(function (n) {
+ var k = n.getAttribute('data-k');
+ var o = k && old[k];
+ if (o && !keep.has(o)) {
+ if (o._h === n._h) { desired.push(o); keep.add(o); return; }
+ if (n.hasAttribute('data-patch') && o.hasAttribute('data-patch') && o.tagName === n.tagName) {
+ syncAttrs(o, n); patchChildren(o, n); o._h = n._h;
+ desired.push(o); keep.add(o); return;
+ }
+ }
+ desired.push(n);
+ });
+ Array.prototype.slice.call(target.childNodes).forEach(function (c) { if (!keep.has(c)) target.removeChild(c); });
+ var cur = target.firstChild;
+ desired.forEach(function (n) {
+ if (cur === n) { cur = n.nextSibling; return; }
+ target.insertBefore(n, cur);
+ });
+ }
+ WPP.patch = function (target, html) {
+ var tpl = document.createElement('template');
+ tpl.innerHTML = html;
+ Array.prototype.forEach.call(tpl.content.querySelectorAll('[data-k]'), function (e) { e._h = e.outerHTML; });
+ patchChildren(target, tpl.content);
+ tick();
+ };
+
+ /* Skal: skærm + toasts + forbindelses-overlay */
+ WPP.shell = function (root) {
+ if (root._shell) return root._shell;
+ root.classList.add('wpp-root');
+ root.innerHTML = '' +
+ '
';
+ }
+
+ function reveal(state, u) {
+ var r = state.reveal || {};
+ var steps = r.steps || [];
+ var players = WPP.playerMap(state);
+ var pr = revealProgress(state, u);
+ var truth = steps.filter(function (s) { return s.is_truth; })[0];
+ var truthShown = truth && (pr.done || (steps[pr.i] === truth && pr.stage >= 2));
+ var out = questionBlock(state, 'small rv', truthShown ? truth.text : '');
+ if (!pr.done) {
+ var s = steps[pr.i];
+ var who = '', stamp = '';
+ if (pr.stage >= 1) {
+ var g = s.guessed_by || [];
+ who = '
' : '') + '';
+ }
+
+ function screenLobby(state, me, players) {
+ var list = state.players || [];
+ var out = '';
+ if (me.role === 'audience') {
+ out += big('Du er publikum!', 'Spillet er fyldt op eller allerede i gang. Du kan stadig gætte med og dele hjerter ud.', 'aud', 'pop');
+ } else {
+ var p = players[me.id];
+ out += '
';
+ }).join('') + '';
+ }
+
+ function screenLie(state, me, players, root) {
+ var q = state.question || {};
+ var qk = (state.round ? state.round.number + '.' + state.round.question_number : '') + ':' + (q.prompt || '');
+ var out = questionCard(state, 'q:' + qk);
+ if (me.role === 'audience') return out + big('Spillerne finder på løgne…', 'Snart skal du gætte, hvad der er sandt.', 'aud', 'pulse');
+ if (me.lie) {
+ out += big('Godt løjet!', 'Venter på de andre…', 'done', 'pop') +
+ '
Din løgn: ' + esc(me.lie) + '
';
+ return out + progress(state);
+ }
+ out += '';
+ return out + progress(state);
+ }
+ function progress(state) {
+ var ps = (state.players || []);
+ var done = ps.filter(function (p) { return p.done; }).length;
+ return '
' + done + ' af ' + ps.length + ' er færdige
';
+ }
+
+ function heartList(state, me, excludeIds, k) {
+ var ans = (state.answers || []).filter(function (a) {
+ if (excludeIds.indexOf(a.id) >= 0) return false;
+ if (me.own_answer_id && a.id === me.own_answer_id) return false;
+ if (state.reveal && (state.reveal.steps || []).some(function (st) { return st.answer_id === a.id && st.is_truth; })) return false;
+ if (me.lie && String(a.text).trim().toLowerCase() === String(me.lie).trim().toLowerCase()) return false;
+ return true;
+ });
+ if (!ans.length) return '';
+ var likes = me.likes || [];
+ return '
Giv et hjerte til de bedste løgne
' +
+ ans.map(function (a) {
+ var on = likes.indexOf(a.id) >= 0;
+ return '
' + esc(a.text) + '
';
+ }).join('') + '';
+ }
+
+ function screenGuess(state, me) {
+ var q = state.question || {};
+ var out = questionCard(state, 'gq:' + (q.prompt || ''));
+ var ans = state.answers || [];
+ if (me.guess) {
+ var picked = ans.filter(function (a) { return a.id === me.guess; })[0];
+ out += '
Du gættede på
' + esc(picked ? picked.text : '…') + '
';
+ out += heartList(state, me, [me.guess], 'hearts');
+ out += '
Venter på de andre…
';
+ return out;
+ }
+ out += '
Hvad er sandheden?
';
+ out += '' +
+ ans.map(function (a, i) {
+ return '';
+ }).join('') + '';
+ return out;
+ }
+
+ function screenReveal(state, me) {
+ var out = big('Kig op på skærmen!', '', 'look', 'look');
+ if (me.role === 'player' && me.last_delta != null) {
+ out += '' +
+ (me.last_delta > 0 ? '' + WPP.signed(me.last_delta) + 'point til dig!'
+ : '0point denne gang') + '';
+ }
+ out += heartList(state, me, [], 'hearts');
+ return out;
+ }
+
+ function rankOf(state, id) {
+ var ps = (state.players || []).slice().sort(function (a, b) { return (b.score || 0) - (a.score || 0); });
+ for (var i = 0; i < ps.length; i++) {
+ if (ps[i].id === id) {
+ var place = 1;
+ while (place - 1 < i && (ps[place - 1].score || 0) > (ps[i].score || 0)) place++;
+ return { place: place, of: ps.length, p: ps[i] };
+ }
+ }
+ return null;
+ }
+
+ function screenScores(state, me) {
+ var out = '
Stillingen
';
+ var r = me.role === 'player' && rankOf(state, me.id);
+ if (r) {
+ out += '