10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10 en PHP (ou autre chose d'ailleurs)

23

Je viens d'avoir une conversation «animée» avec un collègue sur la brièveté de la déclaration BASIC suivante:

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

C'est le titre de ce livre , et imprimera simplement une séquence de caractères /et \, alternant entre les deux au hasard, résultant en un motif similaire à ceci:

entrez la description de l'image ici

(Image empruntée à http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Étant d'une propension PHP, nous nous sommes demandés quelle serait la manière la plus compacte d'écrire la même chose en PHP, et nous avons trouvé ceci:

while(1) { echo chr(47 + 45 * rand(0,1)); }

chr(47)est un /caractère, et chr (92) est un \. La déclaration echo chr(47 + 45 * rand(0,1));alternera donc au hasard entre les deux, ad nauseum.

Dans la langue de votre choix, écrivez le programme ou la fonction la plus courte pour produire une séquence aléatoire infinie de caractères \et /, où chaque caractère a une probabilité égale d'être choisi.

Judy
la source
1
Vous pouvez perdre les {}accolades, mais c'est aussi concis que possible.
Michael
C'est cool. Quelle police peut-on utiliser pour obtenir une image similaire?
daniero
1
Cette (image) me rappelle le premier "programme" que j'ai jamais écrit sur mon commodore 64 tout droit sorti du manuel :) ah happy days
Dale
@daniero Je pense que la police de caractères réelle s'appelle Terminal, mais je l'ai trouvée en ligne sous le nom "Invite de commandes Windows" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford
Quelle étrange coïncidence que ce repo Code Golf sur Github se trouve avoir exactement le même défi ... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Réponses:

9

L' gotoopérateur a été ajouté à PHP à partir de la version 5.3.0 afin que vous puissiez utiliser la même méthode que vous utiliseriez dans BASIC:

a: echo chr(47 + 45 * rand(0,1)); goto a;
MichaelRushton
la source
18

Depuis que cela a été migré vers codegolf ...

PHP 30 octets

<?for(;;)echo rand(0,1)?~Ð:~£;

Le Ðcaractère est 208 et le £caractère 163.

Exemple d'utilisation (sur une boîte Windows):

color 18 & php maze.php

Produit quelque chose de similaire à:

Cela fonctionne mieux avec une police monospace qui est exactement carrée (ici j'ai choisi la police système standard 8x8). Pour revenir à votre couleur par défaut, vous pouvez taper à colornouveau sans aucun paramètre.

primo
la source
Peut enregistrer un octet supplémentaire avec rand()%2(personne n'a indiqué à quel point il devait être pseudo-aléatoire) - Ne fonctionne pas non plus sur les terminaux Unicode (comme OSX)
Leigh
@Leigh En raison de sa mise en œuvre, rand()%2alternera entre zéro et un. mt_rand()%2fonctionnerait, cependant.
primo
15

Mathematica 157 octets

Faute de PETSCII, j'ai roulé mes propres "\" et "/".

Pas de cigare pour être bref ici.

Graphics[{Thickness[.005],RGBColor[0.73,0.55,1.],Line/@Flatten[Table[RandomChoice[{{{x,y},{x+1,y+1}},{{x+1,y},{x,y+1}}}],{x,40},{y,25}],1]},Background->Blue]

labyrinthe bleu

DavidC
la source
Cette image fait l'illusion d'optique du point gris !!
Magic Octopus Urn
8

Brainfuck - 534

>+[->>>>>>[<<<<<<+>>>>>>-]>[<<<<<<+>>>>>>-]<<<<+++++++[<+++++++++++>-]
<[<<[>>>>>>+<<<+<<<-]>>>[<<<+>>>-]<<[>>>>>+<<<+>+<<<-]>>>[<<<+>>>-]<[>
>>>+[<<<+>+>>-]<<[>>+<<-]+<[>-<[-]]>[>+<-]<<-]<-]++++++[>++++++++<-]>-
[<<[>>>>>+<<<<+<-]>[<+>-]>-]<<<[-]>[-]+++++[<+++++>-]<[>>>>>>>+[<<<<<<
+>+>>>>>-]<<<<<[>>>>>+<<<<<-]+<[>-<[-]]>[>>>>+<<<<-]<<-]++++++[>>>>>>+
++++++++<<<<<<-]>>>>>>[<<<<<<<+>+>>>>>>-]<<<<<<[>>>>>>+<<<<<<-]++<[->-
[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[-]<[<<+>+>-]<<[>>+<<-]+>>[-]<[++++[>+
+++<---]>.[-]<<->]<[[>+<+++++]>----.[-]<]>+]

Mon prng (d' ici ) est à la fois grand et extrêmement lent. Peut-être qu'un LFSR plus simple ou similaire suffirait, mais cela fonctionne:

entrez la description de l'image ici

captncraig
la source
Je pense que ce n'est pas aléatoire, cependant, car c'est du cerveau.
Erik the Outgolfer
la plupart d'entre eux reposent sur des prngs intégrés. Oui, cela produira la même chose à chaque fois. Cela pourrait permettre qu'il soit semé à partir du clavier au prix de quelques caractères supplémentaires, mais ce n'est pas vraiment le point ici, je pense.
captncraig
5

C, 39 caractères (38 sur MSVC)

main(){while(putchar(rand()%2?47:92));}

entrez la description de l'image ici Voyez-le courir.

Sur MSVC, nous pouvons remplacer putchar()avec _putch()et enregistrer un octet, mais il ne fonctionne pas dans IDEOne.

main(){while(_putch(rand()%2?47:92));}
JoeFish
la source
5

Lisp commun, 33

(loop(princ(elt"/\\"(random 2))))
coredump
la source
3

printa une valeur de retour de 1, donc si vous utilisez cela, vous pouvez simplement envelopper l'expression entière dans while:

while(print chr(47 + 45 * rand(0,1));

Vous pouvez probablement le jouer plus loin.

histocrate
la source
3

rubis, 27 23 caractères

loop{$><<"/\\"[rand 2]}

$><< est 'print to stdout'.

steenslag
la source
2
Vous devriez pouvoir remplacer "/\\"par '\/'. Ruby 1.8 nécessite [rand(2),1]de produire le caractère au lieu du code ascii.
primo
3

C ++, 45 caractères

int main(){for(;;)cout<<(rand()%2?"/":"\\");}

Je ne vais pas gagner de prix pour la brièveté, mais j'avais déjà écrit cela quand j'ai entendu parler du livre mentionné, alors je l'ai juste joué au golf.

L'astuce putchar fonctionne également en C ++, vous ramenant à 43, mais vous ne pouvez pas éviter de déclarer le type de retour sur main.

Brandorf
la source
3

j'essaye de créer en utilisant le style css, et ça marche

<style>
  body {
    font-family: monospace;
    line-height:75%;
    letter-spacing:-3px;
  }
</style>

ce code php:

<?php
  $i=10000;
  while($i) {
    if($i%200 == 0) echo '<br/>';
    echo chr(47 + 45 * rand(0,1));
    $i--;
  }
?>
Hendra
la source
Je voudrais suggérer un autre style: L' font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;utilisation -0.25emde l'espacement des lettres semble correspondre mieux que -3px, ce qui a des artefacts en raison d'une inexactitude ptde pxconversion.
primo
3

Lisp commun - 68

(defun s(l)(elt l(random(length l))))(loop do(format t"~a"(s"/\\")))
Matthew Rolph
la source
La boucle permet à la fois une syntaxe complexe et simple, la simple étant comme un progn, mais bouclant pour toujours. Vous pouvez supprimer le do.
coredump
3

05AB1E , 7 octets

["/\"Ω?

Essayez-le en ligne!

["/\"Ω?  - Full program
[          Start an infinite loop
 "/\"      ... Push the string "/\" on the stack
     Ω     ... Pick a character from the top of the stack, at random
      ?    ... Print without a newline
scottinet
la source
3

Befunge-98 (PyFunge) , 7 octets

? '/,\'

Essayez-le en ligne!

le ?envoie l'IP à gauche ou à droite, donc soit /ou \est poussé avant d'imprimer avec ,. Lors de l'exécution de '/ou \'dans le mauvais ordre après l'impression, il fait juste des choses dans la pile (divise ou échange), puis pousse un caractère non pertinent avant de répéter.

MildlyMilquetoast
la source
Je proposais simplement une solution Befunge-98 de 7 octets différente sur la réponse de Jo King. Mais cette approche semble plus nette.
James Holderness
3

Befunge, 12 9 8 7 octets

Edit: James Holderness a trouvé une solution folle qui utilise trois citations à la place.

?\","/"

Déborde la pile avec beaucoup de caractères en excès pour chaque symbole, mais peu importe quand vous pouvez jouer au golf sur cet octet?

Ancienne version

"/\"?>,#

(Notez l'espace de fin) L' espace de fin n'est apparemment pas nécessaire (merci Mistah Figgins)

Essayez-le en ligne

"/\" Adds both / and \ to the stack
    ? Chooses a random direction to go in. Both up and down loop back around to the ? so it's 50% chance to go in either direction.
Going left
"/\"  >,#  Adds \ and / to the stack but only print the second, the / before heading back
Going right
      >,# Prints the top of the stack, the \ before heading back

Cela commence à remplir la pile, avec un symbole supplémentaire pour chaque symbole imprimé.

Jo King
la source
1
on dirait que vous pouvez vous débarrasser de l'espace supplémentaire, comme #c'est à la fin d'une ligne. Ce n'est pas un comportement cohérent, mais l'interpréteur que vous utilisez le permet: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast
Je me demande également si vous ne pouvez en utiliser qu'un seul ", mais mes tentatives ont été vaines. Parce que vous avez besoin /d'un côté ", vous devrez diviser la moitié du temps.
MildlyMilquetoast
@MistahFiggins Space ne devrait certainement pas être requis pour une implémentation standard de Befunge-93. Le code peut échouer dans certains interpréteurs Funge-98, où la spécification est plus ambiguë, mais l'ajout d'un espace n'aiderait pas dans ces cas de toute façon - vous auriez besoin d'un <après #pour le faire fonctionner.
James Holderness
@MistahFiggins En ce qui concerne l'élimination de l'une des citations, vous pouvez en quelque sorte le faire dans Befunge-98 en utilisant à la 'place. Essayez-le en ligne!
James Holderness
2
@JoKing Je viens de réaliser que vous pouvez réellement faire mieux avec trois citations! ?\","/"Seul inconvénient, cela débordera la pile beaucoup plus rapidement, je pense.
James Holderness
2

Pas beaucoup mieux. Nécessite php 5.5+ pour la fonction de déréférencement de la baie.

while(1) { echo ['/', '\\'][rand(0, 1)]; }

la source
Je n'ai même jamais pensé à ça, merci!
Judy
1
En fait , prend en charge PHP pour les chaînes indices: while(1)echo'/\\'[rand(0,1)];.
manatwork
2

Python, 68

Dans la catégorie "mon langage est nul", nous avons Python!

import random,sys
while 1:sys.stdout.write(random.choice('/\\'))

Merci à Ivo pour quelques caractères sur les importations et choice.

boothby
la source
Eh bien, vous n'enregistrez rien avec 'from sys import *' - si vous écrivez à la place 'import sys, random' et utilisez sys.stdout et random.random, vous économiserez 5 octets.
Ivo
Python3: importation aléatoire tandis que 1: print (random.choice ('/ \\'), end = '')
Ivo
@Vo, merci, j'ai oublié le choix! Vous pouvez cependant garder py3. ;)
stand le
Si vous inversez votre chaîne, vous n'avez pas à échapper à la barre oblique inverse, économisant ainsi un octet.
Jonathan Frech
2

> <> , 14 octets

J'espérais pouvoir le limiter à un carré 3 * 3, mais je n'ai pas réussi.

"/\
~x/
o</
 !

Vous pouvez l'essayer ici .

Aaron
la source
2

Cubix , 12 octets

D<^<!"/\"B!o

Voir dans l'interprète en ligne!

Cela correspond au réseau de cubes suivant:

    D <
    ^ <
! " / \ " B ! o
. . . . . . . .
    . .
    . .

Explication

Installer:

L'IP commence à se diriger vers l'est au premier !. Il s'agit de la commande «ignorer si vrai», qui est Faux lorsqu'il n'y a rien sur la pile, donc aucune commande n'est ignorée. "/\"entre en mode chaîne et ajoute ces deux codes de caractères à la pile. B!oest principalement un no-op ici, inversant seulement la pile.

L'IP revient maintenant en boucle au premier !. Cependant, il y a maintenant des entiers positifs sur la pile, donc le premier "est ignoré. Cela signifie que ce /n'est plus un personnage, mais un miroir, envoyant l'IP au nord dans la boucle principale.

Boucle principale:

La Dcommande est la seule source d'aléatoire dans Cubix. Il envoie l'IP dans une direction aléatoire. En bloquant le sud et l'est avec des flèches, nous nous assurons que l'IP a 50% de chances de se diriger vers le nord et 50% de chances de se diriger vers l'ouest.

S'il se dirige vers l'ouest, la pile est inversée. S'il se dirige vers le nord, le caractère supérieur est imprimé.

Cela crée la séquence aléatoire de barres obliques, comme vous le souhaitez.

FlipTack
la source
2

PHP, 26 31 octets

huit trois octets plus court que le vôtre (sans espace ni accolades) ,
deux octets plus court que la solution de primo (sans la balise)
.

PHP 5.4.9 était la version actuelle en décembre 1012, donc ...

for($s="\/";;)echo$s[rand()%2];

nécessite PHP 5.5 ou version ultérieure pour l'indexation de chaînes littérales.

Courez avec -rou essayez-le en ligne .

Titus
la source
PHP 5.5 n'existait pas au moment de la publication du défi, mais a quand même un +1. Essayez également rand()&1une version PHP pour Windows. Vous pourriez être surpris.
primo
2

SmileBASIC, 20 octets

?"/\"[RND(2)];
EXEC.
12Me21
la source
2

Java 8, 60 59 54 53 octets

v->{for(;;)System.out.write(Math.random()<.5?47:92);}

-1 octet grâce à @BenjaminUrquhart en remplaçant printpar write, '/'peut donc l' être 47.

Explication:

Essayez-le en ligne (expire après 60 secondes).

v->{                     // Method with empty unused parameter and no return-type
  for(;;)                //  Loop indefinitely
    System.out.write(    //   Print:
      Math.random()<.5?  //    If the random decimal value in range [0,1) is below 0.5:
       47                //     Print forward slash
      :                  //    Else:
       92);}             //     Print backward slash
Kevin Cruijssen
la source
1
Java. 60. octets. Sensationnel.
Erik the Outgolfer
@EriktheGolfer Hehe. Je n'avais même pas remarqué que j'étais dans la moyenne en nombre d'octets. Habituellement, je suppose simplement que Java est l'un des nombres d'octets les plus élevés, à peine parfois compétitif avec BrainFuck ou C #. xD (PS: je l'ai même
joué au golf
Vous n'êtes pas moyen, vous avez un nombre d'octets trop petit (en supposant que Java, pas trop petit n'est pas bon). Mais, au moins, ce n'est pas JAVA 8 , où je pense que c'est plus long ...
Erik the Outgolfer
@EriktheGolfer Hmm, Java 8 n'est-il pas plus court avec c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 octets ) Ou vouliez-vous dire que Java 7 est plus long que Java 8? Dans ce cas, vous avez en effet raison.
Kevin Cruijssen
1
53 octets en basculant vers System.out.writeet en remplaçant '/'par47
Benjamin Urquhart
2

JavaScript (Node.js) , 59 55 54 octets

Réponse originale

while(1){process.stdout.write(Math.random()>=0.5?"/":"\\")}

-4 octets grâce au manatwork

while(1)process.stdout.write(Math.random()<.5?"/":"\\")

-1 octet grâce à Conor O'Brien

for(;;)process.stdout.write(Math.random()<.5?"/":"\\")
1024x2
la source
Bienvenue sur le site!
caird coinheringaahing
Pas besoin d'accolades autour d'un seul bloc d'instructions; en JavaScript, la partie entière 0 peut être omise; inverser la condition d'utiliser l' opérateur de caractère: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
manatwork
@manatwork Merci! Mis à jour.
1024x2
Vous pouvez également écrire à la for(;;)place dewhile(1)
Conor O'Brien
Merci aussi. Ajoutée.
1024x2
1

Je suppose que vous pouvez utiliser la récursivité.

function slashes() {echo chr(47 + 45 * rand(0,1)); slashes();}

Je suppose que vous pouvez utiliser la récursivité.

function slashes() {echo chr(47 + 45 * rand(0,1)); slashes();}

...
Naftali aka Neal
la source
l'espace de pile n'est pas infini.
codaddict
@codaddict donc il expirera.
Naftali aka Neal
En supposant un délai d'expiration considérablement élevé, votre extrait de code n'est pas équivalent aux PO.
codaddict
1
@codaddict lol les PO expirent également. c'est une boucle infinie !
Naftali aka Neal
1
Le vôtre créerait une erreur d'exécution avant la temporisation.
codaddict
1

coupé un caractère:

while(1) { echo chr(2 + 45 * rand(1,2)); }

puis retirez les accolades:

while(1) echo chr(2+45*rand(1,2));

une autre astuce, de même longueur:

while(1) echo chr(rand()%2*45+47);

la source
1
En raison de l'algorithme qu'il utilise, rand()%2entraînera une alternance de 0s et 1s. Pas incroyablement aléatoire. Vous auriez besoin d'utiliser rand(0,1)ou à la mt_rand()%2place.
primo
1

Perl

Celui-ci me semble drôle:

perl -pe '$_="~"ge$_?"/":"\\"' </dev/urandom

(Désolé d'être hors sujet ici. Je sais que ce n'est pas PHP)

Orabîg
la source
1

Powershell, 37 octets

for(){Write-Host(Random("\","/"))-N}

malheureusement, il ne semble pas y avoir d'alias plus courts pour Write-Host qui ne provoquent pas de nouvelle ligne après chaque caractère.

peu importe
la source
1

Code d'assemblage x86 16 bits, 10 octets

Je ne me souviens pas si celui-ci s'est retrouvé dans le livre.

init:
scasb            ;read from where ES:DI points and compare to AL 
                 ;this sets flags similar to a subtraction 
salc             ;set mask in AL to 00 or FF 
and   al,'\'-'/' ;begin choosing character (AL is 00 or 2D) 
add   al,'/'     ;finish choosing character 
writec:
int   29h        ;write char in AL 
jmp   init       ;loop endlessly
peter ferrie
la source
1

Perl 6 , 23 octets

loop {<\ />.pick.print}
  • loop boucles pour toujours.
  • <\ />est une liste des chaînes \et /.
  • .pick choisit l'une des deux chaînes au hasard.
  • .print imprime cette chaîne aléatoire.
Sean
la source
au lieu de la boucle, vous pouvez utiliserxx*
Jo King