10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10 di PHP (atau yang lainnya, dalam hal ini)


23

Baru saja melakukan pembicaraan 'bersemangat' dengan rekan kerja tentang ringkasnya pernyataan BASIC berikut:

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

Ini adalah judul buku ini , dan hanya akan mencetak urutan /dan \karakter, bergantian antara keduanya secara acak, menghasilkan pola yang mirip dengan ini:

masukkan deskripsi gambar di sini

(Gambar dipinjam dari http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/in/photostream/ )

Menjadi sebuah kecenderungan PHP, kami bertanya-tanya seperti apa cara paling ringkas menulis hal yang sama di PHP, dan muncul dengan ini:

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

chr(47)adalah /karakter, dan chr (92) adalah a \. Jadi pernyataan echo chr(47 + 45 * rand(0,1));itu secara acak akan menjadi alternatif di antara keduanya, ad nauseum.

Dalam bahasa yang Anda pilih, tulislah program atau fungsi terpendek untuk menghasilkan urutan acak \dan /karakter yang tak terbatas , di mana setiap karakter memiliki probabilitas yang sama untuk dipilih.


1
Anda bisa kehilangan {}kawat gigi, tapi itu se-ringkas mungkin.
Michael

Ini keren. Font apa yang bisa digunakan untuk mendapatkan gambar yang serupa?
daniero

1
(Gambar) ini mengingatkan saya pada "program" pertama yang pernah saya tulis di komodor saya langsung dari manual :) ah hari
Dale

@daniero Saya pikir jenis huruf sebenarnya disebut Terminal, tapi saya menemukannya online sebagai "Windows Command Prompt" codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

Suatu kebetulan yang aneh bahwa repo Code Golf di Github ini memiliki tantangan yang sama persis ... github.com/noops-challenge/golfbot
Geza Kerecsenyi

Jawaban:


9

The gotoOperator telah ditambahkan ke PHP dari versi 5.3.0 sehingga Anda bisa menggunakan metode yang sama seperti yang Anda lakukan di BASIC:

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

18

Karena ini telah dimigrasikan ke codegolf ...

PHP 30 byte

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

The Ðkarakter 208, dan £karakter 163.

Penggunaan sampel (pada kotak Windows):

color 18 & php maze.php

Menghasilkan sesuatu yang mirip dengan:

Ini berfungsi paling baik dengan font monospace yang persis persegi (di sini saya telah memilih font sistem standar 8x8). Untuk kembali ke warna default Anda, Anda dapat mengetik colorlagi tanpa parameter apa pun.


Dapat menyimpan byte tambahan dengan rand()%2(tidak ada yang menyatakan betapa pseudo-acak itu) - Juga tidak bekerja pada terminal Unicode (seperti OSX)
Leigh

@Leigh Karena implementasinya, rand()%2akan bergantian antara nol dan satu. mt_rand()%2akan bekerja, namun.
primo

15

Mathematica 157 byte

Karena tidak memiliki PETSCII, saya menggulirkan "\" dan "/" saya sendiri.

Tidak ada cerutu untuk singkatnya di sini.

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]

labirin biru


Gambar ini melakukan ilusi optik titik abu-abu !!
Magic Gurita Guci

8

Brainfuck - 534

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

Prng saya (dari sini ) besar dan sangat lambat. Mungkin LFSR yang lebih sederhana atau sejenisnya sudah cukup, tetapi ini berfungsi:

masukkan deskripsi gambar di sini


Saya pikir ini bukan acak, karena ini adalah brainfuck.
Erik the Outgolfer

sebagian besar dari ini mengandalkan prng bawaan. Ya, ini akan menghasilkan yang sama setiap saat. Bisa memungkinkan untuk diunggulkan dari keyboard dengan biaya beberapa karakter tambahan, tapi itu bukan intinya di sini, saya pikir.
captncraig

5

C, 39 karakter (38 pada MSVC)

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

masukkan deskripsi gambar di sini Lihat berlari.

Pada MSVC, kita bisa mengganti putchar()dengan _putch()dan menyimpan byte, tetapi tidak berfungsi di IDEOne.

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


3

printmemiliki nilai pengembalian 1, jadi jika Anda menggunakannya, Anda dapat membungkus seluruh ekspresi dalam while:

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

Anda mungkin bisa bermain golf lebih jauh juga.


3

ruby, 27 23 karakter

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

$><< is 'print to stdout'.


2
Anda harus dapat menggantinya "/\\"dengan '\/'. Ruby 1.8 mengharuskan [rand(2),1]untuk menghasilkan karakter, bukan kode ascii.
primo

3

C ++, 45 Chars

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

Tidak akan memenangkan penghargaan karena kekurangan, tetapi saya sudah menulis ini ketika saya mendengar tentang buku yang disebutkan, jadi saya hanya bermain golf.

Trik putchar juga berfungsi di C ++, membuat Anda turun ke 43, tetapi Anda tidak bisa menghindari mendeklarasikan tipe pengembalian di main.


3

Saya mencoba membuat menggunakan gaya css, dan itu berhasil

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

kode php ini:

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

Saya ingin menyarankan gaya alternatif: font-family: courier; line-height: 0.75em; letter-spacing: -0.25em;Menggunakan -0.25emspasi huruf sepertinya lebih cocok daripada -3px, yang memiliki artefak karena tidak eksak ptdengan pxkonversi.
primo

3

Gangguan Umum - 68

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

Loop memungkinkan sintaks yang kompleks dan sederhana, yang sederhana seperti progn, tetapi berulang selamanya. Anda dapat menjatuhkan do.
coredump

3

05AB1E , 7 byte

["/\"Ω?

Cobalah 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 byte

? '/,\'

Cobalah online!

yang ?mengirimkan IP baik kiri atau kanan, sehingga baik /atau \didorong sebelum mencetak dengan ,. Ketika menjalankan '/atau \'dalam urutan yang salah setelah mencetak, itu hanya melakukan hal-hal ke tumpukan (membagi atau menukar), dan kemudian mendorong karakter yang tidak relevan sebelum mengulangi.


Saya baru saja mengusulkan solusi 7 byte Befunge-98 yang berbeda pada jawaban Jo King. Namun pendekatan ini terlihat lebih rapi.
James Holderness

3

Befunge, 12 9 8 7 Bytes

Sunting: James Holderness menemukan solusi gila yang menggunakan tiga kutipan sebagai gantinya.

?\","/"

Melimpahkan tumpukan dengan banyak karakter berlebih untuk setiap simbol, tetapi siapa yang peduli kapan Anda bisa melakukan golf 1 byte itu?

Versi lama

"/\"?>,#

(Perhatikan trailing space) Trailing space tampaknya tidak diperlukan (terima kasih Mistah Figgins)

Cobalah secara 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

Ini mulai mengisi tumpukan, dengan satu simbol tambahan untuk setiap simbol yang dicetak.


1
Sepertinya Anda dapat menyingkirkan ruang ekstra, karena #ada di akhir baris. Ini bukan perilaku yang konsisten, tetapi penerjemah yang Anda gunakan memungkinkannya: tio.run/##S0pNK81LT/3/X0k/RsneTkf5/38A
MildlyMilquetoast

Saya juga bertanya-tanya apakah Anda hanya dapat menggunakan satu ", tetapi upaya saya sia-sia. Karena Anda memerlukan satu /di sisi ", Anda harus membagi separuh waktu.
MildlyMilquetoast

@MistahFiggins Space pasti tidak diperlukan untuk implementasi standar Befunge-93. Kode mungkin gagal di beberapa penerjemah Funge-98, di mana spek lebih ambigu, tetapi menambahkan ruang tidak akan membantu dalam kasus-kasus itu - Anda akan memerlukan <setelah #untuk membuatnya bekerja.
James Holderness

@MistahFiggins Adapun untuk menghilangkan salah satu dari tanda kutip, Anda dapat melakukan semacam itu di Befunge-98 dengan menggunakan 'sebagai gantinya. Cobalah online!
James Holderness

2
@JoKing Baru sadar Anda sebenarnya bisa melakukan yang lebih baik dengan tiga kutipan! ?\","/"Satunya downside itu akan meluap tumpukan lebih cepat saya pikir.
James Holderness

2

Tidak jauh lebih baik. Membutuhkan php 5.5+ untuk fitur array dereferencing.

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

Bahkan tidak pernah memikirkan itu, terima kasih!
Judy

1
Sebenarnya PHP mendukung subscript untuk string: while(1)echo'/\\'[rand(0,1)];.
manatwork

2

Python, 68

Dalam kategori "bahasa saya payah di ini", kami punya Python!

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

Terima kasih kepada Ivo untuk beberapa karakter pada impor dan choice .


Nah, Anda tidak menyimpan apa pun dengan 'from sys import *' - jika Anda menulis 'import sys, random' dan menggunakan sys.stdout dan random.random, Anda akan menghemat 5 byte.
Ivo

Python3: impor acak sementara 1: cetak (random.choice ('/ \\'), end = '')
Ivo

@Ivo, Terima kasih, saya lupa tentang pilihan! Anda bisa menyimpan py3. ;)
boothby

Jika Anda membalikkan string Anda, Anda tidak harus lari dari backslash, sehingga menghemat satu byte.
Jonathan Frech

2

> <> , 14 byte

Saya berharap saya bisa membatasi ke 3 * 3 persegi tetapi tidak berhasil.

"/\
~x/
o</
 !

Anda bisa mencobanya di sini .


2

Cubix , 12 byte

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

Lihat di penerjemah online!

Ini memetakan ke jaring kubus berikut:

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

Penjelasan

Mendirikan:

IP mulai menuju ke timur pada awalnya !. Ini adalah perintah 'lewati jika benar', yang salah ketika tidak ada apa pun di stack, jadi tidak ada perintah yang dilewati. "/\"memasuki stringmode dan menambahkan dua kode karakter ini ke stack. B!osebagian besar no-op di sini, hanya membalikkan tumpukan.

IP sekarang berputar kembali ke yang pertama !. Namun, sekarang ada bilangan bulat positif pada tumpukan, jadi yang pertama "dilewati. Ini berarti /bukan lagi karakter, tetapi cermin, mengirim IP utara ke loop utama.

Loop Utama:

Itu D perintah adalah satu-satunya sumber keacakan di Cubix. Ini mengirim IP dalam arah acak. Dengan memblokir Selatan dan Timur dengan panah, kami memastikan IP memiliki peluang 50% untuk menuju Utara, dan 50% peluang untuk menuju Barat.

Jika mengarah ke Barat, tumpukan terbalik. Jika mengarah Utara, karakter teratas dicetak.

Ini menciptakan urutan tebasan acak, seperti yang diinginkan.


2

PHP, 26 31 byte

delapan tiga byte lebih pendek dari milik Anda (tanpa spasi atau kawat gigi) ,
dua byte lebih pendek dari solusi primo (tanpa tag)
.

PHP 5.4.9 adalah versi saat ini pada bulan Desember 1012, jadi ...

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

membutuhkan PHP 5.5 atau lebih baru untuk pengindeksan string literal.

Jalankan dengan -ratau coba online .


PHP 5.5 tidak ada pada saat posting tantangan, tetapi tetap memiliki +1. Juga, cobalah rand()&1membangun PHP untuk Windows. Anda mungkin akan terkejut.
primo



2

Java 8, 60 59 54 53 byte

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

-1 byte berkat @BenjaminUrquhart dengan mengganti printdengan write, sehingga '/'dapat 47.

Penjelasan:

Cobalah online (waktu habis setelah 60 detik).

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
Jawa. 60. Bytes. Wow.
Erik the Outgolfer

@EriktheGolfer Hehe. Saya bahkan tidak memperhatikan bahwa saya rata-rata dalam byte-count. Biasanya saya hanya berasumsi bahwa Java adalah salah satu byte-count tertinggi, hanya sedikit bersaing dengan BrainFuck atau C # kadang-kadang. xD (PS: Saya bahkan memasukkannya ke 59: P)
Kevin Cruijssen

Anda tidak rata-rata, Anda memiliki jumlah byte yang terlalu kecil (dengan asumsi Java, tidak terlalu kecil tidak baik). Tapi, setidaknya, ini bukan JAWA 8 , di mana saya pikir itu lebih lama ...
Erik the Outgolfer

@EriktheGolfer Hmm, bukankah Java 8 lebih pendek c->{for(;;)System.out.print(Math.random()<.5?'/':92);} ( 54 byte ) Atau maksud Anda Java 7 lebih panjang dari Java 8? Dalam hal ini Anda memang benar.
Kevin Cruijssen

1
53 byte dengan beralih ke System.out.writedan mengganti '/'dengan47
Benjamin Urquhart

2

JavaScript (Node.js) , 59 55 54 byte

Jawaban Asli

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

-4 byte berkat manatwork

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

-1 byte terima kasih kepada Conor O'Brien

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

Selamat datang di situs ini!
caird coinheringaahing

Tidak perlu kawat gigi di sekitar blok instruksi tunggal; dalam JavaScript bagian 0 integer dapat diabaikan; membalikkan bersyarat untuk menggunakan operator karakter tunggal: while(1)process.stdout.write(Math.random()<.5?"/":"\\").
manatwork

@manatwork Terima kasih! Diperbarui.
1024x2

Anda juga dapat menulis for(;;)alih-alihwhile(1)
Conor O'Brien

Terima kasih juga. Ditambahkan.
1024x2

1

Saya kira Anda bisa menggunakan rekursi.

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

Saya kira Anda bisa menggunakan rekursi.

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

...

ruang stack tidak terbatas.
codaddict

@codaddict sehingga akan habis.
Naftali alias Neal

Dengan asumsi waktu tunggu yang sangat tinggi, cuplikan Anda tidak setara dengan OP.
codaddict

1
@codaddict lol kali OP juga habis. itu adalah loop tak terbatas !
Naftali alias Neal

1
Anda akan membuat kesalahan waktu berjalan sebelum waktu habis.
codaddict

1

memotong satu karakter:

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

kemudian lepaskan kurung kurawal:

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

trik lain, dengan panjang yang sama:

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

1
Karena algoritma yang digunakannya, rand()%2akan menghasilkan pergantian 0s dan 1s. Tidak terlalu acak. Anda harus menggunakan rand(0,1)atau mt_rand()%2sebagai gantinya.
primo

1

Perl

Yang ini terlihat lucu bagi saya:

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

(Maaf keluar dari topik di sini. Saya tahu ini bukan PHP)


1

Powershell, 37 byte

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

sayangnya sepertinya tidak ada alias lebih pendek untuk Write-Host yang tidak menyebabkan baris baru setelah setiap karakter.


1

Kode rakitan x86 16-bit, 10 byte

Saya tidak ingat apakah ini berakhir di buku.

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 loop selamanya.
  • <\ />adalah daftar string \dan /.
  • .pick mengambil salah satu dari dua string secara acak.
  • .print mencetak string acak itu.

alih-alih loop, Anda dapat menggunakanxx*
Jo King
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.