10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10 in PHP (oder was auch immer)


23

Hatte gerade ein "temperamentvolles" Gespräch mit einem Kollegen über die Prägnanz der folgenden BASIC-Anweisung:

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

Es ist der Titel dieses Buches , und es wird einfach eine Folge von /und \Zeichen gedruckt , die sich nach dem Zufallsprinzip abwechseln und zu einem ähnlichen Muster führen:

Bildbeschreibung hier eingeben

(Bild von http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ ausgeliehen )

Wir waren von PHP-Neigung und fragten uns, wie man das gleiche in PHP am kompaktesten schreiben könnte.

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

chr(47)ist ein /Zeichen und chr (92) ist a \. Die Aussage echo chr(47 + 45 * rand(0,1));wird also nach dem Zufallsprinzip ad nauseum zwischen den beiden Alternativen wechseln.

Schreiben Sie in einer Sprache Ihrer Wahl das kürzeste Programm oder die kürzeste Funktion, um eine unendliche Zufallsfolge von \und /Zeichen auszugeben , wobei jedes Zeichen die gleiche Wahrscheinlichkeit hat, ausgewählt zu werden.


1
Sie können die {}Zahnspange verlieren , aber das ist ungefähr so ​​kurz, wie Sie es schaffen können.
Michael

Das ist cool. Mit welcher Schriftart kann ein ähnliches Bild erstellt werden?
Daniero

1
Dies (Bild) erinnert mich an das erste "Programm", das ich jemals direkt aus dem Handbuch auf meinem Commodore 64 geschrieben habe :) ah happy days
Dale

@daniero Ich denke, die eigentliche Schriftart heißt Terminal, aber ich fand sie online als "Windows-Eingabeaufforderung" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Was für ein seltsamer Zufall, dass dieses Code Golf Repo auf Github genau dieselbe Herausforderung hat ... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Antworten:


9

Der gotoOperator wurde PHP ab Version 5.3.0 hinzugefügt, sodass Sie dieselbe Methode wie in BASIC verwenden können:

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

18

Da dies zu Codegolf migriert wurde ...

PHP 30 Bytes

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

Das Ðist das Zeichen 208 und das £ist das Zeichen 163.

Anwendungsbeispiel (auf einer Windows-Box):

color 18 & php maze.php

Erzeugt etwas Ähnliches wie:

Es funktioniert am besten mit einer Monospace-Schriftart, die genau quadratisch ist (hier habe ich die Standardsystemschrift 8x8 gewählt). Um zu Ihrer Standardfarbe zurückzukehren, können Sie colorerneut ohne Parameter eingeben.


Kann ein zusätzliches Byte speichern mit rand()%2(niemand hat angegeben, wie pseudozufällig es sein muss) - Funktioniert auch nicht auf Unicode-Terminals (wie OSX)
Leigh

@Leigh Wechselt aufgrund seiner Implementierung rand()%2zwischen null und eins. mt_rand()%2würde aber funktionieren.
Primo

15

Mathematica 157 Bytes

Ohne PETSCII habe ich meine eigenen "\" und "/" gerollt.

Keine Zigarre zur Abkürzung hier.

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]

blaues Labyrinth


Dieses Bild tut die optische Täuschung des grauen Punktes !!
Magic Octopus Urn

8

Brainfuck - 534

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

Mein prng (von hier ) ist groß und extrem langsam. Vielleicht würde ein einfacheres LFSR oder ähnliches ausreichen, aber das funktioniert:

Bildbeschreibung hier eingeben


Ich denke jedoch, dass dies kein Zufall ist, da es sich um einen Brainfuck handelt.
Erik der Outgolfer

die meisten von ihnen setzen auf eingebaute drucker. Ja, dies wird jedes Mal gleich ausgegeben. Es könnte möglich sein, es für ein paar zusätzliche Zeichen von der Tastatur zu entfernen, aber das ist hier nicht der eigentliche Punkt, denke ich.
Captncraig

5

C, 39 Zeichen (38 bei MSVC)

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

Bildbeschreibung hier eingeben Sehen Sie es laufen.

Auf MSVC, können wir ersetzen putchar()mit _putch()und speichern ein Byte, aber es funktioniert nicht in IDEOne.

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


3

printhat einen Rückgabewert von 1. Wenn Sie also diesen Wert verwenden, können Sie den gesamten Ausdruck in Folgendes einschließen while:

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

Sie können wahrscheinlich auch weiter Golf spielen.


3

Rubin, 27 23 Zeichen

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

$><< ist 'nach stdout drucken'.


2
Sie sollten in der Lage sein, "/\\"mit zu ersetzen '\/'. In Ruby 1.8 muss [rand(2),1]das Zeichen anstelle des ASCII-Codes erzeugt werden.
Primo

3

C ++, 45 Zeichen

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

Ich werde keine Preise für Kurzentschlossenheit gewinnen, aber ich hatte dies bereits geschrieben, als ich von dem erwähnten Buch hörte, also habe ich einfach Golf gespielt.

Der Putchar-Trick funktioniert auch in C ++ und bringt Sie auf 43 zurück, aber Sie können es nicht vermeiden, den Rückgabetyp für main zu deklarieren.


3

Ich versuche, mit CSS-Stil zu erstellen, und es funktioniert

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

dieser PHP-Code:

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

Ich möchte eine alternative Art vorzuschlagen: Die font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Verwendung -0.25emfür die Buchstaben-Abstand scheint besser zusammenpassen als -3px, die Artefakte aufgrund eines ungenauen hat ptzu pxKonvertierung.
Primo

3

Common Lisp - 68

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

Loop erlaubt sowohl eine komplexe als auch eine einfache Syntax, wobei die einfache wie eine Prognose ist, sich aber für immer in einer Schleife befindet. Sie können die fallen lassen do.
Coredump

3

05AB1E , 7 Bytes

["/\"Ω?

Probieren Sie es 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 Bytes

? '/,\'

Probieren Sie es online!

Der ?sendet die IP entweder links oder rechts, also entweder /oder \wird vor dem Drucken mit gedrückt ,. Wenn das '/oder \'nach dem Drucken in der falschen Reihenfolge ausgeführt wird, werden nur die Vorgänge im Stapel ausgeführt (geteilt oder vertauscht), und vor dem Wiederholen wird ein irrelevantes Zeichen verschoben.


Ich habe nur eine andere 7-Byte-Befunge-98-Lösung für Jo Kings Antwort vorgeschlagen. Aber dieser Ansatz sieht besser aus.
James Holderness

3

Befunge, 12 9 8 7 Bytes

Bearbeiten: James Holderness fand eine verrückte Lösung, die stattdessen drei Anführungszeichen verwendet.

?\","/"

Überläuft der Stapel mit vielen überschüssigen Zeichen für jedes Symbol, aber wen interessiert es, wann Sie dieses 1 Byte Golf spielen können?

Alte Version

"/\"?>,#

(Beachten Sie das nachgestellte Leerzeichen) Nachgestelltes Leerzeichen wird anscheinend nicht benötigt (danke Mistah Figgins)

Probieren Sie es 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

Dies füllt den Stapel mit einem zusätzlichen Symbol für jedes gedruckte Symbol.


1
Sieht so aus, als könnten Sie den zusätzlichen Platz loswerden, da er #sich am Ende einer Zeile befindet. Es ist kein konsistentes Verhalten, aber der von Ihnen verwendete Interpreter erlaubt es: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Ich frage mich auch, ob Sie nur einen verwenden können ", aber meine Versuche waren erfolglos. Da Sie eine /auf der einen Seite benötigen ", müssen Sie die Hälfte der Zeit aufteilen.
MildlyMilquetoast

@MistahFiggins Space sollte definitiv nicht für eine Befunge-93-Standardimplementierung benötigt werden. Der Code kann in einigen Funge-98 Dolmetscher scheitern, wo die Spezifikation mehr eindeutig ist, sondern einen Raum Zugabe würde keine Hilfe in diesen Fällen sowieso - Sie würden eine benötigen <nach dem , #damit es funktioniert.
James Holderness

@MistahFiggins Um eines der Zitate loszuwerden, können Sie dies in Befunge-98 tun, indem Sie 'stattdessen verwenden. Probieren Sie es online!
James Holderness

2
@JoKing Hab gerade gemerkt, dass du mit drei Zitaten noch besser abschneiden kannst! ?\","/"Nur, dass es den Stapel viel schneller überläuft, denke ich.
James Holderness

2

Nicht viel besser. Benötigt PHP 5.5+ für die Array-Dereferenzierung.

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

Daran habe ich noch nie gedacht, danke!
Judy

1
Eigentlich unterstützt PHP Indizes für Strings: while(1)echo'/\\'[rand(0,1)];.
Manatwork

2

Python, 68

In der Kategorie "Meine Sprache ist scheiße" haben wir Python!

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

Danke an Ivo für ein paar Zeichen bei Import und choice.


Nun, Sie sparen nichts mit 'from sys import *' - wenn Sie stattdessen 'import sys, random' schreiben und sys.stdout und random.random verwenden, sparen Sie 5 Bytes.
Ivo

Python3: Zufall importieren, während 1: Drucken (random.choice ('/ \\'), Ende = '')
Ivo

@ Ivo, danke, ich habe die Wahl vergessen! Sie können py3 jedoch behalten. ;)
Stand

Wenn Sie Ihren String umkehren, müssen Sie den Backslash nicht umgehen und sparen so ein Byte.
Jonathan Frech

2

> <> , 14 Bytes

Ich hatte gehofft, ich könnte es auf ein 3 * 3-Quadrat beschränken, aber es gelang mir nicht.

"/\
~x/
o</
 !

Sie können es hier ausprobieren .


2

Cubix , 12 Bytes

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

Im Online-Dolmetscher ansehen!

Dies wird dem folgenden Würfelnetz zugeordnet:

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

Erläuterung

Installieren:

Die IP beginnt am ersten Tag in östlicher Richtung !. Dies ist der Befehl "Skip If Truthy", der "False" ist, wenn sich nichts auf dem Stapel befindet, sodass keine Befehle übersprungen werden. "/\"Ruft den String-Modus auf und hängt diese beiden Zeichencodes an den Stack an. B!oist hier meistens ein No-Op, nur das Umkehren des Stapels.

Die IP kehrt nun zur ersten zurück !. Es sind jedoch jetzt positive ganze Zahlen auf dem Stapel, sodass die erste "übersprungen wird. Das heißt, es /ist kein Charakter mehr, sondern ein Spiegel, der die IP nach Norden in die Hauptschleife sendet.

Hauptschleife:

Das D Befehl ist die einzige Zufallsquelle in Cubix. Es sendet die IP in eine zufällige Richtung. Indem wir Süd und Ost mit Pfeilen blockieren, stellen wir sicher, dass die IP eine 50% ige Chance hat, nach Norden und eine 50% ige Chance, nach Westen zu fahren.

Wenn es nach Westen geht, wird der Stapel umgekehrt. Wenn es nach Norden zeigt, wird das oberste Zeichen gedruckt.

Dadurch wird die gewünschte zufällige Folge von Schrägstrichen erstellt.


2

PHP, 26 31 Bytes

acht drei Bytes kürzer als deine (ohne Leerzeichen oder geschweifte Klammern) ,
zwei Bytes kürzer als die Lösung von primo (ohne das Tag)
.

PHP 5.4.9 war die aktuelle Version im Dezember 1012, also ...

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

erfordert PHP 5.5 oder höher für die Indexierung von Literalstrings.

Laufen Sie mit -roder versuchen Sie es online .


PHP 5.5 existierte zum Zeitpunkt des Challange-Postings noch nicht, hat aber trotzdem eine +1. Probiere auchrand()&1 einen PHP-Build für Windows aus. Sie könnten überrascht sein.
Primo



2

Java 8, 60 59 54 53 Bytes

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

-1 Byte dank @BenjaminUrquhart durch Ersetzen printdurch write, so '/'kann es sein 47.

Erläuterung:

Probieren Sie es online aus (Timeout nach 60 Sekunden).

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 der Outgolfer

@EriktheGolfer Hehe. Ich hatte nicht einmal bemerkt, dass ich durchschnittlich in Bytes bin. Normalerweise gehe ich nur davon aus, dass Java eine der höchsten Bytezahlen ist, die mit BrainFuck oder C # manchmal nur geringfügig konkurrierbar ist. xD (PS: Ich habe sogar bis 59: P gespielt)
Kevin Cruijssen

Sie sind kein Durchschnitt, Sie haben eine zu kleine Byteanzahl (vorausgesetzt, Java, nicht zu klein, ist nicht gut). Aber zumindest ist dies nicht JAVA 8 , wo ich denke, es ist länger ...
Erik the Outgolfer

@EriktheGolfer Hmm, ist Java 8 nicht kürzer mit c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 Bytes ) oder meintest du Java 7 ist länger als Java 8? In diesem Fall sind Sie in der Tat richtig.
Kevin Cruijssen

1
53 Bytes durch Umschalten auf System.out.writeund Ersetzen '/'durch47
Benjamin Urquhart

2

JavaScript (Node.js) , 59 55 54 Byte

Ursprüngliche Antwort

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

-4 Bytes dank Handarbeit

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

-1 Byte danke an Conor O'Brien

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

Willkommen auf der Seite!
Caird Coinheringaahing

Keine geschweiften Klammern um einen einzelnen Anweisungsblock; In JavaScript kann der 0-Integer-Teil weggelassen werden. umkehren die bedingte einzelnes Zeichen Operator zu verwenden: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
Manatwork

@manatwork Danke! Aktualisiert.
1024 x 2,

Sie können auch for(;;)anstelle vonwhile(1)
Conor O'Brien

Danke auch. Hinzugefügt.
1024 x 2,

1

Ich denke, Sie können die Rekursion verwenden.

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

Ich denke, Sie können die Rekursion verwenden.

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

...

Stapelplatz ist nicht unendlich.
Codaddict

@codaddict so wird es eine Zeitüberschreitung geben.
Neal

Unter der Annahme eines beträchtlich hohen Timeouts entspricht Ihr Snippet nicht den OPs.
Codaddict

1
@codaddict lol die OPs laufen auch mal aus. es ist eine unendliche Schleife!
Neal

1
Ihre würde einen Laufzeitfehler vor dem Timeout erstellen.
Codaddict

1

ein Zeichen abgeschnitten:

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

dann entfernen Sie die geschweiften Klammern:

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

Ein weiterer Trick mit der gleichen Länge:

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

1
Aufgrund des verwendeten Algorithmus rand()%2führt dies zu einem Wechsel von 0s und 1s. Nicht unglaublich zufällig. Sie müssten rand(0,1)oder mt_rand()%2stattdessen verwenden.
Primo

1

Perl

Dieser sieht lustig für mich aus:

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

(Es tut mir leid, dass ich hier kein Thema habe. Ich weiß, dass dies kein PHP ist.)


1

Powershell, 37 Bytes

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

Leider scheint es keine kürzeren Aliase für Write-Host zu geben, die nicht nach jedem Zeichen eine neue Zeile verursachen.


1

16-Bit-x86-Assemblycode, 10 Byte

Ich erinnere mich nicht, ob dieser in dem Buch gelandet ist.

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 Schleifen für immer.
  • <\ />ist eine Liste der Zeichenfolgen \und/ .
  • .pick wählt zufällig eine der beiden Saiten.
  • .print druckt diese zufällige Zeichenfolge.

anstelle der Schleife können Sie verwendenxx*
Jo King
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.