10 PRINT CHR $ (205.5 + RND (1)); : PHP'de GOTO 10 (veya bu konuda başka bir şey)


23

Sadece bir BASIC ifadesinin özlülüğü hakkında bir meslektaşla 'ruhlu' bir konuşma yaptım:

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

Bu kitabın adı ve basitçe şununla rasgele bir sırayla sonuçlanan iki sıra arasında değişen bir dizi /ve \karakter basacak :

görüntü tanımını buraya girin

( Http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/ adresinden ödünç alınan resim )

Bir PHP eğilimi olan PHP'de aynı şeyi yazmanın en kompakt yolunun ne olduğunu merak ettik ve şunu belirledik:

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

chr(47)bir /karakterdir ve chr (92) a'dır \. Yani ifade echo chr(47 + 45 * rand(0,1));, iki reklam müzesi arasında rastgele bir alternatif olacaktır.

Seçtiğiniz bir dilde, sonsuz bir rasgele sıra dizisi \ve /her bir karakterin seçilme olasılığının eşit olduğu karakterlerin çıktısını almak için en kısa programı veya işlevi yazın .


1
{}Diş tellerini kaybedebilirsiniz , ancak bu yapabileceğiniz kadar özlüdür.
Michael,

Bu havalı. Benzer bir görüntü elde etmek için hangi yazı tipi kullanılabilir?
daniero

1
Bu (resim) bana ilk defa "komodorumda el kitabından çıkarılan 64" yazdığımı hatırlatıyor :) ah mutlu günler
Dale

@daniero Ben gerçek yazı biçimi Terminali denir düşünüyorum, ama "Windows Komut İstemi" gibi online buldum codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Yanıtlar:


9

gotoEğer BASIC yaptığınız gibi aynı yöntemi kullanın böylece operatör sürümü 5.3.0 den PHP eklendi:

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

18

Bu kodgolf'e taşındığından beri ...

PHP 30 bayt

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

ÐKarakter 208 olduğunu ve £karakter 163 olduğunu.

Örnek kullanım (bir Windows kutusunda):

color 18 & php maze.php

Şuna benzer bir şey üretir:

En iyi tam kare kare monospace yazı tipiyle çalışır (burada 8x8 standart sistem yazı tipini seçtim). Varsayılan renginize geri dönmek için, colorherhangi bir parametre olmadan tekrar yazabilirsiniz .


Fazladan bir bayt kurtarabilir rand()%2(kimse ne kadar sahte rastgele olması gerektiğini söylemedi) - Ayrıca Unicode terminallerinde (OSX gibi) çalışmaz
Leigh

@Leigh Uygulanmasından dolayı rand()%2sıfır ile bir arasında değişecektir. mt_rand()%2Ancak çalışacaktı.
primo

15

Mathematica 157 bayt

PETSCII eksikliği nedeniyle kendi "\" ve "/" harflerini yuvarladım.

Burada kısalık için puro yok.

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]

mavi labirent


Bu görüntü gri nokta optik yanılsama yapar !!
Magic Octopus Urn

8

Brainfuck - 534

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

Prng ( buradan ) hem büyük hem de aşırı yavaş. Belki daha basit bir LFSR veya benzeri yeterli olacaktır, ancak bu işe yarar:

görüntü tanımını buraya girin


Bence bu rastgele değil, çünkü beyin hastası.
Outgolfer Erik,

Bunların çoğu, yerleşik prngs'e güveniyor. Evet, bu her zaman aynı şekilde çıkacaktır. Birkaç ekstra karakter pahasına klavyeden ekilmesine izin verebilir, ama bu gerçekten mesele değil sanırım.
captncraig

5

C, 39 karakter (MSVC'de 38)

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

görüntü tanımını buraya girin Çalıştırıldığını görün.

MSVC'de bir bayt putchar()ile değiştirebilir _putch()ve kaydedebiliriz, ancak IDEOne'de çalışmaz.

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


3

print1 dönüş değeri vardır, bu nedenle kullanırsanız tüm ifadeyi şuraya sarabilirsiniz while:

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

Muhtemelen daha fazla golf oynayabilirsin.


3

ruby, 27 23 karakter

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

$><< 'stdout'a yazdır'.


2
Sen yerine gerekir "/\\"ile '\/'. Ruby 1.8 [rand(2),1], ascii kodu yerine karakter üretmeyi gerektirir .
primo

3

C ++, 45 Karakter

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

Kısalık ödülü kazanamayacaksınız, ancak bahsi geçen kitabı duyduğumda zaten bunu yazmıştım, bu yüzden sadece golf oynamıştım.

Putchar hilesi, C ++ 'da da çalışarak sizi 43'e indirir, ancak ana getiriyi beyan etmekten kaçınamazsınız.


3

css stilini kullanarak oluşturmaya çalışıyorum

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

bu php kodu:

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

Alternatif bir stil önermek isterim: Harf aralığı için font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;kullanmak , dönüşümden kaynaklanan bir eksiklikten dolayı artefaktları -0.25emolandan daha iyi eşleşiyor gibi görünüyor . -3pxptpx
primo

3

Ortak Lisp - 68

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

Döngü hem karmaşık hem de basit bir sözdizimine izin verir, basit olanı bir progn gibidir, ancak sonsuza kadar döngüdür. Bırakabilirsiniz do.
coredump,

3

05AB1E , 7 bayt

["/\"Ω?

Çevrimiçi deneyin!

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

? '/,\'

Çevrimiçi deneyin!

?IP ya sola veya sağa, yani ya gönderir /ya \ile yazdırmadan önce itilir ,. Yazdırdıktan sonra '/ya \'da yanlış sırada yürütülürken, sadece istifin içine işler (bölünür veya değişir) ve sonra tekrar etmeden önce ilgisiz bir karakter iter.


Jo King'in cevabına farklı 7 bayt Befunge-98 çözümü teklif ediyordum. Ancak bu yaklaşım daha düzenli görünüyor.
James Holderness,

3

Befunge, 12 9 8 7 Bayt

Düzenleme: James Holderness , bunun yerine üç tırnak kullanan çılgın bir çözüm buldu.

?\","/"

Her sembol için fazla karakter içeren yığının üstünden taşar, ancak bu 1 baytı ne zaman oynayabileceğinizi kim umursar?

Eski versiyon

"/\"?>,#

(Sondaki boşluğa dikkat edin) Sondaki boşluğa görünüşte gerek yok (teşekkürler Mistah Figgins)

Çevrimiçi Deneyin

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

Bu, basılan her sembol için bir ekstra sembolle yığını doldurmaya başlar.


1
#Bir satırın sonunda olduğu gibi, ekstra alandan kurtulabilirsiniz . O değil tutarlı bir davranış, ancak kullandığınız tercüman izin veriyorsa: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Ayrıca yalnızca birini kullanıp kullanamayacağınızı merak ediyorum ", ama girişimlerim boşuna. Çünkü /bir tarafına ihtiyacınız "var, zamanın yarısını bölmek zorunda kalacaksınız.
MildlyMilquetoast

@MistahFiggins Uzay, herhangi bir standart Befunge-93 uygulaması için kesinlikle gerekli olmamalıdır. Kod, teknik özelliklerin daha belirsiz olduğu bazı Funge-98 tercümanlarında başarısız olabilir, ancak boşluk eklemek bu durumlarda yine de bir işe yaramaz - işe yaraması için bir <süre sonra ihtiyacınız #olacak.
James Holderness 23

@MistahFiggins Alıntılardan birinden kurtulmak için, 'bunun yerine Befunge-98'de bunu yapabilirsiniz . Çevrimiçi deneyin!
James Holderness,

2
@JoKing Sadece üç tırnak ile daha iyi yapabileceğini fark ettim! ?\","/"Sadece olumsuz, bence çok daha hızlı yığın taşması olacaktır.
James Holderness,

2

Daha iyi değil. Dizi düzenleme özelliği için php 5.5+ sürümüne ihtiyaç duyuyor.

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

Hiç düşünmedim, teşekkürler!
Judy,

1
Aslında PHP dizeleri alt simgeler destekler: while(1)echo'/\\'[rand(0,1)];.
Manat çalışması

2

Python, 68

"Dilim bunu emiyor" kategorisinde Python var!

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

İvo'ya ithalat ve ithalatta birkaç para için teşekkürler choice.


Peki, 'sys import *' ile hiçbir şey kaydetmiyorsunuz - bunun yerine 'import sys, random' yazıp sys.stdout ve random.random kullanıyorsanız, 5 bayt tasarruf edersiniz.
Ivo

Python3: 1'i basarken rasgele içe aktarma: baskı (random.choice ('/ \\'), end = '')
Ivo

@Ivo, Teşekkürler, seçimimi unuttum! Yine de py3'ü tutabilirsiniz. ;)
Ocak'ta kabin

İpinizi ters çevirirseniz, ters eğik çizgiden kaçmanız gerekmez, böylece bir bayt tasarrufu sağlanır.
Jonathan Frech

2

> <> , 14 bayt

3 * 3 kareyle sınırlayabileceğimi, ancak başaramadığımı umuyordum.

"/\
~x/
o</
 !

Burada deneyebilirsiniz .


2

Cubix , 12 bayt

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

Online tercümanda göster!

Bu, aşağıdaki küp ağıyla eşleşir:

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

açıklama

Kurmak:

IP ilk önce doğuya doğru ilerlemeye başlar !. Bu, 'truthy atla' komutudur, bu, istifte hiçbir şey olmadığında False'dir, dolayısıyla hiçbir komut atlanmaz. "/\"stringmode'a girer ve bu iki karakter kodunu yığına ekler. B!oburada çoğunlukla çalışma yok, yalnızca yığını ters çeviriyor.

IP şimdi ilkine geri dönüyor !. Ancak şimdi yığında pozitif tamsayılar var, bu yüzden ilk "atlandı. Bu /, artık bir karakter değil, IP'yi kuzeye ana döngüye gönderen bir aynadır.

Ana döngü:

DKomut Cubix içinde rastgelelik tek kaynaktır. IP'yi rastgele bir yöne gönderir. Güney ve Doğu'yu oklarla engelleyerek, IP’nin% 50’yi Kuzey yönüne,% 50’sini Batı’ya yönlendirme şansına sahip olduğundan emin oluruz.

Batıya yönelirse, yığın tersine döner. Kuzey yönüne giderse, üst karakter yazdırılır.

Bu, istendiği gibi, rastgele eğik çizgi dizisini oluşturur.


2

PHP, 26 31 bayt

sizinkinden daha kısa sekiz bayt (boşluk veya parantez olmadan) , primo çözümünden
iki bayt ( etiketsiz )
.

PHP 5.4.9 Aralık 1012’deki güncel sürümdü.

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

hazır bilgi dizini indekslemesi için PHP 5.5 veya daha yenisini gerektirir.

Çevrimiçi olarak çalıştırın -rveya deneyin .


PHP 5.5, zorlu görev ilanı sırasında mevcut değildi, ancak yine de + 1'i vardı. Ayrıca, rand()&1Windows için PHP derlemesini deneyin . Şaşırmış olabilirsin.
primo



2

Java 8, 60 59 54 53 bayt

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

-1 byte sayesinde @BenjaminUrquhart değiştirerek printile write, yani '/'olabilir 47.

Açıklama:

Çevrimiçi deneyin (60 saniye sonra zaman aşımına uğradı).

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. Bayt. Vay.
Outgolfer Erik,

@EriktheGolfer Hehe. Bayt sayımında ortalama olduğumu bile fark etmemiştim. Genellikle, Java’nın, sadece BrainFuck veya C # ile biraz rekabet edebilen en yüksek bayt sayısından biri olduğunu farz ediyorum. xD (PS: Hatta 59: P'a golf yaptım)
Kevin Cruijssen

Ortalama değilsiniz, çok küçük bir bayt sayınız var (Java'nın çok küçük olmadığını varsayalım). Ama, en azından, bu daha uzun olduğunu düşündüğüm JAVA 8 değil ...
Outgolfer Erik

@EriktheGolfer Hmm, Java 8 c->{for(;;)System.out.print(Math.random()<.5?'/':92);}( 54 byte ) ile kısa değil mi yoksa Java 7'nin Java 8'den daha uzun olduğunu mu söylüyorsunuz? Bu durumda gerçekten haklısın.
Kevin Cruijssen,

1
53 bayt geçerek System.out.writeve değiştirme '/'ile47
Benjamin Urquhart

2

JavaScript (Node.js) , 59 55 54 bayt

Orijinal cevap

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

Manatwork sayesinde -4 bayt

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

Conor O'Brien sayesinde -1 bayt

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

Siteye Hoşgeldiniz!
caird coinheringaahing '21

Tek bir komut bloğu etrafındaki desteklere gerek yoktur; JavaScript'te 0 tamsayı kısmı bırakılabilir; tek bir karakter operatörü kullanılacak koşullu ters: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
Manat çalışması

@ manatwork Teşekkürler! Güncellenmiş.
1024x2

Ayrıca for(;;)bunun yerine yazabilirsinizwhile(1)
Conor O'Brien,

Sende tesekkür ederim. Katma.
1024x2

1

Sanırım özyinelemeyi kullanabilirsin.

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

Sanırım özyinelemeyi kullanabilirsin.

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

...

yığın alanı sonsuz değil.
25'te

@codaddict bu yüzden zaman aşımına uğrayacak.
Naftali aka Neal

Oldukça yüksek bir zaman aşımı süresi olduğunu varsayarsak snippet'iniz OP'lere eşdeğer değildir.
16

1
@codaddict lol OP'ler de zaman aşımına uğradı. bu sonsuz bir döngüdür!
Naftali aka Neal

1
Sizinki zaman aşımından önce bir çalışma zamanı hatası yaratacaktır.
33'te

1

bir karakter kıyılmış:

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

sonra kaşlı ayraçları çıkarın:

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

aynı uzunluktaki başka bir numara:

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

1
Kullandığı algoritma nedeniyle rand()%2, 0s ve 1s dönüşümüyle sonuçlanacaktır . İnanılmaz derecede rastgele değil. Kullanmanız gerekir rand(0,1)ya da mt_rand()%2yerine.
primo

1

Perl

Bu benim için komik görünüyor:

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

(Burada konu dışı olduğum için üzgünüm. Bunun PHP olmadığını biliyorum)


1

Powershell, 37 bayt

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

maalesef, her ana bilgisayardan sonra yeni bir satıra neden olmayan Yazma-Ana Bilgisayar için daha kısa takma adlar görünmüyor.


1

16 bit x86 derleme kodu, 10 bayt

Bunun kitapta bitip bitmediğini hatırlamıyorum.

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 bayt

loop {<\ />.pick.print}
  • loop Sonsuza dek döngüler.
  • <\ />dizelerin listesi \ve /.
  • .pick iki diziden birini rastgele seçer.
  • .print bu rasgele dizeyi yazdırır.

döngü yerine kullanabilirsinizxx*
Jo King
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.