- Alice (A) und Bob (B) entschieden sich für eine Schlacht.
- Jeder Kämpfer hat 10 Gesundheit.
- Sie werfen abwechselnd einen 6-seitigen Würfel, um Schaden zu verursachen.
- Dieser Schaden wird aus der Gesundheit des Gegners entfernt.
- Am Ende werden entweder Alice oder Bob ihren Gegner besiegen.
Zeig mir, wie die Schlacht gelaufen ist. Ausgabe dieser Codes für die durchgeführten Aktionen.
Attacke
B a A
^ Combatant
^ Action (attack)
^ Target
Rollen
B r 4
^ Combatant
^ Action (roll)
^ Value
Gesundheitsveränderung
A h 6
^ Combatant
^ Attribute (health)
^ Value
Sieg
A w
^ Combatant
^ Action (win)
Beispielausgabe:
A a B
A r 4
B h 6
B a A
B r 6
A h 4
A a B
A r 6
B h 0
A w
Hier sind die Regeln:
- Schreiben Sie in einer beliebigen Sprache.
- Ein einzelner Würfelwurf sollte die gleiche Chance haben, eine der Zahlen 1, 2, 3, 4, 5 oder 6 zu erhalten.
- Alice fängt immer an (Bob ist ritterlich, altmodisch).
- Geben Sie für jede Runde eine Aktion aus.
- Sie müssen den Angriff melden, würfeln, beschädigen und Aktionen gewinnen.
- Combatants sind Großbuchstaben, Actions sind Kleinbuchstaben.
- Es darf nicht immer dasselbe Ergebnis liefern.
- Zwischen einem Ausgangskämpfer, einer Aktion und einem Wert muss mindestens ein Leerzeichen stehen.
- Die Gewinnaktion findet statt, wenn der Gegner keine oder weniger Gesundheit hat.
- Alle Teile einer Aktion müssen sich in derselben Zeile befinden.
- Es sollte eine Aktion pro Zeile geben.
- Wenigste Bytes gewinnt.
Habe es drauf!
Antworten:
05AB1E , 49 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 3 , 131 Bytes
Probieren Sie es online!
-8 Bytes dank officialaimm
-2 Bytes dank ChooJeremy
quelle
p=print
sparen Sie ca. 8 Bytes.randint(1,6)
könnte durch ersetzt werdenid(X+Y)//3%6+1
, obwohl die Verteilung nicht ganz gleichmäßig ist.C (GCC) ,
146141 BytesProbieren Sie es online!
De-Golf:
quelle
a=65+t,b=66-t
?A*B>0
spart Ihnen ein paar Bytes.A*B
wird noch mehr sparen, aber ich bin irgendwie in Eile atm. Ich aktualisiere abendsPython 3 , 127 Bytes
Dies ist eine Verbesserung der @ HyperNeutrino-Antwort , die nicht in einen Kommentar passt. Siehe die Erklärung unten.
Probieren Sie es online!
Eine epische Suche nach einem kürzeren Python-Würfelwurf
TL; DR: Mithilfe der RSA-Verschlüsselung können 4 Byte weniger als beim Standard-Python-Würfelwurf verarbeitet werden.
Ich wollte sehen, ob der Standard-Python-Würfelwurf ( 32 Byte ) etwas verkürzt werden kann:
Insbesondere
id(x)
ist es sehr praktisch, einen nicht deterministischen Wert in das Programm einzubringen. Meine Idee war dann, diesen Wert irgendwie zu hacken, um eine tatsächliche Zufälligkeit zu erzeugen. Ich habe ein paar Ansätze ausprobiert und einer davon hat sich ausgezahlt: RSA-Verschlüsselung .RSA - Verschlüsselung, aufgrund seiner Einfachheit, erfordert nur wenige Bytes:
m**e%n
. Der nächste Zufallswert kann dann erzeugt werden, indem der vorherige verschlüsselt wird. Vorausgesetzt, der(e,n)
Schlüssel ist verfügbar, kann der Würfelwurf mit 22 Bytes geschrieben werden :Das heißt, wir haben ungefähr 10 Bytes, um einen gültigen RSA-Schlüssel zu definieren. Hier habe ich Glück gehabt. Während meiner Experimente begann ich , die verwenden Mersenne - Primzahl M67 erst später zu erkennen , auf dass Mersenne einen Fehler gemacht , einschließlich M67 in seiner Liste. Es stellt sich heraus, dass es das Produkt von
p=193707721
und istq=761838257287
. Ich hatte meinen Modul gefunden:Nun müssen der Exponent und der Charmichael-Totient Koprime
(p-1)*(q-1)
sein. Zum Glück ist die erste Primzahl, die den Summenwert von n nicht teilt, nur eine Ziffer lang: 7. Der Würfelwurf kann dann mit 28 Bytes (4 Bytes weniger als der Standardansatz) geschrieben werden:Eine gute Sache bei M67 ist, dass der erzeugte Zufallswert 66 Bits hat, was mehr als die üblichen 64 Bits RNG ist. Die Verwendung von RSA ermöglicht es auch, durch mehrmaliges Entschlüsseln des aktuellen Werts in der Zeit zurück zu gehen. Hier sind die Verschlüsselungs- und Entschlüsselungsschlüssel:
Ich bin definitiv kein Experte für Statistik oder Kryptographie, daher kann ich nicht genau sagen, ob dieses RNG die Kriterien für "gute Zufälligkeit" überprüft oder nicht. Ich habe einen kleinen Benchmark geschrieben , der die Standardabweichung des Auftretens von 1 bis 6 Würfeln mit verschiedenen RNGs vergleicht. Die vorgeschlagene Lösung scheint genauso zu funktionieren wie die anderen.
quelle
JavaScript (ES6), 122 Byte
Probieren Sie es online!
quelle
Java (JDK 10) , 180 Byte
Probieren Sie es online!
Credits
quelle
var
? o.Ô Ich muss wirklich bald einige der neuen Spezifikationen untersuchen. Wie auch immer, Sie können 4 Bytes Golf spielen, indem Sie das Zeichen-Array in int-Arrayv->{var r="";int P[]={65,66},p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,P[p],P[p^=1]);return r+=P[p^1]+" w";}
65 w
stattA w
. Deshalb habe ich es aus derint ...
Aussage extrahiert : ein paar Bytes Golf spielen ;-)v->{var r="";int p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,p+65,(p^=1)+65);return r+(p<1?"B":"A")+" w";}
( 181 bytes )Perl 5 ,
938887 BytesProbieren Sie es online!
quelle
Ruby ,
122 120 96 9291 BytesDank Asone Tuhid 1 Byte gespeichert .
Probieren Sie es online!
quelle
["A", "a", "B"]
? Wenn ja, habe ich diese 96-Byte-Lösung.?(p [x,?w]):
durch?p([x,?w]):
Java 8, 230 Bytes
Hinweis: Es gibt bereits eine viel kürzere Java Antwort, so sicher macht seine upvote ! Ich benutze jedoch einen völlig anderen Ansatz, also dachte ich, dass es sich auch lohnt, ihn zu posten.
Erläuterung:
Probieren Sie es online aus.
quelle
C (gcc) , 142 Bytes
Probieren Sie es online!
quelle
Batch, 174 Bytes
Erläuterung:
%
Variablenverweise werden beim Parsen ersetzt. Dies hat zwei nützliche Vorteile:%d%-=r
subtrahiertr
von der Variablen mit dem Namend
(dh indirekte Referenz)set c=%d%&set d=%c%
ist einfach ein Straight Swap.quelle
PHP 7.1: 159 Bytes
Führen Sie es hier im Browser aus!
PHP 5.6: 156 Bytes
Führen Sie es hier im Browser aus!
So sieht die PHP 5.6-Lösung mit Formatierungen und Kommentaren aus:
quelle
Bash, 178 Bytes
quelle
F #,
238235 BytesIch dachte, es geht mir gut, aber Sie haben mich alle weit übertroffen!
Probieren Sie es online!
Vielen Dank an Rogem für den tollen Rat, A * B> 0 anstelle von A> 0 && B> 0 zu verwenden (nimmt 3 Bytes ab).
Vielen Dank auch an officialaimm, dessen Hinweis auf die Vordefinition von printf in der Python-Antwort mir geholfen hat, auch ein paar Bytes zu sparen.
quelle
A*B>0
Sparen Sie sich ein paar mehr.Haskell , 204 Bytes
Bei meinem Versuch mit Haskell konnte ich es leider nicht wettbewerbsfähiger machen
Probieren Sie es online!
Erklärungen:
quelle
where m=b-x
kann in einer Wache gestellt werden:|m<-b-x=
.main=putStr=<<q"A "10"B "10.randomRs(1,6::Int)<$>getStdGen
. Sie können auch eine Liste verwenden und diese zusammenfassen, um die Neudefinition aufzuheben(++)
. Das Letzte, wo es nicht vorteilhaft zu sein scheint, es einfachb-x
überall zu verwenden.Julia 0,6 , 175 Bytes
Probieren Sie es online!
Lange, ungolfierte Version:
quelle
VBA,
222185179 BytesDiese rekursive Lösung beinhaltet 3 Subs
p ist kürzer als Debug.Print, wenn mehr als 3 Mal verwendet (nur 4 in dieser Lösung)Bearbeiten: Nun, da ich gelernt habe, dass diesDebug.?
eine akzeptable Alternative zu istDebug.Print
,Debug.?x
ist kürzer als das Aufrufen eines Sub zum Drucken.Das war eine lustige Herausforderung. Wenn Sie einen Online-Dolmetscher wie TIO für VB6 / VBScript / VBA kennen, hinterlassen Sie bitte einen Kommentar. Dann kann ich einen Link zu einer funktionierenden Lösung posten.
Wenn Sie diesen Code testen möchten und Microsoft Excel, Word, Access oder Outlook installiert haben (nur Windows), drücken Sie Alt + F11, um die VBA-IDE zu öffnen. Fügen Sie ein neues Codemodul ein (Alt + I, M) und deaktivieren Sie Option Explicit. Fügen Sie dann den Code ein und drücken Sie F5, um ihn auszuführen. Die Ergebnisse sollten im Direktfenster angezeigt werden (drücken Sie Strg + G, wenn Sie es nicht sehen).
Edit 1: Leerzeichen entfernt, das der VBA-Editor automatisch wieder hinzufügt. Reduziert um 37 Byte
Edit 2: Sub p () * entfernt, um 6 Byte nach dem Lernen zu sparen,
Debug.?
ist eine akzeptable Alternative zuDebug.Print
. Das Aufrufen eines Sub zum BehandelnDebug.?
speichert nur Bytes nach mehr als sechs Aufrufen.quelle