10 IN CHR $ (205,5 + RND (1)); : GOTO 10 trong PHP (hoặc bất cứ điều gì khác, cho vấn đề đó)


23

Vừa có một cuộc trò chuyện 'sôi nổi' với một đồng nghiệp về sự cô đọng của tuyên bố BASIC sau đây:

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

Đó là tiêu đề của cuốn sách này , và sẽ chỉ in một chuỗi các ký tự /\ký tự, xen kẽ giữa hai cuốn sách một cách ngẫu nhiên, dẫn đến một mô hình tương tự như sau:

nhập mô tả hình ảnh ở đây

(Hình ảnh mượn từ http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ )

Là một người thông thạo PHP, chúng tôi đã tự hỏi cách viết gọn nhất của điều tương tự trong PHP sẽ là gì và đã đưa ra điều này:

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

chr(47)là một /nhân vật, và chr (92) là a \. Vì vậy, tuyên bố echo chr(47 + 45 * rand(0,1));sẽ thay thế ngẫu nhiên giữa hai, quảng cáo.

Trong ngôn ngữ bạn chọn, hãy viết chương trình hoặc hàm ngắn nhất để đưa ra một chuỗi ký tự \/ký tự ngẫu nhiên vô hạn , trong đó mỗi ký tự có xác suất được chọn bằng nhau.


1
Bạn có thể mất {}niềng răng, nhưng đó là ngắn gọn như bạn có thể làm cho nó.
Michael

Điều này thật tuyệt Phông chữ nào có thể được sử dụng để có được một hình ảnh tương tự?
daniero

1
Điều này (hình ảnh) làm tôi nhớ đến "chương trình" đầu tiên tôi từng viết trên trang 64 của tôi ra khỏi hướng dẫn sử dụng :) ah ngày hạnh phúc
Dale

@daniero Tôi nghĩ rằng kiểu chữ thực tế được gọi là Terminal, nhưng tôi đã tìm thấy nó trực tuyến dưới dạng "Windows Command Prompt" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Thật là một sự trùng hợp kỳ lạ khi repo Code Golf này trên Github xảy ra có cùng một thử thách ... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Câu trả lời:


9

Các gotonhà điều hành đã được thêm vào PHP từ phiên bản 5.3.0, do đó bạn có thể sử dụng cùng một phương pháp như bạn làm trong BASIC:

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

18

Vì điều này đã được di chuyển sang codegolf ...

PHP 30 byte

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

Các Ðlà nhân vật 208, và £là nhân vật 163.

Sử dụng mẫu (trên hộp Windows):

color 18 & php maze.php

Sản xuất một cái gì đó tương tự như:

Nó hoạt động tốt nhất với phông chữ đơn cách chính xác là hình vuông (ở đây tôi đã chọn phông chữ hệ thống tiêu chuẩn 8x8). Để quay lại màu mặc định của bạn, bạn có thể nhập colorlại mà không có bất kỳ tham số nào.


Có thể lưu thêm một byte với rand()%2(không ai nói nó phải ngẫu nhiên như thế nào ) - Cũng không hoạt động trên các thiết bị đầu cuối Unicode (như OSX)
Leigh

@Leigh Do triển khai, rand()%2sẽ xen kẽ giữa không và một. mt_rand()%2sẽ làm việc, tuy nhiên.
Primo

15

Toán học 157 byte

Thiếu PETSCII, tôi tự lăn "\" và "/".

Không có xì gà cho ngắn gọn ở đây.

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]

mê cung màu xanh


Hình ảnh này không có ảo ảnh quang chấm màu xám !!
Bạch tuộc ma thuật Urn

8

Brainfuck - 534

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

Prng của tôi (từ đây ) vừa lớn vừa cực kỳ chậm. Có lẽ một LFSR đơn giản hơn hoặc tương tự sẽ đủ, nhưng điều này hoạt động:

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng điều này không phải là ngẫu nhiên, mặc dù, vì đây là brainfuck.
Erik the Outgolfer

hầu hết trong số này đang dựa vào prngs tích hợp. Vâng, điều này sẽ xuất ra như vậy mỗi lần. Có thể cho phép nó được gieo từ bàn phím với chi phí của một vài ký tự phụ, nhưng đó không thực sự là vấn đề ở đây, tôi nghĩ vậy.
captncraig

5

C, 39 ký tự (38 trên MSVC)

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

nhập mô tả hình ảnh ở đây Thấy nó chạy.

Trên MSVC, chúng ta có thể thay thế putchar()với _putch()và tiết kiệm một byte, nhưng nó không hoạt động trong IDEOne.

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


3

printcó giá trị trả về là 1, vì vậy nếu bạn sử dụng, bạn chỉ có thể gói toàn bộ biểu thức trong while:

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

Bạn có thể có thể chơi golf hơn nữa.


3

hồng ngọc, 27 23 ký tự

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

$><< là 'in ra thiết bị xuất chuẩn'.


2
Bạn sẽ có thể thay thế "/\\"bằng '\/'. Ruby 1.8 yêu cầu [rand(2),1]tạo ra ký tự thay vì mã ascii.
Primo

3

C ++, 45 ký tự

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

Sẽ không giành được bất kỳ giải thưởng nào cho sự ngắn gọn, nhưng tôi đã viết nó khi tôi nghe về cuốn sách được đề cập, vì vậy tôi chỉ đánh golf nó.

Thủ thuật putar cũng hoạt động trong C ++, giúp bạn giảm xuống còn 43, nhưng bạn không thể tránh việc khai báo kiểu trả về trên chính.


3

tôi thử tạo bằng cách sử dụng kiểu css và nó hoạt động

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

mã php này:

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

Tôi muốn đề xuất một kiểu thay thế: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Sử dụng -0.25emcho khoảng cách chữ dường như khớp với tốt hơn so với -3px, có các tạo tác do không chính xác ptđể pxchuyển đổi.
primo

3

Lisp thường gặp - 68

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

Vòng lặp cho phép cả cú pháp phức tạp và cú pháp đơn giản, cú pháp đơn giản giống như một tiên lượng, nhưng lặp đi lặp lại mãi mãi. Bạn có thể thả do.
coredump

3

05AB1E , 7 byte

["/\"Ω?

Hãy thử trực tuyến!

["/\"Ω?  - 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 byte

? '/,\'

Hãy thử trực tuyến!

các ?gửi IP hoặc sang trái hoặc phải, vì vậy một trong hai /hoặc \bị đẩy trước khi in với ,. Khi thực hiện '/hoặc \'theo thứ tự sai sau khi in, nó chỉ thực hiện mọi thứ với ngăn xếp (chia hoặc hoán đổi), và sau đó đẩy một ký tự không liên quan trước khi lặp lại.


Tôi chỉ đề xuất một giải pháp Befunge-98 7 byte khác nhau cho câu trả lời của Jo King. Nhưng cách tiếp cận này trông gọn gàng hơn.
James Holdiness

3

Befunge, 12 9 8 7 byte

Chỉnh sửa: James Holdiness đã tìm ra một giải pháp điên rồ sử dụng ba trích dẫn thay thế.

?\","/"

Tràn đầy ngăn xếp với rất nhiều ký tự thừa cho mỗi ký hiệu, nhưng ai quan tâm khi bạn có thể chơi golf 1 byte đó?

Phiên bản cũ

"/\"?>,#

(Lưu ý không gian dấu) Không gian lưu trữ rõ ràng là không cần thiết (cảm ơn Mistah Figgins)

Dùng thử trực tuyến

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

Điều này không bắt đầu để lấp đầy ngăn xếp, với một biểu tượng thêm cho mỗi biểu tượng được in.


1
có vẻ như bạn có thể thoát khỏi không gian thừa, vì #ở cuối dòng. Đó không phải là hành vi nhất quán, nhưng trình thông dịch bạn đang sử dụng cho phép: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Tôi cũng tự hỏi nếu bạn chỉ có thể sử dụng một ", nhưng những nỗ lực của tôi đã vô ích. Bởi vì bạn cần một /bên ", bạn sẽ phải chia một nửa thời gian.
MildlyMilquetoast

@MistahFiggins Không gian chắc chắn không cần thiết cho bất kỳ triển khai Befunge-93 tiêu chuẩn nào. Mã có thể thất bại trong một số trình thông dịch Funge-98, trong đó thông số kỹ thuật mơ hồ hơn, nhưng việc thêm một khoảng trắng sẽ không giúp ích gì trong những trường hợp đó - dù sao bạn cũng cần một cái <sau #để nó hoạt động.
James Holdiness

@MistahFiggins Để loại bỏ một trong những trích dẫn, bạn có thể thực hiện điều đó trong Befunge-98 bằng cách sử dụng 'thay thế. Hãy thử trực tuyến!
James Holdiness

2
@JoKing Chỉ cần nhận ra rằng bạn thực sự có thể làm tốt hơn với ba dấu ngoặc kép! ?\","/"Chỉ có nhược điểm là nó sẽ tràn vào ngăn xếp nhanh hơn tôi nghĩ.
James Holdiness

2

Không tốt hơn. Cần php 5.5+ cho tính năng hội nghị mảng.

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

Thậm chí không bao giờ nghĩ về điều đó, cảm ơn!
Judy

1
Trên thực tế PHP hỗ trợ đăng ký cho chuỗi : while(1)echo'/\\'[rand(0,1)];.
thao tác

2

Con trăn, 68

Trong danh mục "ngôn ngữ của tôi hút ở đây", chúng tôi đã có Python!

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

Cảm ơn Ivo cho một vài ký tự về nhập khẩu và choice.


Chà, bạn không lưu bất cứ thứ gì với 'từ nhập sys *' - thay vào đó, nếu bạn viết 'nhập sys, ngẫu nhiên' và sử dụng sys.stdout và Random.random, bạn sẽ tiết kiệm được 5 byte.
Ivo

Python3: nhập ngẫu nhiên trong khi 1: in (Random.choice ('/ \\'), end = '')
Ivo

@Ivo, Cảm ơn, tôi quên mất sự lựa chọn! Bạn có thể giữ py3, mặc dù. ;)
gian hàng

Nếu bạn đảo ngược chuỗi của mình, bạn không phải thoát dấu gạch chéo ngược, do đó tiết kiệm được một byte.
Jonathan Frech

2

> <> , 14 byte

Tôi đã hy vọng tôi có thể giới hạn nó ở một hình vuông 3 * 3 nhưng không thành công.

"/\
~x/
o</
 !

Bạn có thể thử nó ở đây .


2

Hình khối , 12 byte

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

Xem trong phiên dịch trực tuyến!

Điều này ánh xạ ra mạng lưới khối sau:

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

Giải trình

Thiết lập:

IP bắt đầu đi về phía đông lúc đầu !. Đây là lệnh 'bỏ qua nếu trung thực', sai khi không có gì trên ngăn xếp, vì vậy không có lệnh nào bị bỏ qua. "/\"nhập chuỗi mã và nối hai mã ký tự này vào ngăn xếp. B!ochủ yếu là không có ở đây, chỉ đảo ngược ngăn xếp.

IP bây giờ lặp lại xung quanh đầu tiên !. Tuy nhiên, hiện có các số nguyên dương trên stack, vì vậy đầu tiên "được bỏ qua. Điều này có nghĩa /không còn là một ký tự, mà là một tấm gương, gửi IP về phía bắc vào vòng lặp chính.

Vòng lặp chính:

Các Dlệnh là nguồn gốc duy nhất của ngẫu nhiên trong Cubix. Nó gửi IP theo hướng ngẫu nhiên. Bằng cách chặn Nam và Đông bằng mũi tên, chúng tôi đảm bảo IP có 50% cơ hội hướng về phía Bắc và 50% cơ hội đi về phía Tây.

Nếu nó đi về hướng Tây, ngăn xếp bị đảo ngược. Nếu nó đi về hướng Bắc, ký tự trên cùng được in.

Điều này tạo ra chuỗi ngẫu nhiên của dấu gạch chéo, như mong muốn.


2

PHP, 26 31 byte

tám ba byte ngắn hơn của bạn (không có khoảng trắng hoặc dấu ngoặc) ,
ngắn hơn hai byte so với giải pháp primo (không có thẻ)
.

PHP 5.4.9 là phiên bản hiện tại vào tháng 12 năm 1012, vì vậy ...

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

yêu cầu PHP 5.5 trở lên để lập chỉ mục chuỗi bằng chữ.

Chạy với -rhoặc thử trực tuyến .


PHP 5.5 không tồn tại tại thời điểm đăng bài, nhưng dù sao cũng có +1. Ngoài ra, hãy thử rand()&1xây dựng PHP cho Windows. Bạn có thể ngạc nhiên.
primo


2

2

Java 8, 60 59 54 53 byte

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

-1 byte nhờ @BenjaminUrquhart bằng cách thay thế printbằng write, vì vậy '/'có thể 47.

Giải trình:

Dùng thử trực tuyến (thời gian chờ sau 60 giây).

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. byte. Ồ
Erik the Outgolfer

@EriktheGolfer Hehe. Tôi thậm chí đã không nhận thấy tôi về trung bình tính theo byte. Thông thường tôi chỉ cho rằng Java là một trong những số byte cao nhất, đôi khi chỉ hơi cạnh tranh với BrainFuck hoặc C #. xD (PS: Tôi thậm chí đã đánh gôn tới 59: P)
Kevin Cruijssen

Bạn không phải là trung bình, bạn có số byte quá nhỏ (giả sử Java, không quá nhỏ không tốt). Nhưng, ít nhất, đây không phải là JAVA 8 , nơi tôi nghĩ nó còn dài hơn ...
Erik the Outgolfer 4/10/2016

@EriktheGolfer Hmm, không phải Java 8 ngắn hơn với c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 byte ) Hay ý bạn là Java 7 dài hơn Java 8? Trong trường hợp đó bạn thực sự đúng.
Kevin Cruijssen

1
53 byte bằng cách chuyển sang System.out.writevà thay thế '/'bằng47
Benjamin Urquhart

2

JavaScript (Node.js) , 59 55 54 byte

Câu trả lời gốc

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

-4 byte nhờ thao tác

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

-1 byte nhờ Conor O'Brien

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

Chào mừng đến với trang web!
caird coinheringaahing

Không cần niềng răng xung quanh một khối lệnh; trong JavaScript, phần nguyên 0 có thể bị bỏ đi; đảo ngược điều kiện để sử dụng toán tử ký tự đơn : while(1)process.stdout.write(Math.random()<.5?"/":"\\").
manatwork 21/03 '

@manatwork Cảm ơn! Cập nhật.
1024x2

Bạn cũng có thể viết for(;;)thay vìwhile(1)
Conor O'Brien

Tôi cung cảm ơn bạn. Thêm.
1024x2

1

Tôi đoán bạn có thể sử dụng đệ quy.

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

Tôi đoán bạn có thể sử dụng đệ quy.

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

...

không gian ngăn xếp không phải là vô hạn.
codaddict

@codaddict vì vậy nó sẽ hết thời gian.
Neal

Giả sử thời gian chờ cao đáng kể đoạn trích của bạn không tương đương với OP.
codaddict

1
@codaddict lol các OP cũng hết thời gian. nó là một vòng lặp vô tận !
Neal

1
Bạn sẽ tạo ra một lỗi thời gian chạy trước khi hết thời gian.
codaddict

1

băm nhỏ một nhân vật:

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

sau đó loại bỏ các dấu ngoặc nhọn:

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

một mẹo khác, có cùng độ dài:

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

1
Do thuật toán mà nó sử dụng, rand()%2sẽ dẫn đến sự xen kẽ của 0s và 1s. Không phải ngẫu nhiên vô cùng. Bạn cần sử dụng rand(0,1)hoặc mt_rand()%2thay vào đó.
Primo

1

Perl

Điều này có vẻ buồn cười đối với tôi:

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

(Xin lỗi vì đã hết chủ đề ở đây. Tôi biết đây không phải là PHP)


1

Powershell, 37 byte

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

thật không may, dường như không có bí danh nào ngắn hơn cho Write-Host mà không gây ra một dòng mới sau mỗi char.


1

Mã lắp ráp x86 16 bit, 10 byte

Tôi không nhớ nếu cái này kết thúc trong cuốn sách.

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 byte

loop {<\ />.pick.print}
  • loop vòng lặp mãi mãi.
  • <\ />là một danh sách các chuỗi \/.
  • .pick chọn một trong hai chuỗi ngẫu nhiên.
  • .print in chuỗi ngẫu nhiên đó.

thay vì vòng lặp, bạn có thể sử dụngxx*
Jo King
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.