Votre programme doit imprimer un certain nombre d'espaces, suivis d'un point et d'une nouvelle ligne. Le nombre d'espaces est la position x de votre point définie avec 0 <x <30
Chaque nouvelle ligne est un tour. Votre programme dure 30 tours. Votre programme commence avec une position x aléatoire et chaque tour décale cette position de façon aléatoire de 1 vers la gauche ou la droite, tout en restant dans la zone définie. Chaque tour, votre point doit changer sa position de 1.
Votre score est le nombre de caractères. Vous obtenez 10 points bonus, si chaque ligne imprimée se compose exactement de 30 caractères (et de nouvelle ligne). Vous obtenez 50 points bonus si, tout en étant aléatoire, votre programme a tendance à rester au milieu de la zone définie.
Edit: Les 50 points bonus sont destinés à tirer votre point au milieu. Par exemple, cela s'applique si votre point est à x = 20 et a une chance de 66% d'aller à gauche et de 33% à droite. Cela doit être indépendant du point de départ et ne doit se produire qu'en modifiant dynamiquement la valeur en pourcentage de gauche / droite.
Aucune entrée d'aucune sorte autorisée, la sortie doit se faire sur la console d'exécution!
Pour une meilleure compréhension, voici un exemple lisible en java, qui vous donnerait un score de 723:
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);
devrait être à laint i = 1 + (int)(Math.random()*29);
place. En l'état, il génère un nombre0 >= x > 30
au lieu de0 > x > 30
.Réponses:
APL, 39 - 10 - 50 = –21
Testé sur Dyalog avec
⎕IO←1
et⎕ML←3
mais il devrait être assez portable.Explication
À chaque étape, ce code décide de déplacer le point vers la gauche ou vers la droite en fonction de la probabilité qu'un nombre aléatoire choisi parmi (1,5 2,5 ... 27,5 28,5) soit inférieur à la position actuelle du point.
Par conséquent, lorsque la position actuelle du point (nombre d'espaces à gauche) est 1, l'incrément est toujours +1 (tous ces nombres 1,5 ... 28,5 sont> 1), quand c'est 29, c'est toujours -1 (tous ces nombres sont <29); sinon, il est choisi au hasard entre +1 et -1, avec une probabilité qui est une interpolation linéaire entre ces extrêmes. Ainsi, le point est toujours en mouvement et toujours plus susceptible de se déplacer vers le centre que vers les côtés. S'il est exactement au milieu, il a 50% de chances de se déplacer de chaque côté.
La réduction (à droite) d'une valeur répliquée
{...}/a/b
n'est qu'une astuce que j'ai trouvée pour répéter une fonctiona-1
fois, en commençant par la valeurb
et en faisant du résultat de chaque itération l'⍵
argument accumulator ( ) au suivant. Les deuxième et suivant arguments d'entrée (⍺
) ainsi que le résultat final sont ignorés. Il s'avère être beaucoup plus court qu'un appel récursif régulier avec garde.Exemple d'exécution
la source
+/2×⍳9
se lit "la somme de: deux fois: les naturels jusqu'à 9" mais est exécuté de la manière opposée.⎕←30↑...
imprimera 30 caractères plus une nouvelle ligne, quelle que soit la chaîne...
Mathematica 138 - 10 - 50 = 78
Je ne poste pas cela parce que je pense que c'est particulièrement bien joué, mais pour d'autres raisons. Il utilise une définition du processus de Markov avec une matrice de transition conçue pour obtenir la balle «centrée».
L'utilisation d'un processus de Markov dans Mathematica nous permet de calculer des statistiques utiles , comme vous le verrez ci-dessous.
D'abord le code (espaces non nécessaires):
Quelques sorties:
La matrice de transition que j'ai utilisée est:
Mais comme je l'ai dit, la partie intéressante est que l'utilisation
DiscreteMarkovProcess[]
nous permet de saisir une bonne image de ce qui se passe.Voyons la probabilité que la balle soit
15
à tout moment àt
partir d'un état aléatoire particulier :Vous pouvez voir qu'il oscille entre 0 et une valeur proche de 0,3, car en fonction de l'état de départ, vous ne pouvez atteindre que 15 sur un nombre impair ou pair de pas :)
Maintenant, nous pouvons faire la même chose, mais en disant à Mathematica de considérer la statistique à partir de tous les états initiaux possibles. Quelle est la probabilité d'être
15
après un certain tempst
?:Vous pouvez voir qu'il oscille aussi ... pourquoi? La réponse est simple: dans l'intervalle
[1, 29]
il y a plus de nombres impairs que de nombres pairs :)L'oscillation a presque disparu si nous demandons la probabilité que la balle soit à
14 OR 15
:Et vous pourriez aussi demander la limite (au sens Cesaro) des probabilités d'état:
Oh, eh bien, peut-être que je mérite des downvotes pour une telle réponse hors sujet. N'hésitez pas.
la source
Bash, marque 21 (81 octets - 50 bonus - 10 bonus)
Dans cette réponse, le point est "tiré" vers le milieu. Cela peut être testé en codant en dur le point de départ à 0 ou 30.
la source
{1..30}
par{P..m}
o
est1
etRANDOM%30
revient0
? Et à la prochaine itération aussi?Rubis
696664-60 = 4Échantillon:
la source
i=rand 30;
au lieu dei=rand(30);
.Smalltalk,
161159145-60 = 85toutes les colonnes ont une longueur de 30 caractères (fonctionnant dans la chaîne mutable b);
la chance de mouvement aléatoire est ajustée en biaisant la valeur rnd avec p (rnd (0..29) -p), en prenant le signe (-1/0/1) puis en ajustant à (-1 / + 1) via (-1 | 1), qui est considéré comme un delta de déplacement (calcule effectivement: signe x <= 0 ifTrue: -1 ifFalse: 1). Comme ST utilise une indexation basée sur 1, je dois ajuster toutes les références de chaîne de +1 (plz apprécie le hack de violon -1 | 1 bit ;-)).
voler une idée de la version Ruby (thanx & Up @fipgr), je peux me débarrasser du contrôle min / max:
sortie: (J'ai ajouté manuellement les numéros de col et les barres verticales par la suite; le code ci-dessus ne les génère pas)
la source
C, 86
En supposant que l'amorçage de la
rand()
fonction n'est pas requis.Explication:
En C, dans
"%*c"
le*
sens où la longueur de la sortie aura une longueur minimale, et cette longueur minimale est déterminée par l'argument de l'appel de fonction (dans ce cas, elle l'esti+=i==30?-1:i==1||rand()%2?1:-1
. Lac
signifie que l'argument suivant (46
) est un caractère ( le point).En ce qui concerne la vérification des limites, je m'excuse d'avoir oublié cela. J'ai maintenant ajouté ceci à la réponse, au prix de 15 caractères. L'opérateur ternaire fonctionne comme suit:
boolean_condition?value_if_true:value_if_false
. Notez qu'en C, true est 1 et false est 0.la source
printf("%*c\n",i+=rand()%2?1:-1,46)
imprime les espaces, ainsi que comment il empêche le point de se déplacer au-delà de 29. Merci à l'avance. (Désolé, je ne suis pas un programmeur C.)rand()%2
en ce sens qu'il est très prévisible (tours impairs / pairs)? J'ai essayé votrerand()%2
dans ma solution PHP, et elle présentait ce comportement très prévisible (par opposition àrand(0,1)
. Étant donné que PHP utilise beaucoup les bibliothèques C (si je me trompe), je me demandais si votre programme C avait le même «défaut» .rand()
fonction. En C, si ellerand()
n'est pas définie explicitement, elle utilise toujours la même valeur initiale à chaque fois. C'est pourquoi c'est prévisible. Si je devais le semer, je peux le faire,srand(time());
ce qui coûte 14 caractèresrand()
n'ont plus besoin d'êtresrand()
complétées, mais montrent toujours ce comportement étrange .Java:
204183182176175 caractères - 10 - 50 = 115Tout d'abord, la position du point doit être
0 < x < 30
, c'est-à-dire [1-29]. Cela génère un nombre compris entre 0 et 28 uniformément distribué, et pour les besoins de ce programme, [0-28] a le même effet que [1-29]:Personnellement, j'ai préféré qu'il soit normalement distribué vers 14 heures, mais ma réponse serait plus longue:
Deuxièmement, ce code garantit qu'il a tendance à être au milieu:
La probabilité d'obtenir +1 est plus grande car plus petite est la valeur de
i
, et nous avons l'inverse pour -1. Sii
est 0, la probabilité d'obtenir +1 est de 100% et la probabilité d'obtenir -1 est de 0%. Sii
c'est 28, le contraire se produira.Troisièmement, en remplaçant le
32
à la fin par'_'
pour voir la sortie plus facilement, nous voyons que chaque ligne a 30 caractères plus une nouvelle ligne:Merci à @VadimR (maintenant, user2846289) d'avoir signalé un malentendu dans une version précédente.
Merci à @KevinCruijssen d'avoir rasé 6 caractères, même après plus de deux ans et demi après la publication initiale de cette réponse.
la source
i
aller0
est illégal, non?i
est dans la plage [0-29]. C'est équivalent à [1-30] ou [288-317], la sortie serait la même. Ce qui importe, c'est qu'il y a 30 nombres entiers dans l'intervalle [0-29].i
ne peut pas être0
. Je comprends qu'il s'agit de s'amuser mais c'est quand même triste.i
obtient un1
premier temps , et à la première itérationMath.random()
est0
, puisi
obtient0
. S'il vous plaît, ne vous méprenez pas, ce n'est pas votre réponse. Plutôt de mon incapacité à lire la plupart des langues autres que le C-like. Puis, sans réaction (sauf pour les votes positifs) sur les erreurs, comment puis-je savoir qu'elles ont raison ou non?Mathematica 157-10-50 = 97
Un nombre aléatoire de 1 à 30 est utilisé pour commencer. Tous les numéros de colonne restants du point sont choisis via
RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c
, ce qui se traduit par: "Si le numéro de colonne précédent était supérieur à 15, sélectionnez un numéro dans l'ensemble {-1,1}, avec -1 pondéré 2: 1 par rapport à 1; sinon, retournez les poids et choisissez dans le même ensemble.ReplacePart
remplace l'élément dans une liste de 30 espaces vides qui correspond à la colonne d'intérêt.la source
RandomChoice[]
> <>, 358 - 10 = 348
Cela ne gagnera pas chez codegolf, mais ça marche. (Sous Windows 7 avec cet interpréteur , qui implémente l'instruction "p" différemment de la définition de la page esolang)
Le nom de cette langue ne peut pas être googlé, alors voici son article esolang pour les curieux.
la source
PHP,
118113112111 (, 10 points de bonus = 101)(deuxième essai, avec un
rand()
comportement horriblement prévisible et un peu plus d'efficacité)Résultat possible:
PHP, 130 (, -10 points bonus = 120)
(premier essai)
Cela pourrait probablement être encore plus efficace:
Si je remplace l'espace par un trait de soulignement (à des fins d'affichage), ceci est un résultat possible:
Curieusement, si je remplace
rand(0,1)
parrand()%2
(PHP 5.4, sous Windows XP), le résultat aléatoire passe toujours de impair à pair, et vice versa, à chaque prochaine itération, ce qui rend tout à couprand()
prévisible, dans ce sens, tout à coup. Ce «bug» semble être connu depuis 2004 . Je ne sais pas vraiment si c'est exactement le même «bug».la source
J 42 caractères - 50-10 = -18
Explication, en partant de la droite (certaines connaissances sur les trains sont utiles):
Tendance centrale, -50, exemple sur 1000 pistes:
Exemple exécuté, produisant exactement 30 octets par ligne
la source
Python 2.7:
126109 -10-50 = 49Débarrassé du point de départ codé en dur - commence maintenant au point aléatoire. Pour cette raison, j'avais besoin de Randint, j'ai donc décidé de l'utiliser au lieu de choisir pour le décalage. J'ai utilisé le truc (-1) ** bool pour cela.
Quelques bonnes réponses ici. Première tentative en Python, en pensant à des améliorations. Pas aidé par la nécessité d'une importation.
-10 - oui 30 caractères + \ n sur chaque ligne
-50 - plus on s'éloigne du centre, plus il y a de chances que l'on bouge dans l'autre sens (accompli en construisant une liste avec un nombre différent de décalages + / i)
Tentative précédente:
la source
for
boucle peut être sur une seule ligne, mais c'est encore mieuxfor i in[0]*30:
et c'est encore mieuxeval"..."*30
.Java -
198183 caractèresC'est juste un golf simple, simple, direct et non créatif de l'exemple que vous avez donné dans la question.
la source
Lot - (288 octets - 10) 278
Non golfé:
Pour afficher des espaces au lieu de traits de soulignement - 372 octets -
Vous cherchez de l'aide avec la logique suivante, ce n'est sûrement pas la méthode la plus économe en espace (! R! Passera à 1 ou 2) -
Il joue sur:
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
la source
J, 42 caractères, pas de bonus
Exemple d'exécution:
la source
Python 2.7 (126-10 (longueur fixe) - 50 (tendance centrale) = 66)
Les programmes suivants ont une tendance centrale par rapport à un échantillon plus large
Démo
la source
Javascript
125737260 (120 - 50 - 10)EDIT: correction du bonus de 50 points et du bonus de 10 points.
EDIT 2: Encore plus court!
la source
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
Cependant, n'a pas pu obtenir l'init du tableau dans le travail; a dû utiliser un do pendant un certain temps.RÉ -
167,162, 144 (154 - 10)Golfé :
Non golfé :
EDIT 1 - Je ne sais pas trop si mon code est admissible au bonus -50 ou non.
i
ne pas toujours commencer au milieu, mais au cours de lafor
boucle, le point ne se déplace plus comme 3 endroits ou l' autre direction, alors quandi
ne commence près du milieu, la chose a tendance à rester là - bas aussi.EDIT 2 - Le code se qualifie désormais pour le bonus -10, car il imprime un tableau de 29 caractères suivi de LF pour un total d'exactement 30 caractères par ligne.
la source
PowerShell, 77 - 10 - 50 = 17
Production
la source
$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}
. 66 octets - 10 - 50 = 6 points de scoreR, 107 caractères - 60 points bonus = 47
i
est l'indice du point.a
est le tableau de 30 espaces. Le point de départ est aléatoire (uniformément de 1 à 29). À chaque itération, nous ajoutons aléatoirement -1 ou +1 ài
avec des probabilités pondérées:i-1
pour-1
et29-i
pour+1
(les valeurs alimentées en probabilités n'ont pas besoin de résumer à un), ce qui signifie qu'il a tendance à orienter le point vers le centre tout en l'empêchant d'en dessous 1 ou supérieur à 29 (puisque leur probabilité tombe à 0 dans les deux cas).Exemple exécuté avec
_
au lieu d'espaces pour la lisibilité:la source
i
peut devenir soit0
ou30
, non?s(1:29,1)
pars(29,1)
.C # 184 - 10 - 50 = 123
Production
spaceremplacé par _pour plus de lisibilité.
la source
if...else if...else
à la fin de votre code. De plus, votre sortie me fait douter qu'il a tendance à être au milieu, mais votre code semble être correct.r.Next(30)<p?-1:1;
rend cela possible. Je ne suis pas sûr que vous puissiez aller plus petit avec lesif
déclarations.switch
est grand à cause du obligatoirebreak
/return
et la finaleelse
nécessite undefault:{}
étui et c'est aussi long.p
est nul, lep+=r.Next(30)<p?-1:1;
aura toujours 1, donc pas besoin deif(p==0)
. Idem pourp==29
.p
ne sera jamais 30, vous pouvez donc vous débarrasser de laelse if
.PHP
Avec le bonus de centrage: 82 - 50 = 32
Pour cette version (anciennes versions ci-dessous), suppression de la vérification min / max comme cela est pris en charge dans le code de centrage.
rand(1,28)
devient important ici car il permet$i++
au Pousser jusqu'à 29 (max réel).modifier: parenthèses inutiles, code de décalage déplacé
Algorithme simple de centrage: génère un nouveau nombre compris entre 0 et 29 et le compare à l'actuel. Profite de la "probabilité" d'obtenir un nombre plus grand pour se rapprocher du centre.
Résultat réel: (numérotation des lignes ajoutée par la suite)
Archivé:
$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 caractères$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 caractèresla source
JavaScript ES6 125 - 10 (30 lignes de caractères) - 50 (se déplace vers le milieu) = 65
J'ai eu une révélation en montant l'ascenseur jusqu'à mon unité, j'ai donc dû le descendre avant qu'il ne quitte ma mémoire ...
Un petit changement de position variable et un peu de créativité pour calculer la probabilité de changement indiquée par
x/t
... gamme complète de la ligne, ce qui m'a permis de raser deux octets!la source
15+r()*2
ce qui pourrait être n'importe quoi de 15 à 16.9999999998 ou ainsi qui pourrait arrondir off to 17. l'additionx+=r()<.5?-1:1
jette un peu plus de hasard en le portant à une plage de 14 à 18, donc techniquement un nombre aléatoire qui est dans la définition de ce qui a été demandé ... En pliant cette règle, le flip (+1, -1) le ramènera dans la plupart des cas vers le milieu ...;)k, 53 - 10 - 50 = -7
Solution 1
Usage
Solution 2
la source
Scala, 95-10 = 85 octets
Je pense toujours au bonus de 50 octets.
Explication:
la source
Javascript, 125 (135-10)
Vos commentaires et conseils sont les bienvenus.
la source
Javascript
114 caractères - 10 (30 lignes de caractères) - 50 (tirez le point vers le milieu) = 54
Cependant, j'ai remarqué qu'une récompense de 10 caractères pour avoir rempli les lignes jusqu'à 30 caractères peut être une mauvaise affaire; donc:
102 caractères - 50 (tirez le point vers le milieu) = 52
Félicitations à @WallyWest pour la direction de traction simplifiée conditionnelle
f()>k/29?1:-1
, mon premier projet a utilisé deux conditions imbriquées.la source
Raquette 227 octets (-10 pour 30 caractères, -50 pour passer à la ligne médiane = 167)
À chaque étape, le point est deux fois plus susceptible de se déplacer vers la ligne médiane que de s'éloigner de lui:
Non golfé:
Essai:
Production:
la source