10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10 em PHP (ou qualquer outra coisa, para esse assunto)

23

Acabei de ter uma conversa "animada" com um colega de trabalho sobre a sucessão da seguinte declaração do BASIC:

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

É o título deste livro e simplesmente imprimirá uma sequência de /e \caracteres, alternando entre os dois aleatoriamente, resultando em um padrão semelhante a este:

insira a descrição da imagem aqui

(Imagem emprestada de http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Sendo uma propensão ao PHP, imaginamos qual seria a maneira mais compacta de escrever a mesma coisa no PHP, e criamos o seguinte:

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

chr(47)é um /personagem e chr (92) é a \. Portanto, a afirmação echo chr(47 + 45 * rand(0,1));alternará aleatoriamente entre os dois, ad nauseum.

Em um idioma de sua escolha, escreva o programa ou função mais curto para gerar uma sequência aleatória infinita de \e /caracteres, em que cada caractere tem a mesma probabilidade de ser escolhido.

Judy
fonte
1
Você pode perder o {}aparelho, mas isso é o mais conciso possível.
22712 Michael
Isso é legal. Qual fonte pode ser usada para obter uma imagem semelhante?
Daniero 9/12/12
1
Este (foto) me lembra o primeiro "programa" que eu já escrevi no meu Commodore 64 em linha reta do manual :) ah dias felizes
Dale
@daniero Eu acho que o tipo de letra real é chamado de Terminal, mas eu achei on-line como "Windows Command Prompt" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford
Que estranha coincidência o fato deste repositório do
Geza Kerecsenyi

Respostas:

9

O gotooperador foi adicionado ao PHP a partir da versão 5.3.0 para que você pudesse usar o mesmo método usado no BASIC:

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

Como isso foi migrado para o codegolf ...

PHP 30 bytes

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

O Ðcaractere é 208 e o £caractere é 163.

Exemplo de uso (em uma caixa do Windows):

color 18 & php maze.php

Produz algo semelhante a:

Funciona melhor com uma fonte monoespaçada exatamente quadrada (aqui eu escolhi a fonte padrão do sistema 8x8). Para voltar à sua cor padrão, você pode digitar colornovamente sem nenhum parâmetro.

primo
fonte
Pode salvar um byte extra com rand()%2(ninguém disse como pseudo-aleatório que tinha que ser) - também não funciona em terminais Unicode (como OSX)
Leigh
@Leigh Devido à sua implementação, rand()%2alternará entre zero e um. mt_rand()%2funcionaria, no entanto.
primo
15

Mathematica 157 bytes

Na falta de PETSCII, rolei meus próprios "\" e "/".

Nenhum charuto por brevidade aqui.

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 azul

DavidC
fonte
Esta imagem faz a ilusão de ótica do ponto cinzento !!
Magic Octopus Urn
8

Brainfuck - 534

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

Meu prng ( daqui ) é grande e extremamente lento. Talvez um LFSR mais simples ou similar seja suficiente, mas isso funciona:

insira a descrição da imagem aqui

captncraig
fonte
Eu acho que isso não é aleatório, porém, já que isso é foda cerebral.
Erik the Outgolfer
a maioria deles depende de dispositivos internos. Sim, isso sempre será o mesmo. Poderia permitir que ele fosse semeado do teclado a um custo de alguns caracteres extras, mas esse não é realmente o ponto aqui, eu acho.
Captncraig 4/10/16
5

C, 39 caracteres (38 em MSVC)

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

insira a descrição da imagem aqui Veja-o correr.

Em MSVC, podemos substituir putchar()com _putch()e salvar um byte, mas ele não funciona em IDEOne.

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

Lisp comum, 33

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

printtem um valor de retorno 1, portanto, se você usar isso, poderá apenas envolver toda a expressão no while:

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

Você provavelmente também pode jogar golfe.

histocrata
fonte
3

rubi, 27 23 caracteres

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

$><< é 'print to stdout'.

steenslag
fonte
2
Você deve poder substituir "/\\"por '\/'. O Ruby 1.8 requer [rand(2),1]a produção do caractere em vez do código ascii.
Primo
3

C ++, 45 caracteres

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

Não vou ganhar nenhum prêmio por falta, mas eu já tinha escrito isso quando soube do livro mencionado, então apenas joguei no golfe.

O truque putchar também funciona em C ++, diminuindo para 43, mas você não pode evitar declarar o tipo de retorno em main.

Brandorf
fonte
3

eu tento criar usando o estilo css, e é trabalho

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

este código php:

<?php
  $i=10000;
  while($i) {
    if($i%200 == 0) echo '<br/>';
    echo chr(47 + 45 * rand(0,1));
    $i--;
  }
?>
hendra
fonte
Eu gostaria de sugerir um estilo alternativo: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Usando -0.25ema letter-spacing parece corresponder-se melhor do que -3px, que tem artefatos devido a um inexata pta pxconversão.
Primo
3

Lisp comum - 68

(defun s(l)(elt l(random(length l))))(loop do(format t"~a"(s"/\\")))
Matthew Rolph
fonte
O loop permite uma sintaxe complexa e uma simples, sendo a simples como um progn, mas repetindo para sempre. Você pode largar o do.
coredump
3

05AB1E , 7 bytes

["/\"Ω?

Experimente 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
escoteiro
fonte
3

Befunge-98 (PyFunge) , 7 bytes

? '/,\'

Experimente online!

o ?envia o IP a esquerda ou direita, por isso ou /ou \é empurrado antes de imprimir com ,. Ao executar o '/ou \'na ordem errada após a impressão, ele faz as coisas na pilha (divide ou troca) e, em seguida, envia um caracter irrelevante antes de repetir.

MildlyMilquetoast
fonte
Eu estava apenas propondo uma solução Befunge-98 de 7 bytes diferente na resposta de Jo King. Mas essa abordagem parece mais organizada.
James Holderness
3

Befunge, 12 9 8 7 Bytes

Editar: James Holderness descobriu uma solução insana que usa três citações.

?\","/"

Transborda a pilha com muitos caracteres em excesso para cada símbolo, mas quem se importa quando você pode jogar golfe com 1 byte?

Versão antiga

"/\"?>,#

(Observe o espaço à direita) direita aparentemente não necessário (obrigado Mistah Figgins)

Experimente 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

Isso começa a encher a pilha, com um símbolo extra para cada símbolo impresso.

Brincadeira
fonte
1
parece que você pode se livrar do espaço extra, como #no final de uma linha. É um comportamento não é consistente, mas o intérprete que você está usando permite que ele: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast
Também me pergunto se você é capaz de usar apenas um ", mas minhas tentativas foram inúteis. Como você precisa de um /dos lados ", terá que dividir metade do tempo.
MildlyMilquetoast
O @MistahFiggins Space definitivamente não deve ser necessário para nenhuma implementação padrão do Befunge-93. O código pode falhar em alguns intérpretes do Funge-98, onde a especificação é mais ambígua, mas a adição de um espaço não ajudaria nesses casos de qualquer maneira - você precisaria de um <após #para fazer o trabalho.
James Holderness
@MistahFiggins Quanto a se livrar de uma das citações, você pode fazer isso no Befunge-98 usando '. Experimente online!
James Holderness
2
@JoKing Acabei de perceber que você pode realmente fazer melhor com três citações! ?\","/"A única desvantagem é que ela transbordará muito mais rápido, eu acho.
precisa
2

Não muito melhor. Precisa do php 5.5+ para o recurso de desreferenciamento de array.

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

fonte
Nunca pensei nisso, obrigado!
Judy
1
Na verdade PHP suporta subscritos para strings: while(1)echo'/\\'[rand(0,1)];.
manatwork
2

Python, 68

Na categoria "minha linguagem é péssima nessa", temos o Python!

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

Agradecimentos a Ivo por alguns caracteres sobre importações e choice.

boothby
fonte
Bem, você não está salvando nada com 'from sys import *' - se você escrever 'import sys, random' e usar sys.stdout e random.random, economizará 5 bytes.
Ivo
Python3: importação aleatória enquanto 1: impressão (random.choice ('/ \\'), end = '')
Ivo
@ Ivo, Obrigado, eu esqueci a escolha! Você pode manter py3, no entanto. ;)
booth
Se você reverter sua string, não precisará escapar da barra invertida, salvando um byte.
precisa
2

> <> , 14 bytes

Eu esperava poder restringi-lo a um quadrado 3 * 3, mas não obtive sucesso.

"/\
~x/
o</
 !

Você pode tentar aqui .

Aaron
fonte
2

Cubix , 12 bytes

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

Veja no intérprete online!

Isso mapeia a seguinte rede de cubos:

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

Explicação

Configuração:

O IP começa a ir para o leste no primeiro !. Este é o comando 'skip if truthy', que é False quando não há nada na pilha; portanto, nenhum comando é ignorado. "/\"insere stringmode e anexa esses dois códigos de caracteres à pilha.B!oé principalmente um no-op aqui, apenas revertendo a pilha.

O IP agora volta ao primeiro !. No entanto, agora existem números inteiros positivos na pilha, portanto o primeiro "é ignorado. Isso significa que /não é mais um personagem, mas um espelho, enviando o IP para o norte no loop principal.

Loop principal:

O Dcomando é a única fonte de aleatoriedade no Cubix. Ele envia o IP em uma direção aleatória. Ao bloquear o sul e o leste com flechas, garantimos que o IP tenha 50% de chance de ir para o norte e 50% de chance de ir para o oeste.

Se seguir para oeste, a pilha será revertida. Se seguir para o norte, o caractere superior será impresso.

Isso cria a sequência aleatória de barras, conforme desejado.

FlipTack
fonte
2

PHP, 26 31 bytes

oito três bytes mais curtos que o seu (sem espaços em branco ou chaves) ,
dois bytes mais curtos que a solução do primo (sem a tag)
.

O PHP 5.4.9 era a versão atual em dezembro de 1012, então ...

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

requer PHP 5.5 ou posterior para indexação literal de strings.

Corra com -rou experimente online .

Titus
fonte
O PHP 5.5 não existia no momento da publicação do desafio, mas tem um +1 de qualquer maneira. Além disso, tente rand()&1criar um PHP para Windows. Você pode se surpreender.
primo
2

SmileBASIC, 20 bytes

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

Java 8, 60 59 54 53 bytes

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

-1 byte graças a @BenjaminUrquhart substituindo printpor write, então '/'pode ser47 .

Explicação:

Experimente online (o tempo limite termina após 60 s).

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
fonte
1
Java. 60. bytes. Uau.
Erik the Outgolfer
@EriktheGolfer Hehe. Eu nem tinha notado que sou quase na média em contagem de bytes. Normalmente, estou apenas assumindo que Java é uma das contagens de bytes mais altas, às vezes apenas um pouco competitiva com BrainFuck ou C #. xD (PS: eu mesmo golfed-lo para 59: P)
Kevin Cruijssen
Você não é mediano, possui uma contagem de bytes muito pequena (supondo que Java, que não seja muito pequeno não seja bom). Mas, pelo menos, este não é o JAVA 8 , onde acho que é mais ...
Erik the Outgolfer
@EriktheGolfer Hmm, o Java 8 não é mais curto com c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 bytes ) Ou você quis dizer que o Java 7 é mais longo que o Java 8? Nesse caso, você está realmente correto.
Kevin Cruijssen
1
53 bytes mudando para System.out.writee substituindo '/'por47
Benjamin Urquhart
2

JavaScript (Node.js) , 59 55 54 bytes

Resposta original

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

-4 bytes graças ao manatwork

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

-1 byte graças a Conor O'Brien

for(;;)process.stdout.write(Math.random()<.5?"/":"\\")
1024x2
fonte
Bem vindo ao site!
caird coinheringaahing
Não há necessidade de chaves em torno de um único bloco de instruções; em JavaScript, a parte inteira 0 pode ser deixada de fora; reverter a condicional para usar o operador único caractere: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
21818 manatwork
@manatwork Thanks! Atualizada.
1024x2 22/03
Você também pode escrever for(;;)em vez dewhile(1)
Conor O'Brien
Obrigado também. Adicionado.
1024x2 22/03
1

Eu acho que você pode usar recursão.

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

Eu acho que você pode usar recursão.

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

...
Naftali tcp Neal
fonte
o espaço da pilha não é infinito.
Codaddict
@codaddict, então o tempo limite será excedido.
Naftali aka Neal,
Assumindo um tempo limite consideravelmente alto, seu snippet não é equivalente aos OPs.
Codaddict
1
@codaddict lol os OPs expiram também. é um loop infinito !
Naftali, também conhecido como Neal
1
O seu criaria um erro de tempo de execução antes do tempo limite.
Codaddict
1

cortou um caractere:

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

em seguida, remova as chaves:

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

outro truque, com o mesmo comprimento:

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

fonte
1
Devido ao algoritmo empregado, rand()%2resultará em uma alternância de 0s e 1s. Não é incrivelmente aleatório. Você precisaria usar rand(0,1)ou em mt_rand()%2vez disso.
Primo
1

Perl

Este parece engraçado para mim:

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

(Desculpe por estar fora de assunto aqui. Eu sei que isso não é PHP)

Orabîg
fonte
1

PowerShell, 37 bytes

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

infelizmente, parece não haver aliases mais curtos para Write-Host que não causam uma nova linha após cada caractere.

tanto faz
fonte
1

Código de montagem x86 de 16 bits, 10 bytes

Não me lembro se este acabou no livro.

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
fonte
1

Perl 6 , 23 bytes

loop {<\ />.pick.print}
  • loop laços para sempre.
  • <\ />é uma lista das strings \e /.
  • .pick escolhe uma das duas seqüências aleatoriamente.
  • .print imprime essa sequência aleatória.
Sean
fonte
em vez de loop, você pode usarxx*
Jo King