Чому? Щоб порадувати багатого програміста!


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функцію вашою мовою. Функція повинна працювати з вхідним аргументом і без нього (альтернативно використовувати input 0або -1). Функція повинна бути названа why(або, написання why(n)на STDIN, має призвести до друку відповідного рядка).

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

Якщо nзадано аргумент введення (аргумент функції, а не STDIN), вихід повинен бути п’ятою рядком (визначено нижче). Отже, 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','(
притворіться, що це бекстікс

Ах, вибачте, я думав, що ви можете втратити дужки, це не кофескрипт! :)
Дом Гастінгс

3

C #, 502 байти

У цьому проекті має бути встановлене AssemblyName , чому саме він створить виконуваний файл з правильним ім'ям.

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

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

МУМП, 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: МУМПА всіх мов справді потребує 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

Безголівки:

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

Пітон (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 - 1до sys.maxintта відображенні речень у потрібному випадку.

Код дуже сильно покладається на if-заяви, які, я впевнений, можуть бути замінені чимось більш ефективним.

Відгуки дуже вітаються!

Безумовно (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.