Tulis penerjemah untuk *


20

Tugasnya sederhana. Tulis penerjemah untuk bahasa * .

Berikut tautan yang lebih besar ke wiki.

Hanya ada tiga program * yang valid:

  • * Cetakan "Hello World"
  •  *  Mencetak angka acak antara 0 dan 2.147.483.647
  • *+* Berjalan selamanya.

Kasing ketiga harus merupakan infinite loop sesuai dengan spesifikasi dalam pertanyaan ini

Memasukkan:

  • Input dapat diambil melalui metode input apa pun yang dapat diterima oleh aturan I / O standar kami
  • Itu akan selalu menjadi salah satu program di atas

Keluaran:

  • Kasing pertama harus dicetak dengan tepat Hello World, dengan atau tanpa jeda baris tambahan.
  • Untuk kasus kedua, jika maksimum bilangan bulat bahasa Anda lebih kecil dari 2.147.483.647, gunakan maksimum bilangan bulat bahasa Anda
  • Kasing pertama dan kedua dapat dicetak ke keluaran apa pun yang dapat diterima oleh aturan I / O standar kami.
  • Kasus ketiga seharusnya tidak memberikan output apa pun.

Mencetak:

Karena ini adalah , jawaban tersingkat, dalam byte, menang.


7
Ketika Anda mengatakan 'antara 0dan 2,147,483,647', apakah itu inklusif atau eksklusif? (Misalnya, apakah 0output yang valid?)
Chas Brown

7
Mengubah spec setelah memposting tantangan dan membatalkan solusi yang ada adalah otomatis -1dari saya.
Shaggy

2
Untuk bahasa yang tidak memiliki cara menghasilkan bilangan acak, apakah ada cara yang dapat diterima untuk memenuhi persyaratan "cetak angka acak"?
Tanner Swett

2
Jika bilangan bulat bahasa kami tidak memiliki, atau lebih tinggi, maksimum, dapatkah kami menggunakan batas atas yang lebih tinggi?
Jonathan Allan

7
@Shaggy Saya tidak melihat adanya perubahan aturan di wiki untuk pertanyaan, hanya spasi untuk ruang yang tidak melanggar (periksa tab penurunan harga), karena renderer penurunan harga SE tidak merendernya, tetapi melihat revisision asli , jelas itu harus berupa ruang normal, dan "peretasan" hanya dilakukan untuk masalah
rendering

Jawaban:


20

* , 0 byte


Karena * tidak memiliki cara membaca input, aturan default memungkinkan menentukan bahwa input harus diberikan dengan memasukkannya ke dalam program .

(... Saya pikir. Ada kondisi "setidaknya dua kali lebih banyak downvotes daripada downvotes" yang saya tidak punya perwakilan untuk memverifikasi).


4
Meta tertaut Anda memang merupakan standar situs yang saat ini diterima (+31 -7).
Jonathan Allan

2
@ A__: Sepertinya bagi saya sepertinya itu telah dirancang khusus untuk memenuhi definisi yang diusulkan seseorang tentang 'bahasa pemrograman' ("Anda dapat menulis halo dunia!" "Anda dapat menulis loop tak terbatas!" "Anda dapat menulis sebuah program yang tidak selalu melakukan hal yang sama! ").
Henning Makholm

Saya percaya bahwa secara teknis Malbolge juga bukan bahasa pemrograman.
Bob Jansen

1
Malbolge adalah bahasa pemrograman untuk automata terbatas, sama dengan *, dan, misalnya, Befunge-93. Oleh karena itu Malbolge adalah bahasa pemrograman formal, sama dengan *, secara teknis sama dengan bahasa enumerable rekursif ketika datang ke definisi bahasa pemrograman (meskipun bahasa formal kurang kuat).
Krzysztof Szewczyk

Mengundurkan diri dari saya, karena jujur, jawaban ini sangat membosankan, itu sebenarnya sudah menjadi celah standar , bahkan jika kita mengabaikan pertanyaan apakah * adalah bahasa pemrograman
AlienAtSystem

8

R , 69 byte

switch(scan(,""),"*"="Hello, World!"," * "=sample(2^31,1)-1,repeat{})

Cobalah online!

switchmencoba untuk mencocokkan argumen yang dinamai dan jika tidak ada kecocokan, pilih yang pertama tanpa nama setelah yang pertama, yang dalam hal ini adalah infinite loop repeat{}.


6

Jelly ,  21  20 byte

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿?

Tautan monadik yang menerima daftar karakter.

Cobalah online!

vL’... juga berfungsi (lihat di bawah).

Bagaimana?

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿? - Link: list of characters   e.g.: "*"        or  " * "    or  "*+*"
Ḋ                    - dequeue                          ""             "* "         "+*"
 O                   - to ordinals                      []             [42,32]      [43,42]
  S                  - sum                              0              74           85
                   ? - if...
                  ¿  - ...if-condition: while...
                 Ḃ   -    ...while-condition: modulo 2  0              0            1
                ¹    -    ...while-true-do: identity                                85
                     -                                  0              74           (looping)
        ¤            - ...then: nilad followed by link(s) as a nilad:
   Ø%                -    literal 2^32                                 2^32
     H               -    half                                         2^31
      X              -    random integer in [1,n]                      RND[1,2^31]
       ’             -    decrement                                    RND[0,2^31)
         “½,⁾ẇṭ»     - ...else: dictionary words        "Hello World"

Alternatif

vL’... - Link: list of characters                 e.g.: "*"        or  " * "    or  "*+*"
 L     - length                                         1              3            3
v      - evaluate (left) as Jelly code with input (right)
       -                                                1^1            3^3          (3^3+3)^3
       -                                                1              27           27000
  ’    - decrement                                      0              26           26999
   ... - continue as above                              "Hello World"  RND[0,2^31)  (looping)

5

C (gcc) , 66 63 byte

Berkat attinat untuk byte -3.

Saya hanya perlu memeriksa karakter kedua: jika LSB diatur, itu adalah +(dengan demikian programnya " *+*") dan loop program. Setelah itu, jika itu adalah NUL, programnya " *" dan kami tampilkan Hello World; jika tidak, ini akan menampilkan nilai acak ("  * ", satu-satunya pilihan lain yang tersisa.)

f(char*s){for(s++;*s&1;);printf(*s?"%d":"Hello World",rand());}

Cobalah online!



Shave a byte:f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Roman Odaisky

Catatan Pedantic: randtidak dijamin untuk mengembalikan nilai yang cukup besar; RAND_MAXdan INT_MAXtidak dijamin akan sama (dan tidak pada kompiler dunia nyata, misalnya Visual Studio RAND_MAXadalah 32767, sementara INT_MAXini [pada x86 yang modern sistem berasal] yang 2147483647nilai yang ditentukan dalam pertanyaan OP).
ShadowRanger

@ShadowRanger yang sepenuhnya benar, tetapi mengingat bahwa> 90% dari semua entri CGCC berbasis-C mengandalkan perilaku yang tidak ditentukan dan tidak ditentukan, saya tidak khawatir tentang itu! Saya juga tidak merasa ingin menerapkan LCG kode-golf hari ini. :-)
ErikF

5

Python 2 , 103 93 89 87 byte

Saya menggabungkan jawaban saya sebelumnya dengan Chas Browns ini jawaban dan mendapat sesuatu yang beberapa byte lebih pendek.

Angka acak akan antara 0 dan 2 ** 31-1 inklusif.

from random import*
i=input()
while'*'<i:1
print["Hello World",randrange(2**31)][i<'!']

Cobalah online!

Versi sebelumnya:

103 byte

from random import*
exec['print"Hello World"','while 1:1','print randint(0,2**31-1)'][cmp(input(),'*')]

93 byte

from random import*
i=cmp(input(),'*')
while i>0:1
print["Hello World",randint(0,2**31-1)][i]

Simpan 2 byte dengan mengganti randint(0,2**31-1)dengan randrange(2**31).
Chas Brown

while'*'<isave 2
Jonathan Allan

Simpan byte lain dengan mengubah randrange(2**31)ke getrandbits(31)(yang terakhir kembali long, tidak int, tetapi printakan mencetak strformulir, bukan reprformulir, sehingga trailing Ltidak akan ada di sana).
ShadowRanger

Relatif tidak berpengalaman dengan situs, klarifikasi sangat cepat: Apakah Anda diizinkan meminta input Anda untuk dikutip? i=input()hanya berfungsi jika input dikutip, jika Anda hanya input polos */ * /*+*, input tersebut akan mati dengan SyntaxError(karena inputtermasuk implisit eval); Anda harus memasukkan '*'/' * '/'*+*'(atau setara dengan tanda kutip ganda sebagai gantinya). Saya tidak melihat sesuatu yang jelas pada aturan I / O standar yang akan memungkinkan ini, yang mungkin berarti Anda harus menggunakan raw_input(), seharga empat byte.
ShadowRanger

@ShadowRanger input()mengambil string sebagai input dan mengevaluasinya. Saya tidak benar-benar menambahkan input, saya hanya mengambil string sebagai input, dan string memiliki tanda kutip. Ini cukup standar, dengan cara yang sama saya bisa mengambil array seperti [1,2,3]bukan sebagai string yang dibatasi yang kemudian saya harus pisahkan dan parsing. Tujuan dari situs ini bukan untuk membuat input menjadi ketat, ini untuk membuat I / O mudah sehingga kita dapat memfokuskan kode pada tantangan yang ada.
mbomb007

5

Tong , -lp, -ir 30 26 25 24 20 19 bytes

!1=[_“H%c¡“| =[~.|{

-1 byte menggunakan flag

Cobalah online!

Jawab Sejarah

?!1=[_“H%c¡“| =[~.|{

Cobalah online!

Disingkat Hello Worldmenjadi string kamus

!1=[_Hello World| =[~.|{

Cobalah online!

Saya tidak pernah berhenti kagum pada kekuatan Keg. Kredit ke pengguna EdgyNerd untuk byte lain disimpan.

Versi sebelumnya

_!0=[Hello World|\*=[~.|{

Cobalah online!

Kredit ke pengguna A__ untuk byte ekstra yang disimpan.

Versi lama

?!1=[_Hello World| =[__~|{

Intinya, ambil program input dan:

  • Cek untuk melihat apakah panjang input 1, mencetak "Hello World" jika benar
  • Cek untuk melihat apakah karakter terakhir adalah spasi, dan mencetak angka acak
  • Kalau tidak, jalankan loop tak terbatas

Kemudian secara implisit cetak tumpukan.

?                               #Get input from the user
 !1=                            #Compare the stack's length to 1
    [_Hello World           #Push "Hello, World!" to the stack
                     | =        #See if top item is a space
                        [__~|{  #If so, generate a random number, otherwise, infinite loop.

4 byte disimpan karena fakta bahwa hello world tidak perlu tanda baca.

Cobalah online! Versi lama

Cobalah online! Versi baru


Anda dapat memotong 4 byte, Anda tidak perlu tanda koma atau tanda seru di "Hello World".
TheOnlyMrCat

1
Sekarang saya harus belajar bahasa lain yang tidak populer untuk menjawab tantangan di sini secara normal.
Sebuah

1
-1 byte: TIO . Saya senang bahwa saya tidak kehilangan kemampuan untuk bermain golf di Keg.
Sebuah

@ A__ Menikmati Tong saat menggunakan TIO?
Jono 2906


3

Befunge-93 , 54 byte

~"*"-_~1+#^_"dlroW olleH">:#,_@.%*2**:*::*88:*`0:?1#+<

Cobalah online!

Beranotasi:

~"*"-                      _                ~1+                   #^_        "dlroW olleH">:#,_    @      .%*2**:*::*88:   *`0:             ?1#+<
Compare first      If equal, go right       Compare second       If equal,        Output          Exit    Modulo by 2^31   If less than      Add 1
character to       Otherwise, go left       character to       loop forever   "Hello World"                 and output     0, multiply     a random amount
'*'                and wrap around          -1 (EOF)                                                                         by 0            of times

Keacakan tidak seragam. Pada setiap kenaikan ada peluang 50% untuk berhenti menambah.


3

Japt , 22/25 byte

Solusi pertama adalah untuk spek asli yang memiliki *<space>sebagai program kedua dan yang lain adalah untuk spek yang diperbarui yang mengubahnya secara sewenang-wenang <space>*</space>, dengan terima kasih kepada EoI untuk "perbaikan" yang disarankan.

Keduanya melempar kesalahan overflow saat memasuki loop tak terbatas dari program ketiga tetapi, secara teoritis, dengan memori yang cukup (yang dapat kita asumsikan untuk keperluan ), akan berjalan selamanya.

Å?¢?ß:2pHÉ ö:`HÁM Wld

Coba program 1
Coba program 2
Coba program 3

Å?UÎ>S?ß:2pHÉ ö:`HÁM Wld

Coba program 1
Coba program 2
Coba program 3


Saya pikir program kedua adalah "[SPACE] * [SPACE]", bukan "[SPACE] *", jadi program Anda tidak berfungsi
Perwujudan Ketidaktahuan

@EmbodimentofIgnorance, pada saat saya diposting, program kedua dalam spek itu *<space> . Tidak punya waktu untuk memperbarui sekarang.
Shaggy

Anda dapat memperbaikinya dalam tiga byte dengan UÌ>Salih - alih ¢pada terner kedua
Perwujudan Ketidaktahuan

@Downvoter, silakan beri hormat untuk memberikan komentar.
Shaggy

2

JavaScript (ES7), 66 byte

s=>s[1]?s<'!'?Math.random()*2**31|0:eval(`for(;;);`):'Hello World'

Cobalah online! (Halo Dunia)

Cobalah online! (angka acak)

Cobalah online! (loop tak terbatas)


Tidak akan x=(z=>x())&&x()bekerja untuk -1byte dari kode loop tak terbatas, dengan asumsi browser tanpa ukuran tumpukan panggilan maks?
Geza Kerecsenyi

@ GezaKerecsenyi Kita bisa menyebut diri kita sendiri ( seperti ini ) tapi saya tidak yakin itu bisa diterima.
Arnauld

itu adil. Saya bertanya-tanya apakah ada beberapa peramban yang tidak jelas di luar sana yang terus berjalan (setidaknya, sampai RAM habis)
Geza Kerecsenyi

1
@Arnauld, secara teoritis, itu akan berjalan selamanya diberi memori tak terbatas, yang dapat kita asumsikan sebagai kode golf.
Shaggy

2

Jelly , 23 21 byte

OS¹Ḃ¿ịØ%HX’;““½,⁾ẇṭ»¤

Cobalah online!

Tautan monadik yang mengambil argumen tunggal dan kembali Hello World, bilangan bulat 31 bit acak atau berulang tanpa batas sesuai spesifikasi.

Semua opsi: * * *+*

Penjelasan

O                     | Convert to codepoints
 S                    | Sum
  ¹Ḃ¿                 | Loop the identity function while odd 
     ị              ¤ | Index into the following as a nilad:
      Ø%              | - 2 ** 32
        H             | - Halved
         X            | - Random integer in the range 1..2**31
          ’           | - Decrease by 1 
           ;          | - Concatenated to:
            ““½,⁾ẇṭ»  |   - "", "Hello World"








1

Arang , 30 byte

W№θ*F⁼θ*≔Hello Worldθ∨θI‽X²¦³¹

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Menyalahgunakan format input default Charcoal yang terbelah pada spasi jika hanya ada satu baris, sehingga input angka acak sebenarnya tampak seperti tiga input. Penjelasan:

W№θ*

Ulangi sementara input pertama berisi a *.

F⁼θ*

Jika input pertama adalah satu- *satunya ...

≔Hello Worldθ

... lalu ganti dengan Hello World, sehingga menyebabkan loop berakhir. *+*tidak diganti, menghasilkan loop tak terbatas.

∨θ

Jika input pertama tidak kosong maka outputlah.

I‽X²¦³¹

Tetapi jika kosong maka output bilangan bulat acak dalam kisaran yang diinginkan.


1

Tambahkan ++ , 78 byte

z:"Hello World"
`y
xR2147483647
x:?
a:"*"
b:" * "
c:"*+*"
Ix=a,Oz
Ix=b,O
Wx=c,

Cobalah online!

Penjelasan

z:"Hello World"	; Set z = "Hello World"
`y		; Set y as the active variable
xR2147483647	; Set y to a random number between 0 and 2147483647
x:?		; Set x to the input
a:"*"		; Set a = "*"
b:" * "		; Set b = " * "
c:"*+*"		; Set c = "*+*"
Ix=a,		; If x == a then...
	Oz	;	...output z
Ix=b,		; If x == b then...
	O	;	...output y
Wx=c,		; While x == c then...
		;	...do nothing

1

Brachylog , 26 23 byte

l₃∈&hṢ∧2^₃₁-₁ṙw∨Ḥ⊇ᶠ³⁶tw

Cobalah online!

Mengambil program sebagai string melalui variabel input, dan mengabaikan variabel output. Sangat mengeksploitasi jaminan bahwa input hanya salah satu dari tiga program yang valid: setiap panjang-tiga input akan berperilaku seperti " * "atau "*+*"tergantung pada apakah karakter pertama adalah spasi, dan input lain akan berperilaku seperti apa "*".

l₃                         The input has length 3
  ∈                        and is an element of something,
   &h                      and the input's first element
     Ṣ                     is a space
  ∈                        (if not, try some other thing it's an element of),
      ∧2^₃₁-₁              so take 2,147,483,647 and
             ṙw            print a random number between 0 and it inclusive.
               ∨           If the input's length isn't 3,
                Ḥ⊇ᶠ³⁶tw    print the 36th subsequence of "Hello, World!".

Ups, salah "Hello World" - memperbaiki sekarang
Unrelated String

1

PHP , 51 byte

for(;'*'<$l=$argn[1];);echo$l?rand():'Hello World';

Cobalah online! (Halo Dunia)

Cobalah online! (Angka acak)

Cobalah online! (Infinite Loop)

Mengambil karakter input kedua yang dapat berupa '', '*'atau '+'. Dalam kasus '+'tersebut '*'<'+'akan menjadi kenyataan dan loop akan menjadi tak terbatas, yang lain, setelah loop, "Hello World" atau nomor acak ditampilkan. Secara rand()otomatis menampilkan angka antara 0 dan getrandmax()yang menggunakan didefinisikan RAND_MAXdalam pustaka C standar dan secara default ada 2147483647di sebagian besar platform / lingkungan, termasuk TIO.


1

05AB1E , 21 byte

'*KgDi[ë<ižIL<Ω딟™‚ï

Cobalah online. (CATATAN: Buildin acak cukup lambat dengan daftar besar, sehingga mungkin diperlukan beberapa saat sebelum hasilnya diberikan.)

Penjelasan:

'*K           '# Remove all "*" from the (implicit) input
   g           # Get the length of what's remain (either 0, 1, or 2)
    D          # Duplicate this length
     i         # If the length is exactly 1:
      [        #  Start an infinite loop
     ë<i       # Else-if the length is 2:
        žI     #  Push builtin 2147483648
          L    #  Create a list in the range [1,2147483648]
           <   #  Decrease each by 1 to make the range [0,2147483647]
            Ω  #  Pop and push a random value from the list
               #  (after which the top of the stack is output implicitly as result)
     ë         # Else:
      ”Ÿ™‚ï    #  Push dictionary string "Hello World"
               #  (after which the top of the stack is output implicitly as result)

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa ”Ÿ™‚ïadalah "Hello World".


1

Pyth , 32 byte

It/Jw\*#;?tlJOhC*4\ÿ"Hello World

Cobalah online!

Penjelasan (Python-ish)

I                                   # if 
  /Jw\*                             #    (J:=input()).count("*"))
 t                                  #                             - 1:
       #;                           #     try: while True: pass;except: break;
         ?                          # if (ternary)
           lJ                       #    len(J):
             O                      #     randInt(0,                    )
               C                    #                int(     , 256)
                *4\ÿ                #                    4*"ÿ"
              h                     #                                + 1
                    "Hello World    # else: (implicitly) print "Hello World"

Ini mencetak angka antara 0 dan 2 ^ 32, bukan 0 dan 2 ^ 31. Cara yang lebih singkat untuk menulis hC*4\ÿadalah ^2 32, tetapi agar solusinya benar, Anda harus menggunakannya ^2 31. Selain itu, gunakan zalih-alih Jw, menghemat 1 byte lagi. Dan penjelasan Anda melewati batas dengan ttepat sebelumnya lJ.
randomdude999

Selain itu, Anda dapat mendeteksi perintah "loop forever" dengan memeriksa apakah input berisi +karakter apa pun , menyimpan 1 byte karena Anda tidak perlu menguranginya.
randomdude999

0

APL (Dyalog Unicode) , 39 byte SBCS

Lambda awalan anonim.

{'+'∊⍵:∇⍵⋄' '∊⍵:⌊2E31×?0'Hello World'}

Cobalah online!

{ "dfn"; adalah argumennya:

'+'∊⍵: jika plus adalah anggota argumen:

  ∇⍵ Ekor berulang pada argumen

' '∊⍵ jika ruang adalah anggota argumen:

  ?0 float acak (0–1)

  2E31× skala ke (0–2³¹)

   lantai

'Hello World' lain kembalikan string


0

Commodore BASIC (VIC-20, C64, TheC64Mini dll) - 170 tokenize byte BASIC

 0a%=32767:goS9:b$=leF(b$,len(b$)-1):ifb$="*"tH?"hello world
 1ifb$=" * "tH?int(rN(ti)*a%)
 2ifb$="*+*"tHfOi=.to1:i=.:nE
 3end
 9b$="":fOi=.to1:geta$:i=-(a$=cH(13)):b$=b$+a$:?a$;:nE:reT

Saya pikir untuk melakukan ini dengan lebih akurat, saya harus mempelajari dunia aneh 6502 bahasa rakitan, tetapi ini adalah konsep pertama.

Poin pertama, INPUTkata kunci dalam Commodore BASIC mengabaikan spasi putih, sehingga sub-rutin pada baris 9adalah cara cepat dan kotor untuk menerima entri keyboard termasuk spasi.

Poin kedua, Commodore BASIC integer memiliki kisaran 16-bit yang ditandatangani, jadi -32768 hingga +32767 sumber - jadi saya menyimpan nomor acak yang dihasilkan termasuk 0 - 32767


0

Gelisah ,143 135 byte

Saya bukan pegolf yang baik ... RNG menghasilkan nilai yang sama setiap kali karena ini adalah generator angka pseudo-acak.

Fn.new{|a|
import"random"for Random
if(a=="*+*"){
while(1){}
}else System.write(a[0]==" "?Random.new(9).int((1<<31)-1):"Hello World")
}

Cobalah online!


0

JavaScript, 63 Bytes, tanpa rekursif tanpa batas

s=>s[1]?Math.random()*2**31|eval("while(s>'!');"):'Hello World'

jaringan buruk sehingga tidak ada tautan TIO

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.