Зачем? Чтобы порадовать богатого программиста!


21

Вы когда-нибудь хотели спросить компилятор "Почему?" Большинство из нас были разочарованы, когда код не работает должным образом. Поэтому Mathworks реализовал небольшую функцию why, которая отвечает на вопрос. Чтобы привести несколько примеров из MATLAB:

why
The programmer suggested it.

why
To fool the tall good and smart system manager.    

why(2)
You insisted on it.

why(46)
Bill insisted on it.

Ваша задача - реализовать whyфункцию на вашем языке. Функция должна работать как с входным аргументом, так и без него (в качестве альтернативы используйте ввод 0или -1). Функция должна быть названа why(или запись why(n)в STDIN должна привести к печати соответствующей строки).

Если аргумент не указан или аргумент нулевой или отрицательный, выходная строка должна быть случайной, допустимой фразой. Таким образом, должна быть функция why, why(), why(0)или why(-1)что возвращает случайное предложение.

Если nзадан входной аргумент (аргумент функции, а не STDIN), вывод должен быть n-й строкой (определенной ниже). Поэтому why(1)всегда следует выводить (распечатывать / отображать) один и тот же результат.

Предложения построены следующим образом (Тип 1, Тип 2 и Специальный). Все предложения заканчиваются на !.

"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases

Список лиц:

Stewie
Peter
Homer
The programmer
The system manager
You

Список окончаний:

suggested it
insisted on it
did it

Список глаголов:

To fool
To satisfy
To please

Список прилагательных:

the smart
the bald
the tall
the rich
the stupid

Список особых случаев:

How should I know?
Stop asking!
Don't ask!

Способ выбрать пронумерованный:

Тип предложений:

Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)

Имена: n-е имя определяется с помощью модуля (%).

n = 1:   1 % 7  => Stewie
n = 2:   2 % 7  => Peter
...
n = 6:   6 % 7  => You
n = 7:   7 % 7  => How should I know?
n = 11:  11 % 7 => The programmer
n = 14:  14 % 7 => Stop asking!
n = 21:  21 % 7 => Don't ask!

Окончания: n-е окончание также определяется с помощью модуля. Предположим, что окончания (1, 2 и 3) перечислены как (1 2 2 3). Поскольку числа всегда нечетные, используйте((n+1)/2 % 4)

n = 1:    ((1+1)/2 % 4)  => suggested it
n = 3:    ((3+1)/2 % 4)  => insisted on it
n = 13:   ((13+1)/2 % 4) => did it

Прилагательные: n-е прилагательное определяется с помощью модуля. Поскольку числа всегда четные, используйте:(n % 10)/2

n = 2:   (2 % 10)/2 => Smart
n = 6:   (6 % 10)/2 => The tall
...

Глаголы: n-й глагол также определяется с помощью модуля. Предположим, что глаголы (1, 2 и 3) перечислены так: (1 2 2 3)числа всегда четные для глаголов, используйте(n % 8) / 2

n = 2:   (2 % 8)/2 => To fool
n = 4:   (4 % 8)/2 => To satisfy
n = 6:   (6 % 8)/2 => To satisfy
n = 8:   (8 % 8)/2 => To please

Теперь способ создания случайного должен быть довольно простым, просто выберите случайный n.

Некоторые примеры:

why
You suggested it!

why
To fool the tall Homer!

why
Don't ask!

why(1)
Stewie suggested it!

why(14)
Stop asking!

why(8)
To please the rich Stewie!

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


писать, почему в stdin должен возвращать строку, я мог бы работать с этим. Это должно быть в нижнем регистре whyили будет WHYприемлемым?
Денис

Нижний и верхний регистры оба в порядке.
Стьюи Гриффин

Также не должны /2работать Окончания . Это дает дробные значения. 13также должно быть insisted(14/2 = 7% 4 = 3 = 2-й из настоящих).
Джонатан Лич-Пепин

3
Имеет ли значение, если вы в конечном итоге с делами, как в the rich The programmerсвязи с указанным the?
Джонатан Лич-Пепин

1
@StewieGriffin Слова Theи Toваши списки, вероятно, должны быть строчными, чтобы соответствовать вашим примерам ...
mbomb007

Ответы:


5

JavaScript (ES6) 345

Не уверен насчет чисел, но вот моя попытка.

Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript.

why=n=>(n<1?n=Math.random()*840|0:0,s="suggested,insisted on,did,fool,satisfy,please,stupid,smart,bald,tall,rich,Don't ask!,How should I know?,Stop asking!,Stewie,Peter,Homer,programmer,system manager,You".split`,`,n%7?(p=s[n%7+13],n&1?(p>'a'?'The ':'')+p+` ${s['2011'[-~n/2%4]]} it!`:`To ${s['5344'[n%8/2]]} the ${s[n/2%5+6]} ${p}!`):s[11+n%3])  

for(o='',i=0;++i<1e3;)o+=i+':'+why(i)+'\n';O.innerHTML=o

function test() { R.innerHTML=why(+I.value) }

// Less golfed

WHY=n=>(
  n=n<1?Math.random()*999|0:n,
  s=["suggested", "insisted on", "did", "fool", "satisfy", "please",
     "stupid", "smart", "bald", "tall", "rich",
     "Don't ask!", "How should I know?", "Stop asking!",
     "Stewie", "Peter", "Homer", "programmer", "system manager", "You"],
  n%7
    ? ( p=s[n%7+13],
        n&1
        ? (p>'a'?'The ':'')+p+` ${s['2011'[-~n/2%4]]} it!`
        : `To ${s['5344'[n%8/2]]} the ${s[n/2%5+6]} ${p}!`)
    : s[11+n%3]
)  
#O { height:300px; width:50%; overflow:auto }
#I { width:2em }
Why(<input id=I>)<button onclick=test()>-></button><span id=R></span>
<pre id=O>


Хороший ответ! Не могу говорить о достоверности числа, но вы можете сохранить 1 байт (!), Используя 0вместо разделителя строки ,!
Дом Гастингс

1
@DomHastings Я думаю, что этот трюк больше не нужен со строками шаблонов. split(0)такой же длины split','(представьте, что это кавычки)
edc65

Аааа, извините, я думал, что вы можете потерять скобки, это не coffeescript! :)
Дом Гастингс

3

C #, 502 байта

В этом проекте необходимо, чтобы для AssemblyName было задано значение Why, в результате чего будет создан исполняемый файл с правильным именем.

Полностью в гольф:

using System;class W{static void Main(string[]i)int n=i.Length>0?int.Parse(i[0]):new Random().Next();string[]s={"Don't ask!","How should I know?","Stop asking!"},v={"To please ","To fool ","To satisfy ",null},a={"the stupid","the smart","the bald","the tall","the rich"},p={"","Stewie","Peter","Homer","The programmer","The system manager","You"},e={"suggested it!","insisted on it!",null,"did it!"};Console.Write(n%7<1?s[n%3]:n%2<1?(v[n%8/2]??v[2])+a[n%10/2]+" {0}!":"{0} "+(e[n/2%4]??e[1]),p[n%7]);}}

Отступы и новые строки для ясности:

using System;
class W{
    static void Main(string[]i)
        int n=i.Length>0
            ?int.Parse(i[0])
            :new Random().Next();
        string[]
            s={"Don't ask!","How should I know?","Stop asking!"},
            v={"To please ","To fool ","To satisfy ",null},
            a={"the stupid","the smart","the bald","the tall","the rich"},
            p={"","Stewie","Peter","Homer","The programmer","The system manager","You"},
            e={"suggested it!","insisted on it!",null,"did it!"};
        Console.Write(
            n%7<1
                ?s[n%3]
                :n%2<1
                    ?(v[n%8/2]??v[2])+a[n%10/2]+" {0}!"
                    :"{0} "+(e[n/2%4]??e[1]),
            p[n%7]
        );
    }
}

Пример ввода / вывода:

>Why
To fool the bald Homer!
>Why 1
Stewie suggested it!

2

Powershell 437 461 453 байт

Изменить: пропущены дублированные глаголы

Расщепление между корпусом и вычислениями для подсчета байтов

  • 267 байт = Предварительно кодированный текст ( за исключением to, the, itи , !так как они имеют фиксированные места).
  • 186 байт = вычисление

Устанавливает аргумент по умолчанию 0, если не указан. Если аргумент равен, <1тогда он получает случайное число <99 fn:1и перезапускается. Технически это средство -50будет работать, как случайный случай.

function why{param($b=0)$p=@('Stewie','Peter','Homer','The programmer','The system manager','You');$e=@('did','suggested','insisted on','insisted on');$v=@('please','fool','satisfy','satisfy');$a=@('stupid','smart','bald','tall','rich');$s=@("Don't ask!",'How should I know?','Stop asking!');if($b-le0){why(Get-Random 99)}elseif(!($b%7)){$s[$b/7%3]}else{$n=$p[$b%7-1];if($b%2){"$n $($e[($b+1)/2%4]) it!"}else{"To $($v[$b%8/2]) the $($a[$b%10/2]) $n!"}}}

Объяснение:

# Any -1 in calculations is to account for arrays starting at index 0
# Final key placed in position 0 for indexing (4%4 = 0)
# Powershell 1 = True, 0 = False
if($b-le0){why(Get-Random 99)}          # If not positive, choose random number
elseif(!($b%7))                         # $b%7 means special so use that
  {$s[$b/7%3]}                          # Divide by 7 and find modulo, use that phrase.
else{$n=$p[$b%7-1]                      # Get the correct person (Used in both types). 6 max
if($b%2){"$n $($e[($b+1)/2%4]) it!"}    # Create type 1 sentence
else{"To $($v[$b%8/2]) the $($a[$b%10/2]) $n!"} # Type 2

fn:199 Выбран для сохранения байта. Если выше 99 возможных предложений (не рассчитано), увеличьте до 999 или 9999, в зависимости от обстоятельств (+1/2 байта)


2

MUMPS, 379 байт

f(s,i) s:'i i=$L(s,"^") q $P(s,"^",i)
why(n) s:'n n=$R(840) s p="Stewie^Peter^Homer^The programmer^The system manager^You",e="suggested^insisted on^did",v="fool^satisfy^please",a="smart^bald^tall^rich^stupid",s="How should I know?^Stop asking!^Don't ask!" q:n#7=0 $$f(s,n#3) q:n#2 $$f(p,n#7)_" "_$$f(e,n+1/2#4)_" it!" q "To "_$$f(v,n#8/2)_" the "_$$f(a,n#10/2)_" "_$$f(p,n#7)_"!"

Когда не вводится никаких данных, генерируется случайное число в 0..839.

Использование:

>w $$why(15)
Stewie did it!
>w $$why()
Don't ask!

Стратегия оценки MUMPS слева направо экономит здесь несколько скобок.

Примечание: увидеть те строки, которые похожи "foo^bar^baz^qux"? Это так называемые «строки с разделителями», и они являются стандартным способом хранения списков, которые вписываются в ограничение максимального размера строки, поскольку MUMPS фактически не имеет списков / массивов (или, действительно, любых структур данных, кроме деревьев). Для списков, слишком больших для размещения в одной строке, мы вместо этого используем деревья глубиной 1 и помещаем значения в листья дерева. Весело!


+1: MUMPS из всех языков действительно нуждается в whyфункции. ;)
DLosc

1

Emacs Lisp 473 байта

(defun why(n)(if(and n(> n 0))(let*((p'(t"Stewie""Peter""Homer""The programmer""The system manager""You"))(e'("did""suggested""insisted on""insisted on"))(v'("please""fool""satisfy""satisfy"))(a'("stupid""smart""bald""tall""rich"))(s'("Don't ask!""How should I know?""Stop asking!"))(q(nth(% n 7)p)))(cond((=(% n 7)0)(nth(%(/ n 7)3)s))((=(% n 2)1)(format"%s %s it!"q(nth(%(/(1+ n)2)4)e)))(t(format"To %s the %s %s!"(nth(/(% n 8)2)v)(nth(/(% n 10)2)a)q))))(why(random 99))))

Самыми большими «отходами», вероятно format, являются %s... разделы. Если бы переменные могли быть встроены в строки без спецификации, это позволило бы сэкономить 10 байт %sи еще 12 наformat


1

Рубин 396 378 372 байта

Я уверен, что это не игра в гольф по максимуму.

p=%w[a Stewie Peter Homer The\ programmer The\ system\ manager You]
why=->n{n<1 ? why[rand(99)+1]:n%7<1 ? $><<%w[a How\ should\ I\ know? Stop\ asking! Don't\ ask!][n/7]:n%2<1 ? $><<'To '+%w[fool satisfy satisfy please][n%8/2-1]+' the '+%w[smart bald tall rich stupid][n%10/2-1]+' '+p[n%7]+?!:$><<p[n%7]+' '+%w[a suggested insisted\ on insisted\ on did][(n+1)/2%4]+' it!'}

Изменить: я только что понял, что я не знаю приоритет оператора. Ну что ж..


rand (21) кажется слишком маленьким
edc65

Что насчет 99? : P
Петр Ленкефи,

Есть 108 составных предложений + 3 особых случая. Последовательность предложений является периодической, но период ... Я не знаю
edc65

Период, вероятно, 840 ... хороший выбор чисел
edc65

1

CJam, 281 байт

99mrqi_])0>=i:A7md{;A2%{S["suggested""insisted on""did"]A2/=+" it"+}{"To "["fool""satisfy"_"please"]A(2/:B=" the "["smart""bald""tall""rich""stupid"]B=SM}?[M"Stewie""Peter""Homer""The programmer""The system manager""You"]A=\'!}{["How should I know?""Stop asking!""Don't ask!"]\(=}?

Постоянная ссылка

Раньше не использовал CJam, поэтому я возьму любые советы. Я уверен, что есть много хитростей, которые я не знаю!

(Я не мог понять, как назвать это как функцию, называемую «почему» - кажется, что функции не существуют в CJam - поэтому я не уверен, является ли ответ CJam нормальным или нет ...)


Функции делать есть, но есть только 26 действительные имена функций ( от А до Z).
Деннис

1

Lua 5.3.0, 452 460 446 байт

Это моя первая попытка игры в гольф, поэтому, пожалуйста, поправьте меня, если я сделал что-то не так!

a={"Stewie","Peter","Homer","The Programmer","The system manager","You"}b={"fool ","satisfy ",n,"please "}b[3]=b[2]why=function(n)pcall(math.randomseed,n and n>0 and n)n=math.random(1e9)q=n>>4r=n>>8return 1>n&7 and({"How should I Know?","Stop asking!","Don't ask!"})[q%3+1]or 0<n%2 and a[q%6+1]..({" suggested"," insisted on"," did"})[r%3+1].." it"or"To "..b[q%4+1].."the "..({"smart ","bald ","tall ","rich ","stupid "})[r%5+1]..a[(r>>4)%6+1]end

Ungolfed:

a={
    "Stewie",
    "Peter",
    "Homer",
    "The Programmer",
    "The system manager",
    "You"
}
b={
    "fool ",
    "satisfy ",
    n,
    "please "
}
b[3]=b[2]
why=function(n)
    pcall(math.randomseed,n and n>0 and n)
    n=math.random(1e9)
    q=n>>4
    r=n>>8
    return
            1>n&7 and
                ({"How should I Know?","Stop asking!","Don't ask!"})[q%3+1]
            or 0<n%2 and
                a[q%6+1]..({" suggested"," insisted on"," did"})[r%3+1].." it"
            or
                "To "..b[q%4+1].."the "..({"smart ","bald ","tall ","rich ","stupid "})[r%5+1]..a[(r>>4)%6+1]
end

0

Python (2), 692 байта

Я все еще учусь, поэтому, пожалуйста, будьте нежны! :)

from sys import argv,maxint
import random
def why(*O):
 P=["You","Stewie","Peter","Homer","programmer","system manager"];E=["did","suggested","insisted on","insisted on"];I=["please","fool","satisfy","satisfy"];Q=["stupid","smart","bald","tall","rich"];S=["Don't ask!","How should I know?","Stop asking!"]
 if len(argv)>1:A=O[0]
 else:A=random.randint(-maxint-1,maxint)
 if A%7==0:print S[A%3]
 else:
  M=P[A%6]
  if A%11==0:
   M=P[4]
  if A%2==0:
   if M==P[0]:M="you"
   U=I[(A%8)/2];Z=Q[(A%10)/2];print"To %s the %s %s!"%(U,Z,M)
  if A%2==1:
   if M==P[4]:M="The %s"%P[4]
   if M==P[5]:M="The %s"%P[5]
   C=E[((A+1)/2)%4];print"%s %s it!"%(M,C)
if len(argv)>1:why(int(argv[1]))
else:why()

Работает с или без int в качестве аргумента командной строки.

Я старался как можно больше подчеркнуть правильность кода, генерируя случайные числа из -sys.maxint - 1to sys.maxintи отображая предложения в правильном случае.

Код очень сильно зависит от операторов if, которые, я уверен, могут быть заменены чем-то более эффективным.

Обратная связь очень приветствуется!

Ungolfed (1341 байт)

from sys import argv, maxint
import random

def Why(*Optional):
    Persons = ["You", "Stewie", "Peter", "Homer", "programmer", "system manager"]
    Endings = ["did it", "suggested it", "insisted on it", "insisted on it"]
    Verbs = ["please", "fool", "satisfy", "satisfy"]
    Adjectives = ["stupid", "smart", "bald", "tall", "rich"]
    SpecialCases = ["Don't ask!", "How should I know?", "Stop asking!"]

    if len(argv) > 1:
        Argument = Optional[0]
    else:
        Argument = random.randint(-maxint - 1, maxint)

    if Argument % 7 is 0:
        print SpecialCases[Argument % 3]
    else:
        Person = Persons[(Argument) % 6]
        if Argument % 11 is 0:
            Person = "programmer"
        if Argument % 2 is 0:
            if Person is "You":
                Person = "you"
            Verb = Verbs[(Argument % 8) / 2]
            Adjective = Adjectives[(Argument % 10) / 2]
            print "To %s the %s %s!" % (Verb, Adjective, Person)
        if Argument % 2 is 1:
            if Person is "programmer":
                Person = "The programmer"
            if Person is "system manager":
                Person = "The system manager"
            Ending = Endings[((Argument + 1) / 2) % 4]
            print "%s %s!" % (Person, Ending)

if len(argv) > 1:
    Why(int(argv[1]))
else:
    Why()

2
Я предлагаю вам прочитать [ codegolf.stackexchange.com/questions/54/…), в частности, вы можете сохранить много байтов, используя первый совет на этой странице. Вы также можете индексировать в конце списка глаголов, так что вам нужно только одно «удовлетворить»: используйте argument%8/2-1и удалите второй. Вы также можете заменить ==0на <1.
lirtosiast
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.