10 DRUKUJ CHR $ (205,5 + RND (1)); : GOTO 10 w PHP (lub cokolwiek innego, jeśli o to chodzi)


23

Właśnie odbyłem „porywającą” rozmowę ze współpracownikiem na temat zwięzłości następującego oświadczenia BASIC:

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

Jest to tytuł tej książki i po prostu wydrukuje sekwencję znaków /i \, naprzemiennie między nimi, tworząc wzór podobny do tego:

enter image description here

(Zdjęcie pożyczone z http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Będąc skłonnością do PHP, zastanawialiśmy się, jaki byłby najbardziej kompaktowy sposób pisania tego samego w PHP, i wymyśliliśmy:

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

chr(47)jest /postacią, a chr (92) to \. Tak więc oświadczenie echo chr(47 + 45 * rand(0,1));będzie losowo alternatywne między tymi dwoma, ad nauseum.

W wybranym języku napisz najkrótszy program lub funkcję, aby wygenerować nieskończoną losową sekwencję znaków \i /, przy czym każdy znak ma jednakowe prawdopodobieństwo wybrania.


1
Możesz stracić {}aparat ortodontyczny, ale jest to tak zwięzłe, jak tylko możesz.
— Michael

To jest fajne. Jakiej czcionki można użyć, aby uzyskać podobny obraz?
— daniero

1
To (zdjęcie) przypomina mi pierwszy „program”, jaki kiedykolwiek napisałem na moim Commodore 64 prosto z instrukcji :) ah happy days
— Dale

@daniero Wydaje mi się, że rzeczywisty krój nazywa się Terminal, ale znalazłem go w Internecie jako „Wiersz polecenia systemu Windows” codepen.io/nickforddesign/pen/WMqQdM?editors=0110
— nickford

Co za dziwny zbieg okoliczności, że repozytorium Code Golf na Github ma dokładnie takie samo wyzwanie ... github.com/noops-challenge/golfbot
— Geza Kerecsenyi

Odpowiedzi:


9

gotoOperator został dodany do PHP od wersji 5.3.0, więc można używać tej samej metody, jak w podstawowy:

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

18

Od czasu migracji do codegolf ...

PHP 30 bajtów

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

Jest Ðto postać 208, a £jest to postać 163.

Przykładowe użycie (w systemie Windows):

color 18 & php maze.php

Tworzy coś podobnego do:

Najlepiej działa z czcionką o stałej szerokości, która jest dokładnie kwadratowa (tutaj wybrałem standardową czcionkę systemową 8x8). Aby wrócić do domyślnego koloru, możesz pisać colorponownie bez żadnych parametrów.


Można zapisać dodatkowy bajt z rand()%2(nikt nie powiedział, jak musiałby być pseudolosowy) - Również nie działa na terminalach Unicode (takich jak OSX)
— Leigh

@Leigh Ze względu na jego implementację rand()%2będzie na przemian od zera do jednego. mt_rand()%2działałoby jednak.
— primo

15

Mathematica 157 bajtów

Nie mając PETSCII, zwinąłem własne „\” i „/”.

Tutaj nie ma cygara za zwięzłość.

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]

blue maze


Ten obraz robi złudzenie optyczne szarej kropki !!
— Magic Octopus Urn

8

Brainfuck - 534

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

Mój prng ( stąd ) jest zarówno duży, jak i bardzo wolny. Być może wystarczyłby prostszy LFSR lub podobny, ale to działa:

enter image description here


Myślę, że to nie jest przypadek, ponieważ to jest pieprzenie mózgów.
— Erik the Outgolfer

większość z nich opiera się na wbudowanych plikach PRng. Tak, będzie to generować to samo za każdym razem. Mogłoby to pozwolić na wysiewanie go z klawiatury kosztem kilku dodatkowych znaków, ale nie o to tutaj chodzi, tak myślę.
— captncraig

5

C, 39 znaków (38 na MSVC)

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

enter image description here Zobacz, jak działa.

Na MSVC możemy wymienić putchar()ze _putch()i zapisać bajt, ale to nie działa w IDEOne.

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


3

printma wartość zwracaną 1, więc jeśli użyjesz tego, możesz po prostu zawinąć całe wyrażenie w while:

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

Prawdopodobnie możesz też zagrać w golfa dalej.


3

rubin, 27 23 znaków

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

$><< to „print to stdout”.


2
Powinieneś być w stanie wymienić "/\\"z '\/'. Ruby 1.8 wymaga [rand(2),1]wytworzenia znaku zamiast kodu ascii.
— primo

3

C ++, 45 znaków

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

Nie zamierzam wygrać żadnych nagród za zwięzłość, ale napisałem to już, kiedy usłyszałem o wspomnianej książce, więc po prostu grałem w nią.

Sztuczka putchar działa również w C ++, co prowadzi do obniżenia do 43, ale nie można uniknąć zadeklarowania typu zwrotu na main.


3

próbuję tworzyć w stylu css i to działa

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

ten kod php:

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

Chciałbym zaproponować alternatywny styl: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Korzystanie -0.25emz letter-spacing wydaje się, aby dopasować się lepiej niż -3px, który ma artefaktów z powodu niedokładnego ptdo pxnawrócenia.
— primo

3

Common Lisp - 68

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

Pętla umożliwia zarówno złożoną, jak i prostą składnię, przy czym prosta jest jak prognostyka, ale zapętla się na zawsze. Możesz upuścić do.
— coredump

3

05AB1E , 7 bajtów

["/\"Ω?

Wypróbuj 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 bajtów

? '/,\'

Wypróbuj online!

?wysyła IP albo w lewo lub prawo, więc albo /czy \jest wciśnięty przed drukowania ,. Wykonując '/lub \'w niewłaściwej kolejności po wydrukowaniu, po prostu robi rzeczy na stosie (dzieli lub zamienia), a następnie wypycha nieistotny znak przed powtórzeniem.


Właśnie zaproponowałem inne 7-bajtowe rozwiązanie Befunge-98 dla odpowiedzi Jo Kinga. Ale to podejście wygląda ładniej.
— James Holderness

3

Befunge, 12 9 8 7 bajtów

Edytować: James Holderness wymyślił szalone rozwiązanie, które zamiast tego wykorzystuje trzy cytaty.

?\","/"

Przepełnia stos z dużą ilością nadmiarowych znaków dla każdego symbolu, ale kogo to obchodzi, kiedy możesz zagrać w ten 1 bajt?

Stara wersja

"/\"?>,#

(Zwróć uwagę na spację końcową) Spacja spacji najwyraźniej nie jest potrzebna (dzięki Mistah Figgins)

Wypróbuj 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

To zaczyna wypełniać stos, z jednym dodatkowym symbolem dla każdego wydrukowanego symbolu.


1
wygląda na to, że możesz pozbyć się dodatkowej przestrzeni, ponieważ #znajduje się na końcu linii. Nie jest to spójne zachowanie, ale używany przez niego interpreter
— MildlyMilquetoast

Zastanawiam się także, czy możesz użyć tylko jednego ", ale moje próby były daremne. Ponieważ potrzebujesz /jednej strony ", będziesz musiał podzielić połowę czasu.
— MildlyMilquetoast

@MistahFiggins Space zdecydowanie nie powinno być wymagane dla żadnej standardowej implementacji Befunge-93. Kod może zawieść w niektórych interpretatorach Funge-98, w których specyfikacja jest bardziej niejednoznaczna, ale dodanie spacji i tak nie pomogłoby w takich przypadkach - potrzebujesz by <po to, #żeby działało.
— James Holderness

@MistahFiggins Jeśli chodzi o pozbycie się jednego z cytatów, możesz to zrobić w Befunge-98, używając 'zamiast tego. Wypróbuj online!
— James Holderness

2
@JoKing Właśnie zdałem sobie sprawę, że możesz zrobić lepiej z trzema cytatami! ?\","/"Jedynym minusem jest to, że myślę, że szybciej przepełni stos.
— James Holderness

2

Niewiele lepiej. Potrzebuje php 5.5+ dla funkcji dereferencji macierzowej.

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

Nigdy o tym nie myślałem, dzięki!
— Judy,

1
Właściwie PHP obsługuje indeksów dla strun: while(1)echo'/\\'[rand(0,1)];.
— manatwork

2

Python, 68

W kategorii „mój język jest do bani” mamy Python!

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

Dzięki Ivo za kilka znaków na temat importu i choice.


Cóż, niczego nie zapisujesz za pomocą „from sys import *” - jeśli zamiast tego napiszesz „import sys, random” i używasz sys.stdout i random.random, zaoszczędzisz 5 bajtów.
— Ivo,

Python3: importuj losowo podczas 1: drukuj (random.choice ('/ \\'), end = '')
— Ivo

@Ivo, dziękuję, zapomniałem o wyborze! Możesz jednak zatrzymać py3. ;)
— stoisko

Jeśli odwrócisz łańcuch, nie musisz uciekać przed odwrotnym ukośnikiem, oszczędzając w ten sposób bajt.
— Jonathan Frech

2

> <> , 14 bajtów

Miałem nadzieję, że uda mi się ograniczyć do kwadratu 3 * 3, ale mi się nie udało.

"/\
~x/
o</
 !

Możesz spróbować tutaj .


2

Cubix , 12 bajtów

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

Zobacz w tłumaczu online!

Odwzorowuje to na następującą sieć kostek:

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

Wyjaśnienie

Ustawiać:

WI zaczyna się od wschodu !. Jest to polecenie „pomiń, jeśli jest prawdą”, które jest fałszem, gdy nic nie ma na stosie, więc żadne polecenia nie są pomijane."/\"wchodzi w tryb string i dołącza te dwa kody znaków do stosu. B!ojest tu w większości nie-op, tylko odwraca stos.

IP powraca teraz do pierwszego !. Jednak na stosie są teraz dodatnie liczby całkowite, więc pierwsza "jest pomijana. Oznacza to, że /nie jest już postacią, ale lustrem, wysyłającym adres IP na północ do głównej pętli.

Główna pętla:

The DKomenda jest źródłem tylko przypadkowości w Cubix. Wysyła adres IP w losowym kierunku. Blokując strzały na południe i wschód, upewniamy się, że IP ma 50% szansy na skierowanie się na północ i 50% szansy na skierowanie się na zachód.

Jeśli kieruje się na zachód, stos jest odwracany. Jeśli leci na północ, drukowana jest górna postać.

Spowoduje to utworzenie losowej sekwencji ukośników, zgodnie z potrzebami.


2

PHP, 26 31 bajtów

osiem trzech bajtów krótszych niż twój (bez spacji i nawiasów klamrowych) ,
dwa bajty krótsze niż rozwiązanie primo (bez znacznika)
.

PHP 5.4.9 była aktualną wersją w grudniu 1012, więc ...

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

wymaga PHP 5.5 lub nowszego do dosłownego indeksowania ciągów.

Uruchom -rlub wypróbuj online .


PHP 5.5 nie istniało w momencie publikowania wyzwania, ale i tak ma +1. Spróbuj rand()&1także kompilacji PHP dla Windows. Możesz być zaskoczony.
— primo



2

Java 8, 60 59 54 53 bytes

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

-1 byte thanks to @BenjaminUrquhart by replacing print with write, so '/' can be 47.

Explanation:

Try it online (times out after 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
Java. 60. Bytes. Wow.
— Erik the Outgolfer

@EriktheGolfer Hehe. I hadn't even noticed I'm about average in byte-count. Usually I'm just assuming Java is one of the highest byte-counts, only slightly competeable with BrainFuck or C# sometimes. xD (PS: I even golfed it to 59 :P)
— Kevin Cruijssen

You are not average, you have a too small byte count (assuming Java, not that too small isn't good). But, at least, this isn't JAVA 8, where I think it's longer...
— Erik the Outgolfer

@EriktheGolfer Hmm, isn't Java 8 shorter with c->{for(;;)System.out.print(Math.random()<.5?'/':92);} (54 bytes) Or did you mean Java 7 is longer than Java 8? In that case you are indeed correct.
— Kevin Cruijssen

1
53 bytes by switching to System.out.write and replacing '/' with 47
— Benjamin Urquhart

2

JavaScript (Node.js), 59 55 54 bytes

Original Answer

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

-4 bytes thanks to manatwork

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

-1 byte thanks to Conor O'Brien

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

Welcome to the site!
— caird coinheringaahing

No need for braces around a single instruction block; in JavaScript the 0 integer part can be left out; reverse the conditional to use single character operator: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
— manatwork

@manatwork Thanks! Updated.
— 1024x2

You can also write for(;;) instead of while(1)
— Conor O'Brien

Thank you as well. Added.
— 1024x2

1

I guess you can use recursion.

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

I guess you can use recursion.

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

...

stack space is not infinite.
— codaddict

@codaddict so it will timeout.
— Naftali aka Neal

Assuming a considerably high timeout your snippet is not equivalent to the OP's.
— codaddict

1
@codaddict lol the OPs times out as well. it is an infinite loop!
— Naftali aka Neal

1
Yours would create a run time error before the timeout.
— codaddict

1

chopped off one character:

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

then remove the curly braces:

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

another trick, with the same length:

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

1
Due to the algorithm it employs, rand()%2 will result in an alternation of 0s and 1s. Not incredibly random. You'd need to use rand(0,1) or mt_rand()%2 instead.
— primo

1

Perl

This one looks funny for me :

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

(Sorry to be out of subject here. I know this is not PHP)


1

Powershell, 37 bytes

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

unfortunately there seem to be no shorter aliases for Write-Host that don't cause a new line after every char.


1

16-bit x86 assembly code, 10 bytes

I don't remember if this one ended up in the book.

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 bytes

loop {<\ />.pick.print}
  • loop loops forever.
  • <\ /> is a list of the strings \ and /.
  • .pick picks one of the two strings randomly.
  • .print prints that random string.

instead of loop, you can use xx*
— Jo King
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.