Im Brettspiel The Settlers of Catan gibt es fünf Ressourcentypen: Brick, Log, Ore, Wheat und Sheep. Der Bau einer Siedlung kostet einen Ziegelstein, einen Baumstamm, einen Weizen und ein Schaf. Sie können jedoch auch mit vier identischen Ressourcen handeln, um eine Ressource eines anderen Typs zu erhalten. Wenn Sie zum Beispiel vier Erze in der Hand hätten, könnten Sie alle eintauschen und ein Schaf bekommen.
Ihre Aufgabe ist es festzustellen, ob ich mit meiner Hand eine Siedlung bauen kann oder nicht.
Deine Aufgabe
Eingang wird eine Abfolge der Buchstaben B
, L
, O
, W
, und S
in jedem vernünftigen Format gemacht. Diese Buchstaben entsprechen den fünf oben angegebenen Ressourcentypen. Sie sollten ausgeben, ob ich die Ressourcen habe, die zum Aufbau einer Siedlung erforderlich sind, und dabei die Möglichkeit berücksichtigen, mit vier Gleichartigen zu handeln.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Anmerkungen
- Sie müssen nicht ausgeben, welche Trades ich ausführen muss oder wie viele Siedlungen ich aufbauen könnte. Ein einfaches "Ja" oder "Nein" reicht aus.
- Sie können nicht davon ausgehen, dass sich die Eingabe in einer bestimmten Reihenfolge befindet. Insbesondere können Sie nicht davon ausgehen, dass Ressourcen desselben Typs zusammen gruppiert sind. Dies
OBLSO
ist also eine gültige Eingabe. - Da dies ein Entscheidungsproblem ist , können Sie jeden Wert verwenden, den Sie als "Ja" und "Nein" bezeichnen möchten, sofern die beiden ausgewählten Werte unterschiedlich und konsistent sind.
- Die einzigen Regeln, um die es hier geht, sind die oben aufgeführten. Kompliziertere Regeln für Siedler von Catan wie der Handel mit anderen Spielern oder an Häfen sind hier nicht relevant.
- Die Eingabe von Zeichen (
B
,L
,O
,W
,S
) können mit anderen Werten ersetzt werden , wenn es einfacher für Ihre bestimmte Sprache der Wahl ist, so lange es fünf verschiedene Eingänge. Wenn Sie andere Eingabewerte verwenden, geben Sie diese bitte in Ihrer Antwort an.
Beispiele
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
quelle
Antworten:
Python 2 , 54 Bytes
Probieren Sie es online!
Für jede unserer Ressourcen zählen wir die Anzahl der „Freiheiten“, die sich aus n dieser Ressourcen ergeben. Eine Freiheit ist eine Gelegenheit , einen der Brick-Log-Wheat-Sheep-Slots zu füllen, die wir für die Besiedlung benötigen, und dabei die Tatsache zu berücksichtigen, dass wir unsere Ressourcen umwandeln können.
Für alle BLSW, mit einer der Ressource gibt uns eine solche Freiheit, und jede weitere mehr als 4 gibt uns ein anderes. Die Freiheitszählregel lautet wie folgt:
Also geben n Steine / Stämme / Weizen / Schafe ⌊ (n + 3) / 4⌋ Freiheiten.
Für Erze zählen nur die überschüssigen Vierer. Die Freiheitszählregel lautet wie folgt:
Also geben n Erze ⌊n / 4⌋ Freiheiten.
Theorem: Wir können uns nur zufrieden geben, wenn wir ≥ 4 solcher „Freiheiten“ haben.
Also zählen wir unsere Freiheiten und prüfen, ob es ≥ 4 davon gibt. Um das Zählen von Erzen als ⌊n / 4⌋, aber anderer Ressourcen ⌊ (n + 3) / 4⌋ zu behandeln, erhöhen wir die Anzahl der anderen Ressourcen künstlich um 3 und zählen dann ⌊n / 4⌋ für alle. Wir tun dies durch Mapping
(s+"BLSW"*3).count
statts.count
.Beweis :
Angenommen, wir können uns zufrieden geben. Dann haben wir für jedes von [B, L, S, W] entweder (a) 1 dieser Ressource verwendet, die wir bereits hatten, oder (b) 4 einer anderen Ressource (einschließlich Erze) geopfert, um sie zu erstellen. In jedem Fall zählen wir mindestens 1 Freiheit nach den oben genannten Regeln. Wir haben also ≥ 4 Freiheiten.
Nehmen wir an, wir haben 4 Freiheiten, von denen k auf „Exzesse“ zurückzuführen sind (jede Freiheit von Erzen ist ein Überschuss, und jede Freiheit von anderen Ressourcen, die über die erste hinausgehen, ist ebenfalls eine) und 4-k davon zeugen davon, mindestens eine zu besitzen Ziegel / Holz / Weizen / Schaf (derjenige, der die "erste Freiheit" gab). Dann füllen wir 4 − k Felder mit dem Ziegel / Holz / Weizen / Schaf, das uns unsere erste Freiheit gab, und füllen die verbleibenden k Felder durch Umrechnen unserer Exzesse. Alle 4 Slots sind belegt und wir können uns einrichten. Wir können das natürlich immer noch tun, wenn wir mehr als 4 Freiheiten haben.
Dieser Beweis ist scheiße, aber ich bin müde. Ich bin sicher, es gibt eine bessere Erklärung.
quelle
s
alsoOOOOBLW
, Sie bekommen am Endesum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... also zählen Sie für jeden vonBLOWS
Ihnen, wie oft es in dieser Startzeichenfolge von vorkommt"BLWS"*3
, und fassen Sie es dann zusammen."OOOOBLWBLSWBLSWBLSW"
eigentlich, aber die Zählungen sind natürlich die gleichen.)in"BLSWO"
ist in Python unnötig, nicht wahr? Scheint zumindest in TIO zu arbeiten ..Python 2 ,
5251 Bytes-1 Byte dank Luke (Ersetzen
>=0
durch<0
, Invertieren derFalse
/True
Ergebnisse)Eine unbenannte Funktion, die eine Zeichenfolge aus den Zeichen B , O , W , L und S (wie im OP) verwendet und zurückgibt,
False
ob Sie eine Einigung erzielen können oderTrue
nicht.Probieren Sie es online! (zwingt den Ausgang zum
yes/no
OP).Wie?
Dies ist eine Portierung meiner Gelee-Antwort. Wir müssen jedes fehlende B , W , L oder S aus dem Rest nachholen , nachdem wir jeweils eines davon verwendet haben. Als solches können wir unserer Hand ein zusätzliches O hinzufügen , dann alle Zählungen um eins reduzieren, dann alle Zählungen durch vier dividieren und dann summieren - wenn das Ergebnis null oder mehr ist, können wir abrechnen (entweder weil es keine fehlenden erforderlichen Ressourcen gab) oder weil wir handeln können, um die fehlenden zu erwerben.
quelle
False
für'yes'
undTrue
für'no'
? Dann könnte man ändern ,>=
um<
das Speichern von 1 Byte.Pyth , 14 Bytes
Probieren Sie es hier aus! oder Überprüfen Sie alle Testfälle.
Pyth ,
31 27 1716 BytesÜberprüfen Sie die Testfälle.
Wie funktionieren diese?
Erklärung # 1
Erklärung # 2
Dies sind die von meinem Programm verwendeten Codes:
quelle
+%ld4/ld4
->s.Dld4
//Q4 4
kann sein,/Q16
aber ich bin nicht wirklich sicher ...BBBO
Beispiel4
und durch zu teilen4
.Jelly ,
1312 BytesEin monadischer Link, der eine Liste von Zahlen akzeptiert, die Ihre eigenen Ressourcen darstellen, und
1
zurückgibt, ob Sie sich beruhigen können oder0
nicht.Die Ressourcen sind ,
1, 2, 3, 4, 5
wo5
repräsentiert Ore .Probieren Sie es online! oder sehen Sie sich die Testsuite an (über OP IO).
Wie?
Die Idee ist, zuerst die Ressourcen nach Typ zu zählen und dann alle Zählungen von B , L , W und S um eins zu reduzieren. Wenn wir keine dieser vier gezählt haben, müssen wir jetzt Einträge von -1 erfassen sie aus unseren restlichen Ressourcen (Dies wird tatsächlich erreicht, indem ein zusätzliches O (
5
) hinzugefügt und alle fünf Zählungen um 1 verringert werden ). Als nächstes dividieren wir alle diese Werte durch vier, um zu sehen, wie viele Einheiten wir mit jeder unserer verbleibenden Zählungen nach Ressourcentyp handeln dürfen, ohne die Zählungen -1 und 0 zu beeinflussen (beachten Sie, dass -1 durch vier geteilt ist-1 , nicht 0 ). Zuletzt addieren wir die Werte und prüfen, ob das Ergebnis größer oder gleich Null ist (hier kann größer als -1 verwendet werden, da wir immer ganze Zahlen haben).quelle
Java 8, 101 Bytes
Lambda von
int[]
bisboolean
. Zuweisen zuFunction<int[], Boolean>
.Probieren Sie es online
Ein- und Ausgabe
Die Eingabe ist ein Array von ganzen Zahlen von 0 bis einschließlich 4. 4 stellt Erz dar, und die anderen Abbildungen sind unerheblich. Meine Testfälle sind direkte Übersetzungen der in Frage kommenden Personen, mit 0 als Brick, 1 als Log, 2 als Wheat und 3 als Sheep.
Ausgabe ist, ob eine Siedlung aufgebaut werden kann.
Ungolfed
Erläuterung
h
ist die Anzahl der Ressourcenvierfachen, die für den Handel verfügbar sind. Wir iterieren über jeden Ressourcentyp (außer Erz), inkrementierenh
für jedes Vierfache der zusätzlichen Ressourcen, die wir haben, und dekrementieren, wo keine Ressourcen vorhanden sind. Dann ist unser Ergebnis, obh
nichtnegativ ist.Die Linie
Passt sich
h
angemessen an, unabhängig davon, ob keine Ressourcen vorhanden sind (Mangel) oder mindestens eine Ressource vorhanden ist (Überschuss).f[i]
wird dekrementiert, um die erforderliche Ressource im Überschussfall zu berücksichtigen, was im Engpassfall -1 ergibt. Die vorzeichenbehaftete Rechtsverschiebung reduziert den Ausdruck auf 0 (Überdeckung) oder -1 (Unterdeckung), so dass ein bitweises ODER mit der Anzahlf[i++] / 4
der Überdeckungsvierfachen (im Überdeckungsfall) im Unterdeckungsfall keine Wirkung hat, sondern die Anzahl ergibt sich im Überschussfall.Danksagung
quelle
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Retina , 34 Bytes
Probieren Sie es online! Erläuterung: Für den Bau einer Siedlung sind 4 Ressourcen erforderlich, entweder Ihr erstes B, L, W oder S, oder 4 beliebige andere Ressourcen desselben Typs. Dies entspricht dem Hinzufügen von drei dieser vier Ressourcentypen und dem anschließenden Zählen, um festzustellen, ob Sie über vier Vierergruppen verfügen.
quelle
Jelly , 23 Bytes
Probieren Sie es online!
Die Werte finden Sie in der folgenden Tabelle:
quelle
Retina , 43 Bytes
Probieren Sie es online!
quelle
Python 3 ,
7978 BytesEdit: -1 Byte dank @ Mr.Xcoder
Probieren Sie es online!
quelle
MATL , 19 Bytes
Die Eingabe ist ein numerischer Zeilenvektor, bei dem die Buchstaben wie folgt als Zahlen dargestellt werden:
Output ist
1
für die Wahrheit,0
für die Falschheit.Probieren Sie es online aus !: Überprüfen Sie alle Testfälle .
Wie es funktioniert
BLWS
) ungleich Null sind. Dies gibt eine Zahl c .Kommentierter Code
quelle
> <> 61 Bytes
Probieren Sie es online!
Verwendet die folgende Ressourcenzuordnung:
Es spielt keine Rolle, welche Zuordnung verwendet wird, solange sie sich im Bereich befindet
0-4
, und sie0
wird für O verwendet. Nutzt die Tatsache, dass das Suchen nach der KombinationBLWS
dasselbe ist wie das Suchen nach der Kombination,OBLWS
während sie bereits einenO
Eingang hat Hand.quelle
05AB1E , 19 Bytes
0 -> Erz
1 -> Ziegel
2 -> Holz
3 -> Weizen
4 -> Schafe
Gibt 0 zurück, wenn falsch, und 1, wenn nicht.
Probieren Sie es online!
Erläuterung:
Nicht konkurrierende Lösung: 17 Bytes
In 05AB1E gab es einen Fehler, als ich diese Lösung zum ersten Mal einreichte, bei der einige Operatoren leere Eingaben schlecht handhabten. Dies führte dazu, dass diese Lösung
1
auf eine leere Eingabe antwortete . Dies wurde nun behoben, sodass diese Lösung problemlos funktioniert.Der Unterschied besteht darin, dass wir vor dem Entfernen einer Ressource wahllos ein Erz hinzufügen und dabei die Anzahl der auf diese Weise entfernten Ressourcen zählen. Wir dekrementieren dann den Zähler um 1, um die korrekte Anzahl von B, L, W und S zu erhalten.
Probieren Sie es online!
quelle
JavaScript (SpiderMonkey) , 116 Byte
Probieren Sie es online!
Super klobige schlechte Antwort. Ich bin sicher, es könnte mehr aufgeräumt werden. Methode inspiriert von Lynns Antwort in diesem Thread.
quelle
Kotlin ,
131129 BytesEinreichung
Prüfung
Kann nicht mit TryItOnline arbeiten, funktioniert aber mit try.kotlinlang.org
quelle