* 통역사 작성


20

작업은 간단합니다. 언어에 대한 통역사를 작성하십시오 * .

다음은 위키에 대한 더 큰 링크입니다.

유효한 * 프로그램은 세 가지뿐입니다.

  • * "Hello World"인쇄
  •  *  0과 2,147,483,647 사이의 난수를 인쇄합니다
  • *+* 영원히 실행됩니다.

세 번째 경우는 이 질문 의 사양에 따라 무한 루프 여야합니다

입력:

  • 입력은 표준 I / O 규칙에 따라 허용되는 입력 방법을 통해 취할 수 있습니다
  • 항상 위의 프로그램 중 하나입니다

산출:

  • 첫 번째 경우는 Hello World후행 줄 바꿈과 함께 또는없이 정확하게 인쇄해야합니다 .
  • 두 번째 경우, 언어의 정수 최대 값이 2,147,483,647보다 작은 경우 언어의 정수 최대 값을 사용하십시오
  • 첫 번째 및 두 번째 경우는 표준 I / O 규칙에 따라 허용되는 출력으로 인쇄 할 수 있습니다.
  • 세 번째 경우에는 출력이 없어야합니다.

채점 :

이것이 이므로 가장 짧은 대답은 바이트 단위입니다.


7
' 0와 '사이에 말할 때 2,147,483,647, 그것은 포괄적이거나 독점적입니까? (예 : 0유효한 출력입니까?)
Chas Brown

7
도전 과제를 게시하고 기존 솔루션을 무효화 한 후 사양을 변경하는 것은 자동으로 수행됩니다 -1.
얽히고 설킨

2
난수를 생성하는 기본 제공 방법이없는 언어의 경우 "난수 인쇄"요구 사항을 만족시키는 방법이 있습니까?
Tanner Swett

2
언어의 정수가 없거나 더 높으면 최대 값을 더 높게 사용할 수 있습니까?
Jonathan Allan

7
@Shaggy SE 마크 다운 렌더러가 렌더링하지 않았지만 원래의 방문을보고 있기 때문에 질문에 대한 위키에서 규칙이 변경되지 않고 공백이 아닌 공간 (마크 다운 탭 확인)에만 공백이 나타납니다. 일반 공간이어야한다는 것이 확실합니다. "해킹"은 SE 마크 다운 렌더러 문제에 대해서만 수행됩니다
Ferrybig

답변:


20

* , 0 바이트


*에는 입력을 읽을 수있는 방법이 없으므로 기본 규칙에 따라 입력을 프로그램에 연결하여 입력을 제공 하도록 지정할 수 있습니다 .

(... 생각합니다. " 확인할 담당자가없는 "공감대보다 적어도 두 배의 공감대 " 조건이 있습니다).


4
링크 된 메타는 실제로 현재 허용되는 사이트 표준입니다 (+ 31-7).
Jonathan Allan

2
@A__ : 그것은 누군가가 제안한 '프로그래밍 언어'에 대한 정의 를 만족시키기 위해 특별히 고안된 것 같습니다 ( "안녕하세요 세계를 쓸 수 있습니다!" '항상 같은 일을하는 것은 아닙니다!').
Henning Makholm

기술적으로 Malbolge는 프로그래밍 언어가 아니라고 생각합니다.
밥 얀센

1
Malbolge는 *와 같은 유한 오토마타를위한 프로그래밍 언어이며, 예를 들어 Befunge-93입니다. 따라서 Malbolge는 *와 같은 형식적인 프로그래밍 언어이며, 프로그래밍 언어 정의에있어 기술적으로는 재귀 적으로 열거 가능한 언어와 동일합니다 (공식 언어는 덜 강력하지만).
Krzysztof Szewczyk

저에서 Downvote, 정직,이 대답은 그래서 그것은 이미 사실이다 지루하기 때문에 표준 허점 우리가 *는 프로그래밍 언어인지 질문을 무시하더라도
AlienAtSystem

8

R , 69 바이트

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

온라인으로 사용해보십시오!

switch명명 된 인수를 일치시키고 일치하지 않으면 첫 번째 이름이없는 첫 번째 이름을 선택합니다.이 경우 무한 루프 repeat{}입니다.


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에게 감사합니다.

LSB가 설정되어 있으면 두 번째 문자 만 확인하면됩니다 +(따라서 프로그램이 " *+*"). 프로그램이 반복됩니다. 그 후 NUL프로그램이 "이면 프로그램은" *"이고 표시됩니다 Hello World. 그렇지 않으면 임의의 값 ( "  * ", 남은 유일한 다른 옵션)이 표시됩니다.

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

온라인으로 사용해보십시오!



바이트를 면도 :f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
로마 Odaisky

Pedantic note : rand충분히 큰 값을 반환한다고 보장 할 수는 없습니다. RAND_MAXINT_MAX(예를 들어, 비주얼 스튜디오, 그리고 실제 컴파일러에없는 동일하게 보장 할 수 없습니다 RAND_MAX입니다 32767동안 INT_MAX이다 [현대 x86에서 시스템을 파생]를 2147483647영업의 질문에 지정된 값).
ShadowRanger

@ShadowRanger 완전히 사실이지만 모든 C 기반 CGCC 항목의> 90 %가 정의되지 않은 지정되지 않은 동작에 의존한다는 점을 고려하면 걱정할 필요가 없습니다! 또한 오늘날 코드 골프 LCG를 구현하고 싶지 않았습니다. :-)
ErikF

5

파이썬 2 , 103 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).
Chas Brown

while'*'<i
Jonathan Allan

로 변경 randrange(2**31)하여 다른 바이트를 저장하십시오 getrandbits(31)(후자는 long, not을 반환 int하지만 양식이 아닌 양식 print을 인쇄 하므로 후행 이 없습니다). strreprL
ShadowRanger

사이트에 대해 상대적으로 경험이 없으므로 빠른 설명 : 입력을 인용해야합니까? i=input()입력이 따옴표로 묶인 경우에만 작동합니다. 단지 plain 입력 하면 암시 적 포함 되기 때문에 */ * /*+*죽습니다 . 입력해야합니다 (또는 대신 큰 따옴표와 동일). 나는 이것을 허용 하는 표준 I / O 규칙 에서 명백한 것을 보지 못했습니다 . 이는 4 바이트의 비용이 필요하다는 것을 의미합니다 . SyntaxErrorinputeval'*'/' * '/'*+*'raw_input()
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"에 쉼표 나 느낌표가 필요하지 않습니다.
2

1
이제 나는 여기서 일반적으로 도전에 답하기 위해 인기없는 다른 언어를 배워야합니다.
A̲̲

1
-1 바이트 : TIO를 . Keg에서 골프를 할 수있는 능력을 잃지 않았기 때문에 기쁩니다.

@A__ 술통이 TIO에서 즐기는 것을 즐기십니까?
Jono 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

apt , 22/25 바이트

첫 번째 솔루션은 *<space>두 번째 프로그램으로 사용 되었던 원래 사양에 대한 것이고 다른 하나는 <space>*</space>제안 된 "수정"에 대한 EoI 덕분에 임의로 사양을 변경 한 업데이트 된 사양에 대한 것입니다.

둘 다 세 번째 프로그램의 무한 루프에 들어가면 오버플로 오류가 발생하지만 이론적으로 충분한 메모리 ( 목적으로 가정 할 수 있음)가 있으면 영원히 실행됩니다.

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

프로그램 1을
보십시오 프로그램 2를
보십시오

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

프로그램 1을
보십시오 프로그램 2를
보십시오


나는 두 번째 프로그램이 "[SPACE] * [SPACE]"이 아닌 "[SPACE] *"프로그램이 작업을하지 않도록 생각
예 무지의

내가 게시 할 당시 @EmbodimentofIgnorance는 사양의 두 번째 프로그램 이었습니다 *<space> . 지금 업데이트 할 시간이 없습니다.
덥수룩 한

두 번째 삼진 UÌ>S대신 에 3 바이트로 고칠 수 있습니다¢
무지의 구현

@Downvoter, 의견을 남겨주십시오.
얽히고 설킨

2

자바 스크립트 (ES7), 66 바이트

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

온라인으로 사용해보십시오! (안녕하세요)

온라인으로 사용해보십시오! (임의의 숫자)

온라인으로 사용해보십시오! (무한 루프)


x=(z=>x())&&x()없이 최대 호출 스택의 크기가 브라우저를 가정, 무한 루프 코드에서 -1byte 작동하지?
Geza Kerecsenyi

@GezaKerecsenyi 우리는 ( 이와 같이 ) 우리 자신을 부를 수는 있지만 그것이 받아 들여질 지 확신 할 수 없습니다.
Arnauld

공정 해. 나는 (계속해서 RAM이 다 떨어질 때까지) 계속되는 애매한 브라우저가 있는지 궁금합니다.
Geza 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

PowerShell, 60 , 56 바이트

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

꽤 바보 같은 버전, 여기에서 유일한 골프 기술은 생략 Get-하고 Get-Random있습니다.

UPD. veskah 덕분에 따옴표를 제거하여 56 바이트로 줄였습니다 !







1

, 30 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 한 줄만 있으면 공백으로 분할되는 Charcoal의 기본 입력 형식을 남용하므로 임의의 숫자 입력은 실제로 세 개의 입력처럼 보입니다. 설명:

W№θ*

첫 번째 입력에가 포함되어있는 동안 반복하십시오 *.

F⁼θ*

첫 번째 입력이 *유일한 경우 ...

≔Hello Worldθ

...로 바꾸면 Hello World루프가 종료됩니다. *+*교체되지 않아 무한 루프가 발생합니다.

∨θ

첫 번째 입력이 비어 있지 않으면 출력합니다.

I‽X²¦³¹

그러나 비어 있으면 원하는 범위의 임의의 정수를 출력하십시오.


1

추가 ++ , 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

Brachylog , 26 23 바이트

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

온라인으로 사용해보십시오!

입력 변수를 통해 프로그램을 문자열로 취하고 출력 변수를 무시합니다. 입력이 오직 세 가지 유효한 프로그램 중 하나입니다 심하게 보증을 이용 : 어떤 길이 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';

온라인으로 사용해보십시오! (안녕하세요)

온라인으로 사용해보십시오! (랜덤 번호)

온라인으로 사용해보십시오! (무한 루프)

있을 수있는 입력의 두 번째 문자를 취하고 '', '*'또는 '+'. 의 경우 '+'(가) '*'<'+'다른, 진실되고 루프가 무한 할 것이다, 루프 후, "안녕하세요"또는 임의의 번호가 표시됩니다. 는 rand()자동으로 0과 사이의 값 출력 getrandmax()정의 용도 RAND_MAX표준 C 라이브러리 및 디폴트로 2147483647TIO 포함한 대부분의 플랫폼 / 환경에서.


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

0과 2 ^ 31이 아닌 0과 2 ^ 32 사이의 숫자를 인쇄합니다. 작성하는 더 짧은 방법 hC*4\ÿ은입니다 ^2 32. 그러나 솔루션이 정확하려면 ^2 31대신 사용해야 합니다. 또한 z대신에를 사용 Jw하면 1 바이트가 더 절약됩니다. 그리고 당신의 설명은 t직전 의 줄을 건너 뜁니다 lJ.
randomdude999

또한 입력에 +문자 가 포함되어 있는지 여부를 확인하여 "영원히 반복"명령을 감지 할 수 있으며 ,이를 감소시킬 필요가 없으므로 1 바이트를 절약합니다.
randomdude999

0

APL (Dyalog Unicode) , 39 바이트 SBCS

익명 접두사 람다.

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

온라인으로 사용해보십시오!

{ "dfn"; 인수는 다음과 같습니다.

'+'∊⍵: plus가 인수의 구성원 인 경우 :

  ∇⍵ 논쟁에 꼬리 재귀

' '∊⍵ 공간이 인수의 구성원 인 경우 :

  ?0 랜덤 플로트 (0–1)

  2E31× (0–2³¹)로 스케일

   바닥

'Hello World' 그렇지 않으면 문자열을 반환


0

코모도 베이직 (VIC-20, C64, TheC64Mini 등)-170 베이직 바이트

 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 어셈블리 언어의 이상한 세계를 탐구해야 할 것이지만 이것은 초안이다.

첫째, INPUTCommodore BASIC 의 키워드는 공백을 무시하므로 하위 행의 줄9 공백을 포함한 키보드 입력을 쉽고 빠르게 처리 할 수있는 방법입니다.

두 번째로, Commodore 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

자바 스크립트, 63 바이트, 무한 재귀 없음

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

네트워크가 불량하므로 TIO 링크가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.