10 STAMPA CHR $ (205.5 + RND (1)); : GOTO 10 in PHP (o qualsiasi altra cosa, del resto)


23

Ho appena avuto una conversazione "animata" con un collega sulla succinta della seguente dichiarazione BASIC:

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

È il titolo di questo libro e stamperà semplicemente una sequenza di /e \caratteri, alternando i due in modo casuale, risultando in uno schema simile a questo:

inserisci qui la descrizione dell'immagine

(Immagine presa in prestito da http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Essendo di una propensione al PHP, ci siamo chiesti quale sarebbe il modo più compatto di scrivere la stessa cosa in PHP, e abbiamo trovato questo:

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

chr(47)è un /personaggio e chr (92) è un \. Quindi l'affermazione echo chr(47 + 45 * rand(0,1));si alternerà casualmente tra i due, fino alla nausea.

In una lingua di tua scelta, scrivi il programma o la funzione più breve per generare una sequenza casuale infinita di \e /caratteri, in cui ogni personaggio ha la stessa probabilità di essere scelto.


1
Puoi perdere le {}parentesi graffe, ma è conciso quanto puoi farcela.
Michael,

Questo è fico. Quale tipo di carattere può essere utilizzato per ottenere un'immagine simile?
daniero,

1
Questa (foto) mi ricorda il primo "programma" che abbia mai scritto sul mio commodore 64 direttamente dal manuale :) ah giorni felici
Dale

@daniero Penso che il carattere tipografico vero sia chiamato Terminale, ma l'ho trovato online come "Prompt dei comandi di Windows" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Che strana coincidenza che questo repository Code Golf su Github abbia la stessa identica sfida ... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Risposte:


9

L' gotooperatore è stato aggiunto a PHP dalla versione 5.3.0 in modo da poter usare lo stesso metodo di BASIC:

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

18

Da quando è stato migrato su codegolf ...

PHP 30 byte

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

Il Ðpersonaggio è 208 e il £personaggio 163.

Esempio di utilizzo (su una finestra di Windows):

color 18 & php maze.php

Produce qualcosa di simile a:

Funziona meglio con un carattere monospaziale esattamente quadrato (qui ho scelto il carattere di sistema standard 8x8). Per tornare al colore predefinito, è possibile digitare colornuovamente senza parametri.


Può salvare un byte extra con rand()%2(nessuno ha affermato quanto fosse pseudo-casuale) - Inoltre non funziona sui terminali Unicode (come OSX)
Leigh

@Leigh A causa della sua implementazione, rand()%2si alternerà tra zero e uno. mt_rand()%2avrebbe funzionato, comunque.
primo

15

Mathematica 157 byte

In mancanza di PETSCII, ho arrotolato il mio "\" e "/".

Nessun sigaro per brevità qui.

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]

labirinto blu


Questa immagine fa l'illusione ottica del punto grigio !!
Magic Octopus Urn

8

Brainfuck - 534

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

Il mio prng (da qui ) è sia grande che estremamente lento. Forse sarebbe sufficiente un LFSR più semplice o simile, ma funziona:

inserisci qui la descrizione dell'immagine


Penso che questo non sia casuale, tuttavia, dal momento che è brainfuck.
Erik the Outgolfer,

la maggior parte di questi si basano su prng integrati. Sì, questo produrrà lo stesso ogni volta. Potrebbe consentire che venga eseguito il seeding dalla tastiera al costo di un paio di caratteri extra, ma non è proprio questo il punto, credo.
captncraig,

5

C, 39 caratteri (38 su MSVC)

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

inserisci qui la descrizione dell'immagine Guardalo correre.

Su MSVC, possiamo sostituire putchar()con _putch()e salvare un byte, ma non funziona in Ideone.

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


3

printha un valore di ritorno di 1, quindi se lo usi puoi semplicemente racchiudere l'intera espressione in while:

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

Probabilmente puoi anche giocare a golf.


3

rubino, 27 23 caratteri

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

$><< è "stampa su stdout".


2
Dovresti essere in grado di sostituire "/\\"con '\/'. Ruby 1.8 richiede [rand(2),1]di produrre il carattere anziché il codice ASCII.
primo

3

C ++, 45 caratteri

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

Non avrei vinto alcun premio per mancanza, ma avevo già scritto questo quando ho sentito parlare del libro citato, quindi l'ho appena giocato a golf.

Il trucco putchar funziona anche in C ++, portandoti a 43, ma non puoi evitare di dichiarare il tipo restituito su main.


3

provo a creare usando lo stile CSS, ed è lavoro

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

questo codice php:

<?php
  $i=10000;
  while($i) {
    if($i%200 == 0) echo '<br/>';
    echo chr(47 + 45 * rand(0,1));
    $i--;
  }
?>

Vorrei suggerire uno stile alternativo: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Utilizzo -0.25emper letter-spacing sembra corrispondere meglio -3px, che ha artefatti a causa di un'inesatta ptalla pxconversione.
primo

3

Lisp comune - 68

(defun s(l)(elt l(random(length l))))(loop do(format t"~a"(s"/\\")))

Il loop consente sia una sintassi complessa che una semplice, quella semplice è come un progn, ma continua in loop per sempre. Puoi rilasciare il do.
coredump

3

05AB1E , 7 byte

["/\"Ω?

Provalo online!

["/\"Ω?  - 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

3

Befunge-98 (PyFunge) , 7 byte

? '/,\'

Provalo online!

la ?invia l'indirizzo IP a destra oa sinistra, quindi o /o \è spinto prima della stampa con ,. Quando si esegue '/o \'nell'ordine sbagliato dopo la stampa, fa semplicemente le cose nella pila (divide o scambia), quindi inserisce un carattere irrilevante prima di ripetere.


Stavo solo proponendo una soluzione Befunge-98 a 7 byte diversa sulla risposta di Jo King. Ma questo approccio sembra più ordinato.
James Holderness,

3

Befunge, 12 9 8 7 byte

Modifica: James Holderness ha trovato una soluzione folle che utilizza invece tre virgolette.

?\","/"

Trabocca lo stack con molti caratteri in eccesso per ciascun simbolo, ma a chi importa quando puoi giocare a golf con quel 1 byte?

Vecchia versione

"/\"?>,#

(Nota lo spazio finale) Spazio finale apparentemente non necessario (grazie Mistah Figgins)

Provalo online

"/\" 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

Questo inizia a riempire la pila, con un simbolo in più per ogni simbolo stampato.


1
sembra che tu possa liberarti dello spazio extra, come #è alla fine di una linea. Non è un comportamento coerente, ma l'interprete che stai utilizzando lo consente: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Mi chiedo anche se sei in grado di utilizzarne solo uno ", ma i miei tentativi sono stati inutili. Poiché hai bisogno di un /lato ", dovrai dividere metà del tempo.
MildlyMilquetoast,

@MistahFiggins Lo spazio non dovrebbe assolutamente essere richiesto per qualsiasi implementazione standard di Befunge-93. Il codice potrebbe non riuscire in alcuni interpreti Funge-98, in cui le specifiche sono più ambigue, ma l'aggiunta di uno spazio non sarebbe comunque utile in quei casi - ti servirà un <after #per farlo funzionare.
James Holderness,

@MistahFiggins Per quanto riguarda la rimozione di una delle virgolette, puoi in qualche modo farlo in Befunge-98 usando 'invece. Provalo online!
James Holderness,

2
@JoKing Ho appena realizzato che puoi effettivamente fare di meglio con tre citazioni! ?\","/"L'unico inconveniente è che traboccerà lo stack molto più velocemente, credo.
James Holderness,

2

Non molto meglio Richiede php 5.5+ per la funzione di dereferenziazione dell'array.

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

Non ci ho mai pensato, grazie!
Judy,

1
In realtà PHP supporta gli indici per le stringhe: while(1)echo'/\\'[rand(0,1)];.
arte

2

Python, 68

Nella categoria "La mia lingua fa schifo in questo", abbiamo Python!

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

Grazie a Ivo per alcuni caratteri sulle importazioni e choice.


Bene, non stai salvando nulla con 'from sys import *' - se invece scrivi 'import sys, random' e usi sys.stdout e random.random, risparmierai 5 byte.
Ivo,

Python3: importa random mentre 1: print (random.choice ('/ \\'), end = '')
Ivo

@Ivo, grazie, mi sono dimenticato della scelta! Puoi comunque mantenere py3. ;)
stand dal

Se si inverte la stringa, non è necessario uscire dalla barra rovesciata, salvando così un byte.
Jonathan Frech,

2

> <> , 14 byte

Speravo di poterlo limitare a un quadrato 3 * 3 ma non ci sono riuscito.

"/\
~x/
o</
 !

Puoi provarlo qui .


2

Cubix , 12 byte

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

Visualizza nell'interprete online!

Questo viene mappato alla seguente rete cubica:

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

Spiegazione

Impostare:

L'IP inizia a est verso il primo !. Questo è il comando 'skip if truthy', che è False quando non c'è nulla in pila, quindi nessun comando viene saltato. "/\"entra in modalità stringa e aggiunge questi due codici di caratteri allo stack. B!oè principalmente una no-op qui, invertendo solo lo stack.

L'IP ora ritorna al primo !. Tuttavia, ora ci sono numeri interi positivi nello stack, quindi il primo "viene ignorato. Questo significa che /non è più un personaggio, ma un mirror, che invia l'IP a nord nel loop principale.

Ciclo principale:

Il Dcomando è l'unica fonte di casualità in Cubix. Invia l'IP in una direzione casuale. Bloccando il Sud e l'Est con le frecce, ci assicuriamo che l'IP abbia una probabilità del 50% di dirigersi a Nord e una probabilità del 50% di dirigersi a Ovest.

Se si dirige verso ovest, lo stack è invertito. Se si dirige verso nord, viene stampato il carattere superiore.

Questo crea la sequenza casuale di barre, come desiderato.


2

PHP, 26 31 byte

otto tre byte più corti dei tuoi (senza spazi bianchi o parentesi graffe) ,
due byte più corti della soluzione di primo (senza tag)
.

PHP 5.4.9 era la versione attuale nel dicembre 1012, quindi ...

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

richiede PHP 5.5 o successivo per l'indicizzazione letterale delle stringhe.

Corri con -ro provalo online .


PHP 5.5 non esisteva al momento della pubblicazione della sfida, ma aveva comunque un +1. Inoltre, prova rand()&1una build PHP per Windows. Potresti essere sorpreso.
primo



2

Java 8, 60 59 54 53 byte

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

-1 byte grazie a @BenjaminUrquhart sostituendolo printcon write, quindi '/'può essere 47.

Spiegazione:

Provalo online (timeout dopo 60 sec).

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

1
Giava. 60. Byte. Wow.
Erik the Outgolfer,

@EriktheGolfer Hehe. Non avevo nemmeno notato che sono nella media nel conteggio dei byte. Di solito sto solo supponendo che Java sia uno dei conteggi di byte più alti, a volte solo leggermente competitivo con BrainFuck o C #. xD (PS: l'ho persino giocato a 59: P)
Kevin Cruijssen,

Non sei nella media, hai un conteggio dei byte troppo piccolo (supponendo Java, non troppo piccolo non va bene). Ma, almeno, questo non è JAVA 8 , dove penso sia più lungo ...
Erik the Outgolfer

@EriktheGolfer Hmm, Java 8 non è più corto con c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 byte ) O intendevi che Java 7 è più lungo di Java 8? In tal caso, hai davvero ragione.
Kevin Cruijssen,

1
53 byte passando a System.out.writee sostituendo '/'con47
Benjamin Urquhart il

2

JavaScript (Node.js) , 59 55 54 byte

Risposta originale

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

-4 byte grazie a manatwork

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

-1 byte grazie a Conor O'Brien

for(;;)process.stdout.write(Math.random()<.5?"/":"\\")

Benvenuti nel sito!
caird coinheringaahing

Non sono necessarie parentesi graffe attorno a un singolo blocco di istruzioni; in JavaScript la parte intera 0 può essere esclusa; invertire la condizionale per utilizzare operatore singolo carattere: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
arte

@manatwork Grazie! Aggiornato.
1024x2

Puoi anche scrivere for(;;)invece diwhile(1)
Conor O'Brien il

Grazie anche a te. Aggiunto.
1024x2

1

Immagino che tu possa usare la ricorsione.

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

Immagino che tu possa usare la ricorsione.

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

...

lo spazio di stack non è infinito.
codaddict

@codaddict, quindi scadrà.
Naftali aka Neal

Supponendo un timeout considerevolmente elevato, lo snippet non equivale ai PO.
codaddict

1
@codaddict lol anche i PO scadono. è un ciclo infinito !
Naftali aka Neal

1
Il tuo creerebbe un errore di runtime prima del timeout.
codaddict

1

tagliato un personaggio:

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

quindi rimuovere le parentesi graffe:

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

un altro trucco, con la stessa lunghezza:

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

1
A causa dell'algoritmo che utilizza, rand()%2si tradurrà in un'alternanza di 0s e 1s. Non incredibilmente casuale. Dovresti usare rand(0,1)o mt_rand()%2invece.
primo

1

Perl

Questo sembra divertente per me:

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

(Mi dispiace essere fuori argomento qui. So che questo non è PHP)


1

Powershell, 37 byte

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

sfortunatamente non sembrano esserci alias più brevi per Write-Host che non causino una nuova riga dopo ogni carattere.


1

Codice assembly x86 a 16 bit, 10 byte

Non ricordo se questo è finito nel libro.

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


1

Perl 6 , 23 byte

loop {<\ />.pick.print}
  • loop loop per sempre.
  • <\ />è un elenco delle stringhe \e /.
  • .pick seleziona casualmente una delle due stringhe.
  • .print stampa quella stringa casuale.

invece di loop, puoi usarexx*
Jo King il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.