Написати перекладача для *


20

Завдання проста. Напишіть перекладач для мови * .

Ось більший посилання на вікі.

Є лише три дійсні * програми:

  • * Друкує "Hello World"
  •  *  Друкує випадкове число між 0 і 2,147,483,647
  • *+* Працює назавжди.

Третій випадок повинен бути нескінченним циклом відповідно до специфікацій цього питання

Вхід:

  • Введення можна приймати будь-яким прийнятним методом введення за нашими стандартними правилами вводу / виводу
  • Це завжди буде однією з перерахованих вище програм

Вихід:

  • Перший випадок повинен друкуватися точно Hello World, з або без розриву кінцевої лінії.
  • У другому випадку, якщо максимальне число вашої мови менше 2,147,483,647, використовуйте цілий максимум вашої мови
  • Перший і другий регістри можуть друкувати на будь-який прийнятний вихід за нашими стандартними правилами вводу / виводу.
  • Третій випадок не повинен давати жодного результату.

Оцінка:

Оскільки це , виграє найкоротша відповідь у байтах.


7
Коли ви говорите "між 0і 2,147,483,647", це все включено чи виключно? (Наприклад, чи 0дійсний вихід?)
Час Браун

7
Зміна специфікації після публікації виклику та вимкнення існуючих рішень - це автоматичний -1мене.
Кудлатий

2
Для мов, які не мають вбудованого способу генерації випадкових чисел, чи є прийнятний спосіб задовольнити вимогу "надрукувати випадкове число"?
Таннер Світт

2
Якщо цілі числа нашої мови не мають, або більше, максимум, ми можемо використовувати верхню верхню межу?
Джонатан Аллан

7
@Shaggy Я не бачу жодних змін у вікі для питання, лише пробіл до нерозбивного простору (перевірте вкладку розмітки), тому що рендер-маркер SE не виводив його, але дивився на оригінальну ревізію , зрозуміло, що це повинні бути звичайні простори, і "хак" робиться лише для питань
відмітки відмітки

Відповіді:


20

* , 0 байт


Оскільки * не має можливості зчитувати введення, правила за замовчуванням дозволяють уточнювати, що вхід повинен бути наданий шляхом об'єднання його в програму .

(... Я думаю. Існує умова "принаймні вдвічі більше обновлених результатів, ніж рейтингових записів", що я не маю відповіді для підтвердження).


4
Ваша пов'язана мета - це справді прийнятий стандарт сайту (+31 -7).
Джонатан Аллан

2
@A__: Мені здається, це, мабуть, було розроблено спеціально для задоволення запропонованого чиїсь визначення поняття "мова програмування" ("Ви можете написати світ привіт!" "Ви можете написати нескінченний цикл!" "Ви можете написати програму, яка не робить "не роби те саме!").
hmakholm залишив Моніку

Я вважаю, що технічно Malbolge тоді теж не є мовою програмування.
Боб Янсен

1
Malbolge - це мова програмування для кінцевих автоматів, така сама як *, і, наприклад, Befunge-93. Тому Malbolge - формальна мова програмування, така ж як *, технічно така ж, як і рекурсивно перелічені мови, коли мова йде про визначення мови програмування (хоча формальні мови менш потужні).
Кшиштоф Шевчик

Від мене зворотне слово, бо, чесно кажучи, ця відповідь настільки нудна, що насправді вже є стандартною лазівкою , навіть якщо ми ігноруємо питання, чи є * мова програмування
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 байт

Завдяки attinat за -3 байти.

Мені залишається лише перевірити другий символ: якщо встановлений LSB, він є +(таким чином програма є " *+*") і програма циклічно. Після цього, якщо це a 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());}
Поголіть

Педантична нота: randне гарантується повернення досить великого значення; RAND_MAXі INT_MAXне гарантується, що вони будуть однаковими (і не є у компіляторах реального світу, наприклад, Visual Studio - RAND_MAXце значення, вказане в питанні ОП) 32767, а INT_MAXв сучасних системах, отриманих x86 2147483647).
ShadowRanger

@ShadowRanger - це абсолютно правда, але враховуючи, що> 90% усіх записів CGCC на базі C покладаються на невизначене та не визначене поведінку, я про це не переживаю! Я також не відчував, як сьогодні реалізую LCG з кодом для гольфу :-)
ErikF

5

Пітон 2 , 103 93 89 87 байт

Я поєднав свою попередню відповідь із записом Часа Браунаса відповіддю і отримав - то кілька байт коротше.

Випадкове число буде становити від 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]

Збережіть 2 байти, замінивши randint(0,2**31-1)на randrange(2**31).
Час Браун

while'*'<iрятує 2
Джонатан Аллан

Збережіть інший байт, змінивши randrange(2**31)на getrandbits(31)(останній повертається long, ні int, але printбуде друкувати strформу, а не reprформу, тому трейлінг Lтам не буде).
ShadowRanger

Відносно недосвідчений із сайтом, тому швидке роз'яснення: Чи дозволяється вам вимагати цитування ваших даних? i=input()працює лише в тому випадку, якщо цитати вводяться, якщо ви просто введете звичайний текст */ * /*+*, він загине за допомогою SyntaxError(оскільки inputвключає неявне eval); вам потрібно буде ввести '*'/' * '/'*+*'(або еквівалент замість цього подвійних лапок). Я не бачив нічого очевидного в стандартних правилах вводу / виводу, які б це дозволяли, що може означати, що вам потрібно буде користуватися raw_input(), коштуючи чотири байти.
ShadowRanger

@ShadowRanger input()бере рядок як вхідний і оцінює його. Я насправді не додаю до вводу, я просто беру рядок як вхід, а рядки мають лапки. Це досить стандартно, так само, як я можу приймати масив, як [1,2,3]замість розмежованого рядка, який мені потім доведеться розділити та проаналізувати. Мета сайту - не робити введення суворим, це зробити полегшенням вводу / виводу, щоб ми могли зосередити код на проблемі.
mbomb007

5

Keg , -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, друкуючи "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.

Збережено 4 байти через те, що привіт світу не потрібен розділовий знак.

Спробуйте в Інтернеті! Стара версія

Спробуйте в Інтернеті! Нова версія


Ви можете відрізати 4 байти, вам не потрібні кома чи знак оклику в "Hello World".
TheOnlyMrCat

1
Тепер я повинен вивчити ще одну непопулярну мову, щоб нормально відповідати на виклики.

1
-1 байт: TIO . Я радий, що не втратив здатності займатися гольфом у Кегу.

@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

Japt , 22/25 байт

Перше рішення - для оригінальної специфікації, яка мала *<space>другу програму, а друга - для оновленої специфікації, яка довільно змінила її <space>*</space>, завдяки EoI за запропоновану "виправлення".

Обидва кидають помилку переповнення при вході в нескінченний цикл третьої програми, але теоретично, з достатньою кількістю пам'яті (яку ми можемо припустити для цілей ), буде працювати назавжди.

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

Спробуйте програму 1
Спробуйте програму 2
Спробуйте програму 3

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

Спробуйте програму 1
Спробуйте програму 2
Спробуйте програму 3


Я думаю, що друга програма - "[SPACE] * [SPACE]", а не "[SPACE] *", тому ваша програма не працює
Втілення Незнання

@EmbodimentofIgnorance, коли я публікував, друга програма в специфікації була *<space> . Не встигайте зараз оновити.
Кудлатий

Ви можете виправити це в три байти, UÌ>Sа не ¢на другому трійці
Втілення Незнання

@Downvoter, будь ласка, будь ласка, залиште коментар.
Кудлатий

2

JavaScript (ES7), 66 байт

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

Спробуйте в Інтернеті! (Привіт Світ)

Спробуйте в Інтернеті! (випадкове число)

Спробуйте в Інтернеті! (нескінченна петля)


Чи x=(z=>x())&&x()не працював би -1 байт від нескінченного коду циклу, якщо припустити, що браузер не має максимального розміру стека виклику?
Геза Кереценний

@GezaKerecsenyi Ми могли би просто назвати себе ( як це ), але я не впевнений, що це було б прийнятно.
Арнольд

це справедливо. Цікаво, чи є там якийсь незрозумілий браузер, який просто продовжує працювати (принаймні, поки не закінчиться оперативна пам’ять)
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

Python 2 , 91 89 88 байт

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

Спробуйте в Інтернеті!

2 байти завдяки Джонатану Аллану ; 1 байт thx для ShadowRanger .


while'*'<pрятує 2
Джонатан Аллан

getrandbits(31)економить байт randrange(2**31).
ShadowRanger

Приємно! Не знав про грандбітів ...
Час Браун

2

PowerShell, 60 , 56 байт

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

Досить німа версія, єдина гра в гольф метод тут опускаючи Get-в Get-Random.

UPD. Позбавлений до 56 байт, видаливши лапки, завдяки veskah !







1

Вугілля деревне , 30 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Захоплює формат введення деревним вугіллям за замовчуванням, який розбивається на пробіли, якщо є лише один рядок, таким чином, введення випадкового числа насправді виглядає як три входи. Пояснення:

W№θ*

Повторіть, коли перший вхід містить a *.

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

Брахілог , 26 23 байти

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

Спробуйте в Інтернеті!

Приймає програму як рядок через вхідну змінну і ігнорує вихідну змінну. Сильно використовує гарантію того, що вхід є лише однією з трьох дійсних програм: будь-який вхід довжиною три буде вести себе як " * "або "*+*"залежно від того, перший символ є пробілом, і будь-який інший вхід буде вести себе так "*".

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" - виправлення зараз
Unrelated String

1

PHP , 51 байт

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

Спробуйте в Інтернеті! (Привіт Світ)

Спробуйте в Інтернеті! (Випадкова кількість)

Спробуйте в Інтернеті! (Нескінченна петля)

Приймає другий символ введення, який може бути '' , '*'або '+'. У випадку, '+'коли '*'<'+'воля буде правдою, і цикл буде нескінченним, інакше після циклу відображається "Hello World" або випадкове число. rand()Автоматично виводить число між 0 і getrandmax()який використовує певних RAND_MAXв стандартній бібліотеці C і за замовчуванням знаходиться 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-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 ^ 32, а не 0 і 2 ^ 31. Коротший спосіб написання 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"; є аргументом:

'+'∊⍵: якщо плюс є членом аргументу:

  ∇⍵ хвіст повторюється на аргументі

' '∊⍵ якщо пробіл є членом аргументу:

  ?0 випадковий поплавок (0–1)

  2E31× шкала до (0–2³¹)

   підлогу

'Hello World' ще повернути рядок


0

Commodore 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 - це швидкий і брудний спосіб приймати записи клавіатури, включаючи пробіли.

По-друге, цілі цілі 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

JavaScript, 63 байти, без нескінченної рекурсивності

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

погана мережа, тому немає TIO-зв’язку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.