*の通訳を書く


20

タスクは簡単です。言語*のインタープリターを作成します。

wikiへのより大きなリンクがあります。

有効なプログラムは3つだけです:

  • * 「Hello World」を印刷します
  •  *  0〜2,147,483,647の乱数を出力します
  • *+* 永遠に実行します。

3番目のケースは、この質問の仕様に従った無限ループでなければなりません

入力:

  • 入力は、標準のI / Oルールで受け入れ可能な任意の入力方法で取得できます。
  • 上記のプログラムのいずれかになります

出力:

  • 最初のケースではHello World、末尾の改行の有無にかかわらず、正確に印刷する必要があります。
  • 2番目の場合、言語の整数の最大値が2,147,483,647より小さい場合は、言語の整数の最大値を使用します
  • 最初と2番目のケースは、標準のI / Oルールで受け入れ可能な出力に出力できます。
  • 3番目のケースでは、出力は行われません。

得点:

これはであるため、バイト単位の最短回答が勝ちです。


7
あなたは「の間に言うとき02,147,483,647」、それが含むか含みませんか?(たとえば、0有効な出力ですか?)
Chas Brown

7
チャレンジを投稿して既存のソリューションを無効にした後に仕様を変更することは、-1私からの自動です。
シャギー

2
乱数を生成する方法が組み込まれていない言語の場合、「乱数を出力する」要件を満たすための許容可能な方法はありますか?
タナースウェット

2
私たちの言語の整数が最大値を持たないか、より高い場合、より高い上限を使用できますか?
ジョナサンアラン

7
@Shaggy私は質問のウィキでルールの変更は見ていません、ブレークしないスペースへのスペースのみです(マークダウンタブをチェックしてください)。 、通常のスペースである必要があることは明らかであり、「ハック」はSE
マークダウン

回答:


20

*、0バイト


*には入力を読み取る方法がないため、デフォルトのルールでは、入力をプログラムに連結することで入力を指定する必要があることを指定できます。

(...私は思う。「少なくとも投票数の2倍の投票数がある」という条件があり、それを確認する担当者がいない。)


4
あなたのリンクされたメタは確かに現在受け入れられているサイト標準(+31 -7)です。
ジョナサンアラン

2
@A__:誰かが提案した「プログラミング言語」の定義を満たすように特別に設計されたに違いないようです(「こんにちは世界を書くことができます!」「無限ループを書くことができます!」 「いつも同じことをしないでください!」)。
ヘニングマクホルム

技術的には、Malbolgeはプログラミング言語ではないと考えています。
ボブ・ヤンセン

1
Malbolgeは、*、Befunge-93などと同じ、有限オートマトン用のプログラミング言語です。したがって、Malbolgeは、*と同じ形式のプログラミング言語であり、プログラミング言語の定義に関しては、再帰的に列挙可能な言語と技術的に同じです(形式言語はそれほど強力ではありませんが)。
クシシュトフシェフチク

正直、この答えはそう、それはすでに実際だ退屈されるので、私からDownvote、標準抜け穴我々はプログラミング言語である*かどうかの問題を無視した場合でも、
AlienAtSystem


6

ゼリー 21  20バイト

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

文字のリストを受け入れる単項リンク。

オンラインでお試しください!

vL’... 動作します(以下を参照)。

どうやって?

Ḋ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"

代替案

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バイト

-3バイトのattinatに感謝します。

2番目の文字だけをチェックする必要があります。LSBが設定されている場合、それは+(したがってプログラムは " *+*")であり、プログラムはループします。その後、それがの場合NUL、プログラムは " *"で、表示しHello Worldます。それ以外の場合は、ランダムな値が表示されます( "  * "、残りの唯一のオプション)。

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

オンラインでお試しください!



1バイトf(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
削る

注意事項:rand十分に大きな値を返すことは保証されていません。RAND_MAXまたINT_MAX、同じであることが保証されていません(また、実世界のコンパイラ、たとえばVisual StudioのRAND_MAXis 32767ではなく、INT_MAX[現代のx86派生システムで] 2147483647はOPの質問で指定された値です)。
ShadowRanger

@ShadowRangerそれは完全に真実ですが、すべてのCベースのCGCCエントリの90%以上が未定義および不特定の動作に依存していることを考えると、私はそれについて心配していません!また、今日、コードゴルフLCGを実装する気もしませんでした。:-)
ErikF

5

パイソン2103の 93 89 87バイト

以前の回答とChas Brownsの回答を組み合わせて、数バイト短くしました。

乱数は、0〜2 ** 31-1の範囲にあります。

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

オンラインでお試しください!

以前のバージョン:

103バイト

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

93バイト

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

に置き換えrandint(0,2**31-1)て2バイト節約しますrandrange(2**31)
チャスブラウン

while'*'<iセーブ2
ジョナサンアラン

変化させることにより、別のバイトに保存randrange(2**31)するgetrandbits(31)(後者戻りlong、ないintが、print印刷されstrた形態ではなく、reprフォームをので、トレーリングはL存在しません)。
ShadowRanger

サイトに比較的慣れていないため、迅速な説明:入力を引用するよう要求できますか?i=input()入力のみが引用されている場合、あなただけの入力平野場合、作品*/ * /*+*、それがで死ぬSyntaxError(ので、input暗黙的を含んでeval)。入力する必要があります'*'/' * '/'*+*'(または、代わりに二重引用符を使用した同等の値)。これを許可する標準I / Oルール明らかなものはありませんでした。つまりraw_input()、4バイトのコストが必要になる可能性があります。
ShadowRanger

@ShadowRanger input()は文字列を入力として受け取り、評価します。入力に実際に追加するのではなく、単に入力として文字列を使用するだけで、文字列には引用符があります。これはかなり標準的なもの[1,2,3]で、区切り文字列としてではなく、分割して解析する必要のある配列を取得できるのと同じ方法です。このサイトの目標は、入力を厳密にすることではなく、I / Oを簡単にして、手元の課題にコードを集中できるようにすることです。
mbomb007

5

-lp-ir 30の 26 25 24 20 19バイト

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

フラグを使用して-1バイト

オンラインでお試しください!

回答履歴

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

オンラインでお試しください!

Hello World辞書文字列に短縮

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

オンラインでお試しください!

ケグの力に驚かされることはありませんでした。保存された別のバイトに対するユーザーEdgyNerdへのクレジット。

以前のバージョン

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

オンラインでお試しください!

保存された余分なバイトに対するユーザーA__のクレジット。

古いバージョン

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

基本的に、入力プログラムを受け取り、以下を実行します。

  • 入力長が1かどうかを確認し、trueの場合は「Hello World」を出力します
  • 最後の文字がスペースかどうかを確認し、乱数を出力します
  • それ以外の場合は、無限ループを実行します

次に、スタックを暗黙的に印刷します。

?                               #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.

Hello Worldは句読点を必要としないため、4バイト節約されました。

オンラインでお試しください!古いバージョン

オンラインでお試しください!新しいバージョン


4バイトを切り捨てることができます。「Hello World」のコンマや感嘆符は必要ありません。
TheOnlyMrCat

1
ここでの課題に普通に答えるために、私は別の不人気な言語を学ばなければなりません。
A̲̲

1
-1バイト:TIOを。ケグでゴルフをする能力を失いなかったことを嬉しく思います。
A̲̲

@A__ TIOで樽を楽しんでいますか?
ジョノ2906


3

Befunge-93、54バイト

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

オンラインでお試しください!

注釈付き:

~"*"-                      _                ~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

ランダム性は均一ではありません。増分ごとに、増分を停止する可能性が50%あります。


3

Japt、22/25バイト

最初の解決策は*<space>、2番目のプログラムとしてあった元の仕様に対するものであり、もう1つは<space>*</space>、推奨される「修正」に対するEoIのおかげで、それを任意に変更した更新された仕様に対するものです。

どちらも、3番目のプログラムの無限ループに入るとオーバーフローエラーをスローしますが、理論的には、十分なメモリ(目的で想定される)があれば、永久に実行されます。

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

プログラム1を
試すプログラム2を
試すプログラム3を試す

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

プログラム1を
試すプログラム2を
試すプログラム3を試す


私は2番目のプログラムがあると思う「[SPACE] * [SPACE]」ではなく、「[SPACE] *」、あなたのプログラムが作業をしないように
無知の実施の形態

@EmbodimentofIgnorance、私が投稿した時点では、仕様の2番目のプログラムはでした *<space>。今すぐ更新する時間はありません。
シャギー

2番目の3進数ではUÌ>Sなく、3バイトで修正できます¢
無知の具体化

@Downvoter、コメントを残すために礼儀を持ってください。
シャギー

2

JavaScript(ES7)、66バイト

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

オンラインでお試しください!(こんにちは世界)

オンラインでお試しください!(乱数)

オンラインでお試しください!(無限ループ)


考えx=(z=>x())&&x()なし最大コールスタックサイズでブラウザを想定すると、無限ループコードから-1byteのために動作しませんか?
ゲザケレクセニー

@GezaKerecsenyi私たちは(このように)自分自身を呼び出すことができますが、それが受け入れられるかどうかはわかりません。
アーナウド

それは公正です。ちょうど行く(少なくとも、RAMがなくなるまで)が保持していることから、いくつかのあいまいなブラウザがあるのだろうか
下座Kerecsenyi

1
@Arnauldは、理論的には、無限のメモリが与えられると永久に実行されます。
シャギー

2

ゼリー23 21バイト

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

オンラインでお試しください!

単一の引数を取り、Hello Worldランダムな31ビット整数を返す、または仕様に従って無限にループするモナドリンク。

すべてのオプション: * * *+*

説明

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"


2

Pythonの291の 89 88バイト

from random import*
def f(p):
 while'*'<p:p
 print['Hello World',getrandbits(31)][p<'!']

オンラインでお試しください!

ジョナサンアランのおかげで2バイト。ShadowRangerへの1バイトの送信


while'*'<pセーブ2
ジョナサンアラン

getrandbits(31)を1バイト節約しますrandrange(2**31)
ShadowRanger

いいね!getrandbitsについて知りませんでした...
Chas Brown

2

PowerShellの、60、56のバイト

switch($args){*{'Hello World'}' * '{random}*+*{for(){}}}

かなり馬鹿げたバージョンで、ここでの唯一のゴルフテクニックはで省略Get-していGet-Randomます。

UPD。veskahのおかげで、引用符を削除することで56バイトに削減さました







1

、30バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。1行しかない場合、スペースで分割されるCharcoalのデフォルトの入力形式を悪用します。したがって、乱数入力は実際には3つの入力のように見えます。説明:

W№θ*

最初の入力にが含まれている間繰り返します*

F⁼θ*

最初の入力が*唯一の場合...

≔Hello Worldθ

...その後、に置き換えてHello World、ループを終了します。*+*置き換えられないため、無限ループになります。

∨θ

最初の入力が空でない場合は、出力します。

I‽X²¦³¹

ただし、空の場合は、希望する範囲のランダムな整数を出力します。


1

Add ++、78バイト

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

オンラインでお試しください!

説明

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

Brachylog26 23バイト

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

オンラインでお試しください!

入力変数を介してプログラムを文字列として受け取り、出力変数を無視します。入力が3つの有効なプログラムのいずれか1つに過ぎないという保証を大幅に活用します。長さ3の入力は、最初の文字がスペースであるかどうかに応じて、" * "または"*+*"他の入力はのように動作します"*"

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!".

おっと、間違った「Hello World」-今すぐ修正
無関係な文字列

1

PHP、51バイト

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

オンラインでお試しください!(こんにちは世界)

オンラインでお試しください!(乱数)

オンラインでお試しください!(無限ループ)

することができ、入力の2番目の文字を取り'''*'または'+'。の場合はtrueになり、ループは無限になります。そうでない場合は'+''*'<'+'ループの後、「Hello World」または乱数が表示されます。はrand()、0から標準Cライブラリでgetrandmax()定義さRAND_MAXれた値を自動的に出力します。デフォルトでは2147483647、TIOを含むほとんどのプラットフォーム/環境で使用されます。


1

05AB1E、21 バイト

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

オンラインでお試しください。(注:ランダムビルトインは大きなリストではかなり遅いため、結果が表示されるまでに時間がかかる場合があります。)

説明:

'*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)

(セクション鉱山のこの05AB1Eチップを参照してください。辞書を使用する方法?理由を理解すること”Ÿ™‚ïです"Hello World"


1

Pyth、32バイト

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

オンラインでお試しください!

説明(Python風)

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"

これは、0と2 ^ 31ではなく、0と2 ^ 32の間の数値を出力します。短い書き方hC*4\ÿ^2 32ですが、解を正しくするために^2 31代わりに使用する必要があります。また、のz代わりに使用するとJw、さらに1バイト節約できます。そして、あなたの説明はt直前の行をスキップしますlJ
randomdude999

また、入力に+文字が含まれているかどうかをチェックすることで「loop forever」コマンドを検出できます。1バイトを節約するのは、デクリメントする必要がないためです。
randomdude999

0

APL(Dyalog Unicode)、39 バイトSBCS

匿名プレフィックスラムダ。

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

オンラインでお試しください!

{ 「dfn」; 引数です:

'+'∊⍵: plusが引数のメンバーである場合:

  ∇⍵ 引数の末尾再帰

' '∊⍵ スペースが引数のメンバーである場合:

  ?0 ランダムフロート(0–1)

  2E31× (0–2³¹)にスケーリング

   床

'Hello World' それ以外の場合は、文字列を返します


0

コモドールBASIC(VIC-20、C64、TheC64Miniなど)-170トークン化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

これをより正確に行うには、6502アセンブリ言語の奇妙な世界を掘り下げなければなりませんが、これは最初のドラフトです。

まずINPUT、Commodore BASIC のキーワードは空白を無視するため、行のサブルーチンは9は、スペースを含むキーボードエントリをすばやく受け入れる方法です。

2番目のポイントは、コモドールBASIC整数の範囲が16ビットであるため、-32768〜+32767のソースです。したがって、生成される乱数は0〜32767の範囲で生成されます。


0

レン143 135バイト

私はゴルファーではありません...それは擬似乱数ジェネレーターであるため、RNGは毎回同じ値を生成します。

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")
}

オンラインでお試しください!


0

JavaScript、63バイト、無限再帰なし

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

悪いネットワークなので、TIOリンクはありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.