Ihr Programm muss eine Reihe von Leerzeichen, gefolgt von einem Punkt und einer neuen Zeile, ausgeben. Die Anzahl der Leerzeichen ist die x-Position Ihres Punktes, definiert mit 0 <x <30
Jede neue Linie ist eine Wende. Ihr Programm läuft 30 Runden. Ihr Programm beginnt mit einer zufälligen x-Position und verschiebt diese Position bei jeder Umdrehung zufällig um 1 nach links oder rechts, während Sie innerhalb des definierten Bereichs bleiben. Bei jeder Runde muss Ihr Punkt seine Position um 1 ändern.
Ihre Punktzahl ist die Anzahl der Zeichen. Sie erhalten 10 Bonuspunkte, wenn jede gedruckte Zeile aus genau 30 Zeichen (und einer neuen Zeile) besteht. Sie erhalten 50 Bonuspunkte, wenn Ihr Programm zufällig dazu neigt, in der Mitte des definierten Bereichs zu bleiben.
Bearbeiten: Die 50 Bonuspunkte sollen Ihren Punkt in die Mitte ziehen. Dies gilt zum Beispiel, wenn Ihr Punkt bei x = 20 liegt und eine Chance von 66% hat, nach links und 33% nach rechts zu gehen. Dies muss vom Startpunkt unabhängig sein und sollte nur durch dynamisches Ändern des Prozentwerts von links / rechts geschehen.
Keine Eingabe jeglicher Art erlaubt, die Ausgabe muss auf der ausführenden Konsole erfolgen!
Zum besseren Verständnis ist hier ein lesbares Beispiel in Java, das eine Punktzahl von 723 ergeben würde:
public class DotJumper{
public static void main(String[] args){
int i = (int)(Math.random()*30);
int max = 29;
int step = 1;
int count = 30;
while(count>0){
if(i<=1){
i+=step;
}else if(i>=max){
i-=step;
}else{
if(Math.random() > 0.5){
i+=step;
}else{
i-=step;
}
}
print(i);
count--;
}
}
public static void print(int i){
while(i>0){
System.out.print(' ');
i--;
}
System.out.println('.');
}
}
int i = (int)(Math.random()*30);
sein sollteint i = 1 + (int)(Math.random()*29);
statt. Wie es ist, erzeugt es eine Zahl0 >= x > 30
anstelle von0 > x > 30
.Antworten:
APL, 39-10-50 = -21
Getestet mit
⎕IO←1
und auf Dyalog⎕ML←3
sollte es aber durchaus tragbar sein.Erläuterung
Bei jedem Schritt entscheidet dieser Code, ob der Punkt nach links oder rechts verschoben wird, abhängig von der Wahrscheinlichkeit, dass eine unter (1,5 2,5 ... 27,5 28,5) ausgewählte Zufallszahl kleiner als die aktuelle Punktposition ist.
Wenn die aktuelle Punktposition (Anzahl der Leerzeichen links) 1 ist, ist das Inkrement immer +1 (alle diese Zahlen 1,5 ... 28,5 sind> 1), wenn es 29 ist, ist es immer -1 (alle diese Zahlen) sind <29); Andernfalls wird es zufällig zwischen +1 und -1 ausgewählt, mit einer Wahrscheinlichkeit, dass es sich um eine lineare Interpolation zwischen diesen Extremen handelt. Der Punkt bewegt sich also immer und mit größerer Wahrscheinlichkeit zur Mitte als zu den Seiten. Wenn es genau in der Mitte ist, hat es eine 50% ige Chance, sich zu beiden Seiten zu bewegen.
Die Verkleinerung (nach rechts) eines replizierten Werts
{...}/a/b
ist nur ein Trick, den ich mir ausgedacht habe, um diea-1
Zeiten einer Funktion zu wiederholen , wobei ich mit dem Wert beginneb
und das Ergebnis jeder Iteration⍵
zum nächsten Argument akkumuliere ( ). Das zweite und nächste Eingabeargument (⍺
) sowie das Endergebnis werden ignoriert. Es stellt sich heraus, dass es viel kürzer ist als ein regulärer rekursiver Aufruf mit Wache.Beispiellauf
quelle
+/2×⍳9
gelesen werden können : lautet "die Summe von: zwei mal: die Naturals bis zu 9" ist es aber in umgekehrter Reihenfolge ausgeführt.⎕←30↑...
druckt 30 Zeichen plus eine neue Zeile, egal in welcher Zeichenfolge...
Mathematica 138-10-50 = 78
Ich poste dies nicht, weil ich denke, dass es besonders gut ist, aber aus anderen Gründen. Es verwendet eine Markov-Prozessdefinition mit einer Übergangsmatrix, mit der der Ball "zentriert" wird.
Die Verwendung eines Markov-Prozesses in Mathematica ermöglicht es uns, einige nützliche Statistiken zu berechnen , wie Sie weiter unten sehen werden.
Zuerst den Code (Leerzeichen werden nicht benötigt):
Einige Ausgaben:
Die von mir verwendete Übergangsmatrix ist:
Aber wie gesagt, der interessante Teil ist,
DiscreteMarkovProcess[]
dass wir mit Hilfe von ein gutes Bild von dem bekommen, was passiert.Sehen wir uns die Wahrscheinlichkeit an, dass der Ball
15
zu einem beliebigen Zeitpunktt
von einem bestimmten zufälligen Zustand ausgeht :Sie können sehen, dass es zwischen 0 und einem Wert in der Nähe von 0,3 schwankt. Das liegt daran, dass Sie je nach Ausgangszustand nur bei einer ungeraden oder geraden Anzahl von Schritten 15 erreichen können :)
Jetzt können wir dasselbe tun, aber Mathematica anweisen, die Statistik ausgehend von allen möglichen Anfangszuständen zu betrachten. Wie groß ist die Wahrscheinlichkeit,
15
nach einer bestimmten Zeit wieder zu seint
?Sie können sehen, dass es auch schwingt ... warum? Die Antwort ist einfach: Im Intervall
[1, 29]
gibt es mehr ungerade als gerade Zahlen :)Die Schwingung ist fast verschwunden, wenn wir nach der Wahrscheinlichkeit fragen, dass der Ball auf
14 OR 15
:Und Sie könnten auch nach der Grenze (im Sinne von Cesaro) der staatlichen Wahrscheinlichkeiten fragen:
Oh, na ja, vielleicht verdiene ich ein paar Ablehnungen für eine solche nicht themenbezogene Antwort. Fühlen Sie sich frei.
quelle
Bash, 21 Punkte (81 Bytes - 50 Bonus - 10 Bonus)
Bei dieser Antwort wird der Punkt in die Mitte "zurückgezogen". Dies kann getestet werden, indem der Startpunkt bei 0 oder 30 fest codiert wird.
quelle
{1..30}
von{P..m}
o
ist1
undRANDOM%30
zurückkehrt0
? Und auch bei der nächsten Iteration?Ruby
696664-60 = 4Stichprobe:
quelle
i=rand 30;
anstelle von speicherni=rand(30);
.Smalltalk,
161159145-60 = 85Alle Spalten sind 30 Zeichen lang (arbeiten in der veränderlichen Zeichenfolge b).
Die zufällige Bewegungschance wird angepasst, indem der rnd-Wert mit p (rnd (0..29) -p) vorgespannt wird, das Vorzeichen (-1/0/1) genommen und dann mit (-1 |) auf (-1 / + 1) angepasst wird 1), der als Verschiebungsdelta verwendet wird (berechnet effektiv: x Vorzeichen <= 0 ifTrue: -1 ifFalse: 1). Da ST 1-basierte Indizierung verwendet, muss ich alle String-Refs um +1 anpassen (bitte schätzen Sie den -1 | 1-Bit-Fiddling-Hack ;-)).
Wenn ich eine Idee aus der Ruby-Version (thanx & Up @fipgr) klaue, kann ich den Min / Max-Check loswerden:
Ausgabe: (Ich habe die Spaltennummern und vertikalen Balken danach manuell hinzugefügt; der obige Code generiert sie nicht)
quelle
C 86
Vorausgesetzt, dass das Seeding der
rand()
Funktion nicht erforderlich ist.Erläuterung:
In C, in
"%*c"
den*
Mitteln , dass die Länge des Ausgangs eine minimale Länge hat, und diese minimale Länge wird durch das Argument der Funktion Aufrufs (in diesem Fall bestimmt wird , ist esi+=i==30?-1:i==1||rand()%2?1:-1
. Diec
Mittel das nächste Argument (46
) ist ein Zeichen ( der Punkt).Was die Grenzkontrolle angeht, ich entschuldige mich, dass ich das vergessen habe. Ich habe dies nun zu der Antwort hinzugefügt, zum Preis von 15 Zeichen. Der ternäre Operator funktioniert wie folgt:
boolean_condition?value_if_true:value_if_false
. Beachten Sie, dass in C wahr 1 und falsch 0 ist.quelle
printf("%*c\n",i+=rand()%2?1:-1,46)
die Leerzeichen gedruckt werden und wie verhindert wird, dass der Punkt möglicherweise über 29 hinausgeht. Vielen Dank im Voraus. (Sorry, ich bin kein C-Programmierer.)rand()%2
dass es sehr vorhersehbar ist (ungerade / gerade Kurven)? Ich habe Ihrerand()%2
in meiner PHP-Lösung ausprobiert und sie zeigte dieses sehr vorhersehbare Verhalten (im Gegensatz zurand(0,1)
. Da PHP C-Bibliotheken sehr häufig verwendet (wenn ich richtig bin), habe ich mich gefragt, ob Ihr C-Programm den gleichen "Fehler" hat. .rand()
Funktion nicht gesetzt. Wird in C ifrand()
nicht explizit gesetzt, wird jedes Mal derselbe Startwert verwendet. Deshalb ist es vorhersehbar. Wenn ich essrand(time());
rand()
muss nicht mehr geimpftsrand()
werden, aber sie zeigen immer noch dieses seltsame Verhalten.Java:
204183182176175 Zeichen - 10 - 50 = 115Erstens muss die
0 < x < 30
Punktposition [1-29] sein. Dies erzeugt eine gleichmäßig verteilte Zahl zwischen 0 und 28 und für die Zwecke dieses Programms hat [0-28] den gleichen Effekt wie [1-29]:Ich persönlich bevorzuge es, wenn es normalerweise um 14 verteilt wäre, aber meine Antwort wäre länger:
Zweitens stellt dieser Code sicher, dass er tendenziell in der Mitte liegt:
Die Wahrscheinlichkeit, +1 zu bekommen, ist größer als der Wert von
i
, und wir haben das Gegenteil für -1. Wenni
0 ist, ist die Wahrscheinlichkeit, +1 zu bekommen, 100% und die Wahrscheinlichkeit, -1 zu bekommen, ist 0%. Wenni
28 ist, wird das Gegenteil passieren.Drittens sehen wir, wenn wir das
32
am Ende durch ersetzen'_'
, um die Ausgabe zu vereinfachen, dass jede Zeile 30 Zeichen plus eine neue Zeile enthält:Vielen Dank an @VadimR (jetzt user2846289) für den Hinweis auf ein Missverständnis in einer früheren Version.
Vielen Dank an @KevinCruijssen für das Aussparen von 6 Zeichen, auch nach mehr als zweieinhalb Jahren, nachdem diese Antwort ursprünglich veröffentlicht wurde.
quelle
i
nach zu kommen0
ist illegal, nicht wahr?i
im Bereich [0-29]. Dies entspricht [1-30] oder [288-317], die Ausgabe wäre dieselbe. Entscheidend ist, dass das Intervall [0-29] 30 Ganzzahlen enthält.i
kann nicht sein0
. Ich verstehe, es geht nur darum, Spaß zu haben, aber es ist trotzdem traurig.i
wird1
zunächst, und auf der ersten IterationMath.random()
ist0
, danni
bekommt0
. Bitte versteh mich nicht falsch, es geht nicht um deine Antwort. Eher wegen meiner Unfähigkeit, die meisten anderen Sprachen als C-like zu lesen. Dann mit keiner Reaktion (außer upvotes) über Fehler, wie kann ich wissen , dass sie richtig sind oder nicht?Mathematica 157-10-50 = 97
Zum Starten wird eine Zufallszahl von 1 bis 30 verwendet. Alle verbleibenden Spaltennummern aus dem Punkt werden über ausgewählt. Dies
RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c
bedeutet: "Wenn die vorherige Spaltennummer größer als 15 war, wählen Sie eine Zahl aus der Menge {-1,1} mit -1, gewichtet mit 2: 1 in Bezug auf 1; andernfalls drehen Sie die Gewichte um und wählen Sie aus demselben Satz.ReplacePart
Ersetzt das Element in einer Liste mit 30 Leerzeichen, die der gewünschten Spalte entsprechen.quelle
RandomChoice[]
> <>, 358-10 = 348
Das wird beim Codegolf nicht gewinnen, aber es funktioniert. (Unter Windows 7 mit diesem Interpreter , der die "p" -Anweisung anders implementiert als die esolang-Seite definiert)
Der Name dieser Sprache kann nicht gegoogelt werden. Hier ist der Esolang-Artikel für Neugierige.
quelle
PHP,
118113112111 (, -10 Bonuspunkte = 101)(Zweiter Versuch, mit schrecklich vorhersehbarem
rand()
Verhalten und etwas mehr Effizienz)Mögliches Ergebnis:
PHP, 130 (, -10 Bonuspunkte = 120)
(erster Versuch)
Dies könnte wahrscheinlich noch viel effizienter sein:
Wenn ich das Leerzeichen durch einen Unterstrich ersetze (für Anzeigezwecke), ist dies ein mögliches Ergebnis:
Merkwürdigerweise wechselt das zufällige Ergebnis beim Ersetzen
rand(0,1)
durchrand()%2
(PHP 5.4 unter Windows XP) bei jeder nächsten Iteration von ungerade zu gerade und umgekehrt, wasrand()
in diesem Sinne auf einmal beunruhigend vorhersehbar macht . Dieser 'Bug' scheint seit 2004 bekannt zu sein . Ich bin mir nicht ganz sicher, ob es genau derselbe "Bug" ist.quelle
J 42 Zeichen - 50 -10 = -18
Erklärung, von rechts beginnend (einige Kenntnisse über Züge sind nützlich):
Mittentendenz, -50, Beispiel über 1000 Läufe:
Beispiellauf, Ausgabe von genau 30 Bytes pro Zeile
quelle
Python 2.7:
126109 -10-50 = 49Den hartcodierten Startpunkt losgeworden - beginnt jetzt an einem zufälligen Punkt. Aus diesem Grund brauchte ich randint und entschied mich, dies anstelle der Auswahl für den Offset zu verwenden. Benutzte dafür den (-1) ** Bool-Trick.
Einige gute Antworten hier. Erster Versuch in Python, über Verbesserungen nachzudenken. Nicht durch die Notwendigkeit eines Imports geholfen.
-10 - ja 30 Zeichen + \ n in jeder Zeile
-50 - je weiter vom Zentrum entfernt, desto wahrscheinlicher ist eine Bewegung in die andere Richtung (durch Erstellen einer Liste mit einer anderen Anzahl von +/- Offsets).
Vorheriger Versuch:
quelle
for
Schleife kann alle auf einer Linie sein, aber noch besser istfor i in[0]*30:
und noch besser isteval"..."*30
.Java -
198183 ZeichenDies ist nur ein schlichtes, einfaches, direktes und unkreatives Golfspiel des Beispiels, das Sie in der Frage angegeben haben.
quelle
Stapel - (288 Bytes - 10) 278
Nicht golfen:
Leerzeichen anstelle von Unterstrichen ausgeben - 372 Bytes -
Wenn Sie Hilfe bei der folgenden Logik suchen, ist dies sicherlich nicht die platzsparendste Methode (! R! Wird auf 1 oder 2 erweitert).
Es golfen bis zu:
if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !r! LSS 30 (set/ap+=1)else set/ap-=1
quelle
J, 42 Zeichen, keine Boni
Beispiellauf:
quelle
Python 2.7 (126 - 10 (feste Länge) - 50 (Mitteltendenz) = 66)
Das folgende Programm hat eine mittlere Tendenz gegenüber einer größeren Stichprobe
Demo
quelle
Javascript
125737260 (120 - 50 - 10)BEARBEITEN: Fix für 50-Punkte-Bonus und 10-Punkte-Bonus.
EDIT 2: Noch kürzer!
quelle
r=Math.random;s=r()*30|0;for(i=0;i++<30;a=Array(30)){a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}
for
Arbeitsmodus versetzt werden. musste ein do während verwenden.D -
167,162144 (154-10)Golf gespielt :
Nicht golfen :
BEARBEITEN 1 - Ich bin nicht ganz sicher, ob sich mein Code für den -50 Bonus qualifiziert oder nicht.
i
Beginnt nicht immer in der Mitte, aber während derfor
Schleife bewegt sich der Punkt nie mehr als 3 Stellen in beide Richtungen. Wenni
also in der Mitte begonnen wird, bleibt das Ganze ebenfalls dort.BEARBEITEN 2 - Code ist jetzt für den Bonus -10 qualifiziert, da ein Array von 29 Zeichen gefolgt von LF ausgegeben wird, was genau 30 Zeichen pro Zeile ergibt.
quelle
PowerShell, 77 - 10 - 50 = 17
Ausgabe
quelle
$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}
. 66 Bytes - 10 - 50 = 6 PunkteR, 107 Zeichen - 60 Bonuspunkte = 47
i
ist der Index des Punktes.a
ist die Anordnung von 30 Räumen. Der Startpunkt ist zufällig (gleichmäßig von 1 bis 29). Bei jeder Iteration addieren wir zufällig -1 oder +1 zui
mit gewichteten Wahrscheinlichkeiten:i-1
for-1
und29-i
for+1
(Werte, die als Wahrscheinlichkeiten eingegeben werden, müssen nicht zu eins summiert werden), was bedeutet, dass der Punkt tendenziell zur Mitte hin ausgerichtet wird, ohne dass er von unten kommt 1 oder höher 29 (da ihre Wahrscheinlichkeit in beiden Fällen auf 0 fällt).Beispiellauf mit
_
statt Leerzeichen zur besseren Lesbarkeit:quelle
i
kann entweder0
oder30
nein werden?s(1:29,1)
mits(29,1)
.C # 184-10-50 = 123
Ausgabe
spacemit Fassung _für die Lesbarkeit.
quelle
if...else if...else
am Ende Ihres Codes zu erhalten. Außerdem lässt mich Ihre Ausgabe zweifeln, dass sie tendenziell in der Mitte liegt, aber Ihr Code scheint zu stimmen.r.Next(30)<p?-1:1;
macht es möglich. Ich bin mir nicht sicher, ob Sie mit denif
Anweisungen kleiner werden können .switch
ist groß, weil das obligatorischebreak
/return
und das Finaleelse
einendefault:{}
Fall erfordert und das auch lang ist.p
Null ist,p+=r.Next(30)<p?-1:1;
erhält der immer 1, so dass keine Notwendigkeit für dieif(p==0)
. Das Gleiche gilt fürp==29
.p
wird niemals 30 sein, also kannst du das loswerdenelse if
.PHP
Mit dem Zentrierbonus: 82 - 50 = 32
Entfernen Sie für diese Version (ältere Versionen unten) die Min / Max-Prüfung, die im Zentrierungscode berücksichtigt wird.
rand(1,28)
wird hier wichtig, da es dem erlaubt$i++
, sich auf 29 zu schieben (aktuelles Maximum).Bearbeiten: unnötige Klammern, verschobener Umschaltcode
Einfacher Algorithmus zum Zentrieren: Erzeugt eine neue Zahl zwischen 0 und 29 und vergleicht sie mit der aktuellen. Nutzt die "Wahrscheinlichkeit", dass eine Zahl auf der größeren Seite zur Mitte hin gezogen wird.
Tatsächliches Ergebnis: (Zeilennummerierung nachträglich hinzugefügt)
Archiviert:
$i=rand(0,29);for($c=0;$c++<30;){($i<1?$j=1:($i>28?$j=28:$j=rand(0,29)));($j<$i?$i--:$i++);echo pack("A$i",'').".\n";}
119 Zeichen$i=rand(0,29);for($c=0;$c++<30;){($i<1?$i++:($i>28?$i--:(rand(0,29)<$i?$i--:$i++)));echo pack("A$i",'').".\n";}
112 Zeichenquelle
JavaScript ES6 125 - 10 (30 Zeichenzeilen) - 50 (Verschiebung in Richtung Mitte) = 65
Ich hatte eine Erleuchtung, die den Aufzug zu meiner Einheit hinaufging, also musste ich sie runterholen, bevor sie mein Gedächtnis verließ ...
Ein wenig variables Positionsmischen und ein wenig Kreativität bei der Berechnung der Verschiebungswahrscheinlichkeit von
x/t
... (Vielen Dank, Kostronor, für den Hinweis!) Ich erhalte jetzt den Bonus von -50 für die Verschiebung in die Mitte und habe auch die Startposition innerhalb von erreicht voller Bereich der Linie, die mir erlaubte, zwei Bytes zu rasieren!quelle
15+r()*2
der zwischen 15 und 16.9999999998 liegen kann off to 17. das zusätzlichex+=r()<.5?-1:1
wirft ein wenig mehr Zufälligkeit, indem es auf einen Bereich von 14 bis 18 gebracht wird, also technisch gesehen eine Zufallszahl, die innerhalb der Definition dessen liegt, was gefragt wurde. -1) wird es in den meisten Fällen wieder in die Mitte bringen ...;)k, 53-10-50 = -7
Lösung 1
Verwendung
Lösung 2
quelle
Scala, 95-10 = 85 Bytes
Ich denke immer noch über den 50-Byte-Bonus nach.
Erläuterung:
quelle
Javascript, 125 (135 - 10)
Kommentare und Ratschläge sind willkommen.
quelle
JavaScript
114 Zeichen - 10 (30 Zeichen) - 50 (Punkt in die Mitte ziehen) = 54
Mir ist jedoch aufgefallen, dass eine Belohnung von 10 Zeichen für das Ausfüllen der Zeilen auf 30 Zeichen ein schlechter Deal sein kann. so:
102 Zeichen - 50 (Punkt zur Mitte ziehen) = 52
Ein großes Lob an @WallyWest für die vereinfachte Zugrichtungsbedingung
f()>k/29?1:-1
, mein erster Entwurf verwendete zwei verschachtelte Bedingungen.quelle
Racket 227 Bytes (-10 für 30 Zeichen, -50 für Verschiebung zur Mittellinie = 167)
Bei jedem Schritt bewegt sich der Punkt mit doppelter Wahrscheinlichkeit zur Mittellinie als von dieser weg:
Ungolfed:
Testen:
Ausgabe:
quelle