10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10 в PHP (або що-небудь ще, з цього питання)


23

Щойно відбулася "жвава" розмова з колегою про кратність наступного твердження BASIC:

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

Це заголовок цієї книги , і вона просто надрукує послідовність символів /та \символів, чергуючи їх двома випадковим чином, у результаті виходить візерунок, подібний до цього:

введіть тут опис зображення

(Зображення запозичене з http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Будучи сприятливим для PHP, ми поцікавились, яким був би най компактніший спосіб написання тієї ж речі в PHP, і придумали таке:

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

chr(47)- /характер, а chr (92) - a \. Тож заява echo chr(47 + 45 * rand(0,1));буде випадково альтернативою між ними, ad nauseum.

Мовою, яку ви обрали, напишіть найкоротшу програму або функцію для виведення нескінченної випадкової послідовності \та /символів, де кожен символ має рівну ймовірність бути обраним.


1
Ви можете втратити {}дужки, але це настільки ж стисло, наскільки ви можете це зробити.
Майкл

Це круто. Який шрифт можна використовувати для отримання подібного зображення?
daniero

1
Це (фото) нагадує мені першу "програму", яку я коли-небудь писав на своєму commodore 64 прямо з керівництва :) ах щасливі дні
Дейл

@daniero Я думаю, що власне шрифт називається Terminal, але я знайшов його в Інтернеті як "Командний рядок Windows" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Який дивний збіг обставин, що у цього репорта
Geza Kerecsenyi

Відповіді:


9

gotoОператор був доданий в PHP з версії 5.3.0 , так що ви можете використовувати той же метод , як ви б в BASIC:

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

18

Оскільки це було перенесено на codegolf ...

PHP 30 байт

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

ÐЦе символ 208, і £це символ 163.

Зразок використання (у вікні Windows):

color 18 & php maze.php

Виробляє щось подібне до:

Найкраще він працює з одношаровим шрифтом, який є точно квадратним (тут я вибрав стандартний шрифт системи 8x8). Щоб повернутися до вашого кольору за замовчуванням, ви можете вводити colorзнову без будь-яких параметрів.


Можна зберегти зайвий байт rand()%2(ніхто не зазначив, як це повинно бути псевдовипадково) - Також не працює на терміналах Unicode (як OSX)
Лі

@Leigh Завдяки своїй реалізації rand()%2буде чергуватися між нулем і одиницею . mt_rand()%2працювало б, однак.
примо

15

Математика 157 байт

Не маючи PETSCII, я прокатав власні "\" та "/".

Тут немає сигари для стислості.

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]

блакитний лабіринт


Це зображення робить оптичну ілюзію сірої точки !!
Чарівний восьминога Урна

8

Brainfuck - 534

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

Мій prng ( звідси ) і великий, і надзвичайно повільний. Можливо, вистачить більш простого LFSR або подібного, але це працює:

введіть тут опис зображення


Я думаю, що це не випадково, оскільки це головний випадок.
Ерік Аутгольфер

Більшість із них покладаються на вбудовані prngs. Так, це буде отримувати те саме щоразу. Можна дозволити посіяти його з клавіатури вартістю декількох додаткових знаків, але це не дуже важливо тут, я думаю.
captncraig

5

C, 39 знаків (38 на MSVC)

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

введіть тут опис зображення Дивіться, як це працює.

На MSVC, ми можемо замінити putchar()з _putch()і зберегти байт, але він не працює в IDEOne.

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


3

printмає повернене значення 1, тому якщо ви використовуєте, ви можете просто загортати весь вираз у while:

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

Ви можете, ймовірно, ще й гольфу.


3

рубін, 27 23 ч

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

$><< "друк на stdout".


2
Ви повинні бути в змозі замінити "/\\"з '\/'. Ruby 1.8 вимагає [rand(2),1]створення символу замість коду ascii.
примо

3

C ++, 45 символів

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

Не збираюсь вигравати жодної нагороди за короткий час, але я вже писав це, коли чув про згадану книгу, тож я просто пограв у неї.

Трюк "путчар" також працює в C ++, приводячи вас до 43, але ви не можете уникнути оголошення типу повернення основним.


3

Я намагаюся створити, використовуючи стиль css, і це робота

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

цей код:

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

Я хотів би запропонувати альтернативний стиль: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Використання -0.25emдля письма-інтервалу здається збігтися краще -3px, який має артефакти з - за неточний ptдо pxконверсії.
примо

3

Лист звичайний - 68

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

Цикл дозволяє як складний, так і простий синтаксис, простий - схожий на прогноз, але назавжди циклічний. Можна скинути do.
coredump


3

Befunge-98 (PyFunge) , 7 байт

? '/,\'

Спробуйте в Інтернеті!

?посилає IP або вліво або вправо, так що або /або \виштовхується перед друком з ,. Після виконання друку '/або \'в неправильному порядку після друку він просто виконує завдання до стеку (ділить або міняє місцями), а потім надсилає неактуальний символ перед повторенням.


Я просто пропонував інше 7-байтове рішення Befunge-98 на відповідь Джо Кінга. Але такий підхід виглядає акуратніше.
Джеймс Холдернес

3

Befunge, 12 9 8 7 байт

Редагувати: Джеймс Холдернес придумав божевільне рішення, яке замість цього використовує три лапки.

?\","/"

Переповнює стек з великою кількістю зайвих символів для кожного символу, але кого турбує, коли ти можеш переграти 1 байт?

Стара версія

"/\"?>,#

(Зверніть увагу на пробіл). Місце для очей, очевидно, не потрібно (дякую Міста Фіггінс)

Спробуйте це в Інтернеті

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

Це починає заповнювати стек з одним додатковим символом для кожного надрукованого символу.


1
схоже, ви можете позбутися зайвого простору, як #це в кінці рядка. Це не послідовна поведінка, але перекладач, який ви використовуєте, дозволяє: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Мені також цікаво, чи зможете ви використати лише одну ", але мої спроби виявилися марними. Оскільки вам потрібна /сторона на одній стороні ", вам доведеться розділити половину часу.
MildlyMilquetoast

@ MistahFiggins Space, безумовно, не потрібно вимагати для будь-якої стандартної реалізації Befunge-93. Код може вийти з ладу в деяких інтерпретаторах Funge-98, де специфікація є більш неоднозначною, але додавання пробілу в цьому випадку все-таки не допоможе - вам знадобиться <після цього, #щоб він працював.
Джеймс Холдернесс

@MistahFiggins Що стосується позбавлення однієї з лапок, ви можете зробити це в Befunge-98, використовуючи 'замість цього. Спробуйте в Інтернеті!
Джеймс Холдернес

2
@JoKing Щойно зрозумів, що насправді ти можеш зробити краще з трьома цитатами! ?\","/"Тільки внизу він переповнює стек набагато швидше, я думаю.
Джеймс Холдернес

2

Не набагато краще. Потрібно php 5.5+ для функції перенаправлення масиву.

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

Ніколи навіть не думав про це, дякую!
Джуді

1
На насправді PHP підтримує індекси для рядків: while(1)echo'/\\'[rand(0,1)];.
манатура

2

Пітона, 68

У категорії "моя мова гасить у цьому" ми отримали Python!

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

Дякую Іву за кілька символів щодо імпорту та choice.


Ну, ви нічого не економите за допомогою "from sys import *" - якщо замість цього написати "import sys, random" та використовувати sys.stdout та random.random, ви заощадите 5 байт.
Іво

Python3: імпорт випадкових, поки 1: print (random.choice ('/ \\'), end = '')
Іво

@Ivo, спасибі, я забув про вибір! Ти можеш зберегти py3. ;)
кабінка

Якщо ви обернете рядок, вам не доведеться уникати зворотної косої риси, тим самим економлячи байт.
Джонатан Фрех

2

> <> , 14 байт

Я сподівався, що зможу обмежити його площею 3 * 3, але не вдалося.

"/\
~x/
o</
 !

Ви можете спробувати тут .


2

Cubix , 12 байт

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

Переглянути в онлайн-перекладачі!

Це відображає на наступну кубичну сітку:

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

Пояснення

Налаштування:

ІС починає прямувати на схід спочатку !. Це команда "пропустити, якщо truthy", яка помилкова, коли в стеці нічого немає, тому жодні команди не пропускаються. "/\"вводить stringmode і додає ці два коди символів до стеку. B!oв основному немає опції тут, лише обертаючи стек.

IP-адреса зараз обертається навколо першого !. Однак зараз у стеку є додатні цілі числа, тому перше "пропускається. Це означає, що /це вже не персонаж, а дзеркало, що посилає IP на північ в основний цикл.

Основна петля:

DКоманда є єдиним джерелом випадковості в Cubix. Він посилає IP у випадковому напрямку. Блокуючи стрілки Південь та Схід, ми переконуємось, що IP має 50% шансів направитись на північ та 50% шансом рушити на Захід.

Якщо він прямує на Захід, стек перевертається. Якщо він рухається на північ, друкується верхній символ.

Це створює випадкову послідовність косої риси, як бажано.


2

PHP, 26 31 байт

вісім три байти коротше, ніж у вас (без пробілів чи дужок) ,
два байти коротше рішення примо (без позначки)
.

PHP 5.4.9 була поточною версією в грудні 1012 року, тому ...

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

потрібно PHP 5.5 або пізнішої версії для буквальної індексації рядків.

Запустіть -rабо спробуйте в Інтернеті .


PHP 5.5 не існував на момент публікації виклику, але все одно мати +1. Також спробуйте rand()&1скласти PHP для Windows. Ви можете бути здивовані.
прим


2

PowerShell , 108 90 86 54 53 37 36 байт

for(){Write-Host "\/"[(Random 2)]-n}

Спробуйте в Інтернеті!


1
Ласкаво просимо до Code Golf. Поради щодо гольфу в PowerShell
mazzy


2
forтакож робить while трохи коротше
mazzy

1
ви можете більше ... точніше, менше :)
mazzy


2

Java 8, 60 59 54 53 байт

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

-1 байт завдяки @BenjaminUrquhart заміною printна write, так '/'може бути 47.

Пояснення:

Спробуйте в Інтернеті (тайм-аут через 60 сек).

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. Байти. Ого.
Ерік Аутгольфер

@EriktheGolfer Hehe. Я навіть не помічав, що в середньому я байт. Зазвичай я просто припускаю, що Java є одним з найвищих байтів, лише трохи конкуруючий з BrainFuck або C # іноді. xD (PS: Я навіть переграв його до 59: P)
Кевін Кройсейсен

Ви не середні, у вас занадто малий кількість байтів (якщо припустити, що Java не надто малий, це не добре). Але, принаймні, це не JAVA 8 , де я вважаю, що це довше ...
Ерік Атгольфер

@EriktheGolfer Хм, чи Java 8 не коротша c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 байти ) Або ви мали на увазі, що Java 7 довший, ніж Java 8? У цьому випадку ви справді правильні.
Kevin Cruijssen

1
53 байти шляхом переходу на System.out.writeта заміни '/'на47
Бенджамін Уркхарт

2

JavaScript (Node.js) , 59 55 54 байт

Оригінальний відповідь

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

-4 байти завдяки маневреній роботі

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

-1 байт завдяки Conor O'Brien

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

Ласкаво просимо на сайт!
caird coinheringaahing

Немає необхідності в дужках навколо одного блоку інструкцій; у JavaScript 0 ціла частина може бути залишена; зворотний умовний використовувати одного оператор символів: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
манатура

@manatwork Дякую! Оновлено.
1024х2

Ви також можете написати for(;;)замістьwhile(1)
Conor O'Brien

Дякую і вам. Додано.
1024х2

1

Я думаю, ви можете використовувати рекурсію.

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

Я думаю, ви можете використовувати рекурсію.

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

...

простір стека не є нескінченним.
кодифікація

@codaddict, тому він закінчиться.
Naftali aka Neal

Якщо припустити значно більший час очікування, ваш фрагмент не еквівалентний ОП.
кодифікація

1
@codaddict lol ОП також, також. це нескінченна петля!
Naftali aka Neal

1
Ваші створили б помилку в часі запуску до часу очікування.
кодифікація

1

відрізаний один символ:

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

потім зніміть фігурні брекети:

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

ще одна хитрість, з тією ж довжиною:

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

1
Завдяки алгоритму, який використовується, rand()%2призведе до чергування 0s і 1s. Не неймовірно випадковий. Вам потрібно буде використовувати rand(0,1)або mt_rand()%2замість цього.
примо

1

Perl

Це виглядає для мене смішно:

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

(Вибачте, що тут немає теми. Я знаю, що це не PHP)


1

Powershell, 37 байт

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

на жаль, схоже, немає коротших псевдонімів Write-Host, які не спричиняють новий рядок після кожної позначки.


1

16-бітний код складання x86, 10 байт

Я не пам’ятаю, чи потрапив цей у книгу.

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 байти

loop {<\ />.pick.print}
  • loop петлі назавжди.
  • <\ />- це список рядків \і /.
  • .pick вибирає одну з двох рядків випадковим чином.
  • .print друкує цей випадковий рядок.

замість циклу ви можете використовуватиxx*
Jo King
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.