10张CHR $(205.5 + RND(1)); :使用PHP转到GOTO 10(或其他任何方式)


23

刚刚与同事进行了一次“振奋”的对话,以讨论以下BASIC语句的简洁性:

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

这是本书的标题,将简单地打印/\字符序列,在两者之间随机交替,从而产生类似于以下内容的模式:

enter image description here

(图片来自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)是一个\。因此,该声明echo chr(47 + 45 * rand(0,1));将随机地在两者之间交替出现,即引起恶心。

用您选择的语言编写最短的程序或函数,以输出一个无限随机的字符\/字符序列,其中每个字符被选择的可能性均等。


1
您可能会丢失{}括号,但这与您可以做到的一样简洁。
迈克尔

这很酷。什么字体可以用来获得相似的图像?
daniero

1
这个(图片)让我想起了我曾经直接在手册64上写在我的准将64上的第一个“程序” :)啊,快乐的日子
Dale

@daniero我认为实际的字体称为Terminal,但我在网上找到它作为“ Windows Command Prompt” codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford,

Github上的此Code Golf回购正好遇到了完全相同的挑战,这真是一个奇怪的巧合... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Answers:


9

goto操作符是从5.3.0版添加到PHP的,因此您可以使用与BASIC中相同的方法:

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

18

由于此已迁移到代码高尔夫...

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会工作,但是。
2013年

15

Mathematica 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]

blue maze


该图像会产生灰点错觉!
魔术章鱼缸

8

脑干-534

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

我的prng(从这里开始)既很大又非常慢。也许更简单的LFSR或类似的版本就足够了,但这可行:

enter image description here


但我认为这不是随机的,因为这很容易。
暴民埃里克

其中大多数依赖于内置的prng。是的,每次都会输出相同的结果。可以允许它从键盘上以几个额外的字符的价格进行播种,但是我认为这并不是重点。
captncraig

5

C,39个字符(MSVC上为38个字符)

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

enter image description here 看到它运行。

在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]}

$><< 是“打印到标准输出”。


2
你应该能够取代"/\\"'\/'。Ruby 1.8需要[rand(2),1]生成字符而不是ascii代码。
primo 2012年

3

C ++,45个字符

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

短期内不会赢得任何奖项,但是当我听说这本书时已经写了这本书,所以我只是打了高尔夫球。

putchar技巧也可以在C ++中使用,使您降至43岁,但您无法避免在main上声明返回类型。


3

我尝试使用CSS样式进行创建,并且可以正常工作

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

这个PHP代码:

<?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,其中有文物由于不精确ptpx转换。
primo 2012年

3

普通Lisp-68

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

循环允许复杂和简单的语法,简单的语法就像是progn,但是会永远循环。您可以删除do
coredump

3

05AB1E,7个字节

["/\"Ω?

在线尝试!

["/\"Ω?  - 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个字节

? '/,\'

在线尝试!

?发送IP左边或右边,所以无论是/\与打印前推,。当在打印后以错误的顺序执行'/\'时,它只会对堆栈进行处理(分割或交换),然后在重复之前将不相关的字符压入。


我只是在Jo King的答案中提出另一种7字节的Befunge-98解决方案。但是这种方法看起来更整洁。
James Holderness

3

Befunge,12 9 8 7字节

编辑:詹姆斯·霍尔德内斯(James Holderness)找出了一个疯狂的解决方案,该解决方案使用了三个引号。

?\","/"

每个符号都会在堆栈中溢出很多多余的字符,但是谁在乎何时可以打入那个1字节呢?

旧版

"/\"?>,#

(请注意尾随空格)显然不需要尾随空格(感谢Mistah Figgins)

在线试用

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

我也想知道您是否只能使用一种",但是我的尝试是徒劳的。因为您需要/在的一侧,所以"您必须将时间除以一半。
MildlyMilquetoast

@MistahFiggins对于任何标准Befunge-93实现,绝对不需要空格。代码在某些Funge-98解释器中可能会失败,而这些解释器中的规范更加含糊,但无论如何在这些情况下添加空格都无济于事-您需要在操作<后再#进行操作。
James Holderness

@MistahFiggins至于摆脱引号之一,您可以在Befunge-98中使用'代替。在线尝试!
James Holderness

2
@JoKing刚刚意识到,使用三个引号实际上可以做得更好!?\","/"我认为,只有它的缺点是它会更快地溢出堆栈。
James Holderness

2

没有更好的。数组解引用功能需要PHP 5.5+。

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

从来没有想过,谢谢!
Judy 2012年

1
实际上,PHP支持字符串的下标:while(1)echo'/\\'[rand(0,1)];
manatwork

2

Python,68岁

在“我的语言很烂”类别中,我们有Python!

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

感谢Ivo在进口和进口方面的一些特点choice


好吧,您不会使用'from sys import *'保存任何内容-如果您改写'import sys,random'并使用sys.stdout和random.random,则会节省5个字节。
Ivo

Python3:导入随机,而1:print(random.choice('/ \\'),end ='')
Ivo

@Ivo,谢谢,我忘了选择!不过,您可以保留py3。;)
展位,2013年

如果反转字符串,则不必转义反斜杠,从而节省了一个字节。
乔纳森·弗雷奇

2

> <>,14个字节

我希望可以将其限制为3 * 3的正方形,但没有成功。

"/\
~x/
o</
 !

您可以在这里尝试。


2

Cubix,12个字节

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

在在线翻译中查看!

这映射到以下多维数据集网:

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

说明

设定:

IP从第一个开始向东行驶!。这是“如果是真则跳过”命令,当堆栈上没有任何内容时为False,因此不会跳过任何命令。"/\"输入stringmode并将这两个字符代码附加到堆栈中。B!o在这里几乎没有操作,只反转堆栈。

IP现在循环回到第一个!。但是,现在堆栈上有正整数,因此第一个"被跳过。这意味着/不再是一个角色,而是一个镜像, IP向北发送到主循环中。

主循环:

D命令是Cubix中唯一的随机性来源。它以随机方向发送IP。通过用箭头挡住南方和东方,我们可以确保IP拥有50%的机会前往北部,而50%的机会前往西部。

如果向西行驶,则堆栈将反转。如果它向北,则打印顶部字符。

根据需要,这将创建斜杠的随机序列。


2

PHP,26 31字节

比您的短八个字节(不带空格或花括号)
primo的解决方案短两个字节(不带标签)

PHP 5.4.9是1012年12月的最新版本,因此...

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

需要PHP 5.5或更高版本进行文字字符串索引。

运行-r在线尝试


在发布挑战时,PHP 5.5不存在,但是无论如何都需要+1。另外,尝试rand()&1在Windows上使用PHP构建。您可能会感到惊讶。
primo '18



2

Java 8,60 59 54 53字节

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

通过将@BenjaminUrquhart替换print为-1字节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.字节。哇。
暴民埃里克(Erik the Outgolfer)'16年

@EriktheGolfer呵呵。我什至没有注意到我的字节数大约是平均值。通常,我只是假设Java是最高字节数之一,有时与BrainFuck或C#的竞争能力很小。xD(PS:我什至打到59:P)
Kevin Cruijssen

您的平均水平不是很高,字节数太小(假设Java,不是太小就不好了)。但是,至少,这不是JAVA 8,我认为它更长一些
Outgolfer的Erik

@EriktheGolfer嗯,不是Java 8短c->{for(;;)System.out.print(Math.random()<.5?'/':92);}54字节),还是Java 7比Java 8长?在那种情况下,您确实是正确的。
凯文·克鲁伊森

1
通过切换System.out.write并替换'/'53个字节47
Benjamin Urquhart,

2

JavaScript(Node.js)59 55 54字节

原始答案

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

-4字节归功于manatwork

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'Mar 21'18

@manatwork谢谢!更新。
1024x2

您也可以写for(;;)代替while(1)
Conor O'Brien '18

也谢谢你 添加。
1024x2

1

我猜您可以使用递归。

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

我猜您可以使用递归。

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

...

堆栈空间不是无限的。
codaddict

@codaddict,所以它将超时。
Neal 2012年

假设您的代码段超时非常长,这与OP的代码段不相等。
codaddict

1
@codaddict大声笑操作超时。这是一个无限循环!
Neal 2012年

1
您的超时之前会创建一个运行时错误。
codaddict

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代替。
primo 2012年

1

佩尔

这对我来说看起来很有趣:

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*
乔金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.