Codegolf - Почему? В Радость Богатому Программисту!

  • Автор темы Lilika
  • Обновлено
  • 23, Oct 2024
  • #1

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

 
 
 
 
 
 
 
 
 
 
 
 
 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!
 
, that answers the question. To give a few examples from MATLAB:

n

Ваша задача – реализовать 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 function in your language. The function should work with and without an input argument (alternatively use input (n % 8) / 2 или (1 2 2 3) ). The function must be named n = 2: (2 % 10)/2 => Smart n = 6: (6 % 10)/2 => The tall ... (или, написав (n % 10)/2 in STDIN should result in the appropriate string being printed).

Если аргумент не указан или аргумент равен нулю или отрицательному значению, выходная строка должна представлять собой случайную допустимую фразу. Итак, должна быть функция 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+1)/2 % 4) , (1 2 2 3) or 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! который возвращает случайное предложение.

Если входной аргумент, Odd number => Type 1 Even number => Type 2 n % 7 = 0 => Type 3 (% is the modulus operator) is given (function argument, not STDIN), the output should be the n'th string (defined below). So, How should I know? Stop asking! Don't ask! всегда должен выводить (печатать/отображать) один и тот же результат.

Предложения строятся следующим образом (Тип 1, Тип 2 и Специальное). Все предложения заканчиваются the smart the bald the tall the rich the stupid .

To fool To satisfy To please

Список лиц:

suggested it insisted on it did it

Список концовок:

Stewie Peter Homer The programmer The system manager You

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

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

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

!

Перечень особых случаев:

why(1)

Способ выбора номера:

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

n

Имена: Энное имя определяется с использованием модуля (%).

why(-1)

Окончания: Энное окончание также определяется с помощью модуля. Предположим, окончания (1, 2 и 3) перечислены как why(0) . As the numbers are always odd, use why()

why

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

why

Глаголы: Энный глагол также определяется с помощью модуля. Предположим, что глаголы (1, 2 и 3) перечислены как -1 As the numbers are always even for verbs, use 0

why

Теперь способ создания случайного объекта должен быть довольно простым: просто выберите случайный 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

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

#код-гольф

Lilika


Рег
10 Apr, 2011

Тем
70

Постов
217

Баллов
587
  • 26, Oct 2024
  • #2

JavaScript (ES6) 345

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

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

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 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()
 
sys.maxint -sys.maxint - 1 ||answer||

С#, 502 байта

Этот проект должен иметь имя сборки установлен на почему который создаст исполняемый файл с правильным именем.

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

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==0: M=P[4] if A%2==0: if M==P[0]:M="you" U=I[(A%8)/2];Z=Q[(A)/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()

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

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

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

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

Powershell 437 461 453 байта

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

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

  • 267 байт = предварительно закодированный текст (исключая 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!"]\(=}? , 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/2-1]+' '+p[n%7]+?!:$><<p[n%7]+' '+%w[a suggested insisted\ on insisted\ on did][(n+1)/2%4]+' it!'} , format and %s поскольку у них есть фиксированные места).
  • 186 байт = расчет

Устанавливает аргумент по умолчанию равным 0, если он не указан. Если аргумент %s then it gets a random number format (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)))) and reruns. Technically this means "foo^bar^baz^qux" также будет работать, поскольку рассматривается как случайный случай.

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

Объяснение:

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)_"!"

fn:1 99 Chosen to save a byte. If there are more than 99 possible sentences above (did not calculate) increase to 999 or 9999 as applicable (+1/2 bytes)

 

Hose1


Рег
14 Feb, 2008

Тем
59

Постов
203

Баллов
508
  • 26, Oct 2024
  • #3

Свинка, 379 байт

# 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/2]) $n!"} # Type 2

Если ввод не указан, генерируется случайное число в диапазоне 0–839.

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

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/2]) $n!"}}}

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

Примечание: посмотрите на те строки, которые выглядят как -50 ? Those are so-called "delimited strings", and are the standard way of storing lists that fit within the maximum string size limit, since MUMPS does not actually have lists/arrays (or, indeed, any data structures besides trees). For lists too large to fit in a single string, we instead use trees of depth 1 and put the values on the leaves of the tree. Fun!

 

Alconacravany


Рег
06 Feb, 2014

Тем
59

Постов
226

Баллов
561
  • 26, Oct 2024
  • #4

Emacs Lisp 473 байта

fn:1

Самый большой «отход», вероятно, <99 , <1 ... разделы. Если бы переменные можно было встроить в строки без спецификации, это сэкономило бы 10 байт на ! and another 12 on it

 

Mudvayne


Рег
22 Sep, 2005

Тем
82

Постов
226

Баллов
676
  • 26, Oct 2024
  • #5

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

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

the

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

 

Nikobond


Рег
07 Jul, 2011

Тем
74

Постов
196

Баллов
626
  • 26, Oct 2024
  • #6

CJam, 281 байт

to

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

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

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

 

Natalija


Рег
30 Mar, 2011

Тем
76

Постов
197

Баллов
597
  • 26, Oct 2024
  • #7

Lua 5.3.0, 452 460 446 байт

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

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

Негольфед:

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/2]+" {0}!" :"{0} "+(e[n/2%4]??e[1]), p[n%7] ); } } ||answer||

Питон (2), 692 байта

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

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/2]+" {0}!":"{0} "+(e[n/2%4]??e[1]),p[n%7]);}}

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

Я старался максимально подчеркнуть корректность кода, например, при генерации случайных чисел из Why(<input id=I>)<button onclick=test()>-></button><span id=R></span> <pre id=O> to #O { height:300px; width:50%; overflow:auto } #I { width:2em } и отображение предложений в нужном падеже.

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

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

Унгольфед (1341 байт)

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] )
 

DumaRoom


Рег
28 Jan, 2011

Тем
63

Постов
212

Баллов
547
Тем
403,760
Комментарии
400,028
Опыт
2,418,908