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

20

Задача проста. Написать переводчика для языка * .

Вот большая ссылка на вики.

Есть только три действительные * программы:

  • * Принты "Hello World"
  •  *  Печатает случайное число от 0 до 2 147 483 647
  • *+* Работает вечно.

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

Входные данные:

  • Ввод может быть выполнен любым приемлемым методом ввода по нашим стандартным правилам ввода / вывода.
  • Это всегда будет одна из вышеперечисленных программ

Выход:

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

Подсчет очков:

Поскольку это , самый короткий ответ, в байтах, выигрывает.

TheOnlyMrCat
источник
7
Когда вы говорите «между 0и 2,147,483,647», это всеохватывающее или исключительное? (Например, 0действительный вывод?)
Час Браун
7
Изменение спецификации после публикации запроса и аннулирование существующих решений - автоматическое решение -1от меня.
лохматый
2
Для языков, которые не имеют встроенного способа генерации случайного числа, существует ли приемлемый способ удовлетворить требование «напечатать случайное число»?
Таннер Светт
2
Если целые числа нашего языка не имеют или имеют более высокий максимум, можем ли мы использовать более высокую верхнюю границу?
Джонатан Аллан
7
@ Shaggy Я не вижу каких-либо изменений правил в вики для вопроса, только пробел в неразрывном пробеле (проверьте вкладку уценки), потому что средство визуализации уценки SE не рендерит его, а смотрит на исходную версию ясно, что это должны быть нормальные пробелы, и «взлом» делается только для проблем с рендерингом SE
markdown

Ответы:

20

* 0 байт


Поскольку * не имеет способа чтения ввода, правила по умолчанию позволяют указать, что ввод должен быть дан путем объединения его с программой .

(... Я думаю. Есть условие "по крайней мере вдвое больше голосов, чем голосов", что у меня нет представителя для проверки).

Хеннинг махолм
источник
4
Ваша связанная мета действительно является принятым в настоящее время стандартом сайта (+31 -7).
Джонатан Аллан
2
@A__: Мне кажется, он был разработан специально для удовлетворения чьего-либо определения «языка программирования» («Вы можете написать привет», «Вы можете написать бесконечный цикл!» «Вы можете написать программу, которая не не всегда делают одно и то же! »).
Хеннинг Махолм
Я считаю, что технически Malbolge тоже не является языком программирования.
Боб Янсен
1
Malbolge - это язык программирования для конечных автоматов, такой же, как *, и, например, Befunge-93. Поэтому Malbolge - это формальный язык программирования, такой же как *, технически такой же, как рекурсивно перечислимые языки, когда дело доходит до определения языка программирования (хотя формальные языки менее мощны).
Кшиштоф Шевчик
Отказ от меня, потому что, честно говоря, этот ответ настолько скучен, что на самом деле это уже стандартная лазейка , даже если мы игнорируем вопрос, является ли * язык программирования
AlienAtSystem
8

R 69 байт

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

Попробуйте онлайн!

switchпытается сопоставить именованные аргументы и, если совпадений нет, выбирает первый безымянный после первого, что в данном случае является бесконечным циклом repeat{}.

Giuseppe
источник
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, это +(то есть программа " *+*"), и программа зацикливается. После этого, если это NUL, программа была " *" и мы показываем Hello World; в противном случае он отображает случайное значение («  * », единственная оставшаяся опция.)

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

Попробуйте онлайн!

ErikF
источник
63 байта
attinat
Побрей байт: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

Python 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]
mbomb007
источник
Сохраните 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», если true
  • Проверяет, является ли последний символ пробелом, и печатает случайное число
  • В противном случае запускается бесконечный цикл

Затем неявно выведите стопку.

?                               #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 байта сохранены благодаря тому, что hello world не нуждается в пунктуации.

Попробуйте онлайн! Старая версия

Попробуйте онлайн! Новая версия

Йоно 2906
источник
Вы можете отрезать 4 байта, вам не нужны запятая или восклицательный знак в «Hello World».
TheOnlyMrCat
1
Теперь я должен выучить еще один непопулярный язык, чтобы нормально отвечать на вызовы.
1
-1 байт: TIO . Я рад, что не потерял способность играть в гольф в Кеге.
@A__ Наслаждаться Кегом на TIO?
Джоно 2906
2
24 байта :)
EdgyNerd
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] *", поэтому ваша программа не работает
Embodiment of Ignorance
@EmbodimentofIgnorance, в то время, когда я писал, вторая программа в спецификации была *<space> . У меня нет времени на обновление.
лохматый
Вы можете исправить это в трех байтах с помощью UÌ>Sвместо ¢второго троичного
Embodiment of Ignorance
@ Downvoter, пожалуйста, будьте любезны оставить комментарий.
Лохматый
2

JavaScript (ES7), 66 байт

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

Попробуйте онлайн! (Привет, мир)

Попробуйте онлайн! (случайный номер)

Попробуйте онлайн! (бесконечная петля)

Arnauld
источник
Не x=(z=>x())&&x()будет работать на -1 байт из кода бесконечного цикла, если предположить, что браузер не имеет максимального размера стека вызовов?
Геза Кереценый
@GezaKerecsenyi Мы могли бы просто позвонить себе ( как это ), но я не уверен, что это будет приемлемо.
Арно
это честно. Интересно, есть ли какой-нибудь неясный браузер, который просто продолжает работать (по крайней мере, до тех пор, пока не закончится ОЗУ)
Геза Кереченьи
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 байт спасибо ShadowRanger .

Час Браун
источник
while'*'<p сохраняет 2
Джонатан Аллан
getrandbits(31)сохраняет байты над randrange(2**31).
ShadowRanger
Ницца! Не знал о getrandbits ...
Час Браун
2

PowerShell, 60 , 56 байт

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

Довольно тупая версия, единственная техника игры в гольф здесь опущена Get-вGet-Random .

UPD. Урезан до 56 байт, удалив кавычки, благодаря вескам !

beatcracker
источник
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
Caird Coneheringaahing
источник
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" - исправление сейчас
несвязанная строка
1

PHP , 51 байт

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

Попробуйте онлайн! (Привет, мир)

Попробуйте онлайн! (Случайный номер)

Попробуйте онлайн! (Бесконечная петля)

Принимает второй символ ввода, который может быть '', '*'или '+'. В случае, если '+'значение '*'<'+'true, и цикл будет бесконечным, в противном случае после цикла отображается «Hello World» или случайное число. rand()Автоматически выводит число между 0 и getrandmax()который использует определенных RAND_MAXв стандартной библиотеке C и по умолчанию находится 2147483647на большинстве платформ / сред, в том числе TIO.

night2
источник
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"
ar4093
источник
Это печатает число от 0 до 2 ^ 32, а не от 0 до 2 ^ 31. Более короткий способ записи 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"; это аргумент:

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

  ∇⍵ Хвост рекурсивный по аргументу

' '∊⍵ если пробел является членом аргумента:

  ?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 байт

Я не хороший игрок в гольф ... ГСЧ генерирует одно и то же значение каждый раз, потому что это генератор псевдослучайных чисел.

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

Попробуйте онлайн!

A̲̲
источник
0

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

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

плохая сеть, поэтому нет ссылки TIO

l4m2
источник