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.