Niye ya? Zengin programcı memnun etmek için!


21

Hiç derleyiciye "Neden?" Sormak istediniz mi? Kod olması gerektiği gibi çalışmadığında çoğumuz sinirli olduk. Mathworks bu nedenle whysoruyu cevaplayan hoş bir küçük işlev uyguladı . MATLAB'dan birkaç örnek vermek gerekirse:

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.

Göreviniz, whyişlevi kendi dilinizde uygulamak. İşlev, giriş bağımsız değişkeni ile ve onsuz çalışmalıdır (alternatif olarak girdiyi kullanın 0veya -1). İşlev isimlendirilmelidir why(veya why(n)STDIN ile yazmak uygun dizgenin yazdırılmasıyla sonuçlanmalıdır).

Herhangi bir argüman verilmezse veya argüman sıfır veya negatifse, çıkış dizesi rastgele, geçerli bir ifade olmalıdır. Yani, orada bir işlevi olmalıdır why, why(), why(0)veya why(-1)döndürdüğü rastgele cümle.

Bir giriş argümanı nverilirse (STDIN değil fonksiyon argümanı), çıktı n'ci dizge olmalıdır (aşağıda tanımlanmıştır). Bu nedenle, why(1)her zaman aynı sonucu vermelidir (yazdır / görüntüle).

Cümleler aşağıdaki gibi oluşturulmuştur (Tip 1, Tip 2 ve Özel). Tüm cümleler ile biter !.

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

Kişilerin listesi:

Stewie
Peter
Homer
The programmer
The system manager
You

Bitişlerin listesi:

suggested it
insisted on it
did it

Fiillerin listesi:

To fool
To satisfy
To please

Sıfatların listesi:

the smart
the bald
the tall
the rich
the stupid

Özel durumlar listesi:

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

Numaralandırılmış olanı seçmenin yolu:

Cümlelerin türü:

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

İsimler: nth ismi modül (%) kullanılarak tanımlanmıştır.

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!

Bitişler: Son bitiş ayrıca modül kullanılarak tanımlanır. Sonları (1, 2 ve 3) gibi listelendiğini varsayalım (1 2 2 3). Sayılar her zaman tek olduğundan, kullan((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

Sıfatlar: İlk sıfat, modül kullanılarak tanımlanır. Sayılar her zaman olduğu gibi, kullanın:(n % 10)/2

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

Fiiller: Bu fiil, modül kullanılarak da tanımlanır. Fiillerin (1, 2 ve 3) şöyle sıralandığını varsayalım (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

Şimdi, rastgele bir tane yaratmanın yolu oldukça basit olmalı, sadece bir rasgele seçmelisiniz n.

Bazı örnekler:

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!

Standart kod golf kuralları geçerlidir. Bir kazanan, yarışmanın yayınlandığı günden bir hafta sonra seçilecektir.


stdin'de neden string ile geri dönmesi gerektiğini yazarak bununla çalışabilirim. Küçük harf mi olmalı whyyoksa WHYkabul edilebilir mi?
Dennis,

Küçük ve büyük harf hem iyi.
Stewie Griffin,

Ayrıca, Sonlar'ın /2çalışması gerekmez . Bu kesirli değerler verir. 13olmalıdır insisted(14/2 =% 7 4 = 3 = ısrarın 2.'si).
Jonathan Leech-Pepin

3
the rich The programmerBelirtilen davalar gibi durumlarla karşılaşmanızın bir önemi var mı the?
Jonathan Leech-Pepin

1
@StewieGriffin Örnekleriniz Theve Tolistelerinizdeki örneklerinizle eşleşmesi için küçük harflerle
yazılmalıdır

Yanıtlar:


5

JavaScript (ES6) 345

Rakamlardan emin değilim, ama işte benim girişim.

Aşağıdaki pasajı EcmaScript uyumlu bir tarayıcıda çalıştırarak test edin.

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>


Güzel cevap! Numara geçerliliği konusunda yetkili konuşamıyorum, ancak 0dize sınırlayıcınız yerine 1 bayt (!) Kaydedebilirsiniz ,!
Dom Hastings,

1
@DomHastings Numarayı şablon dizeleriyle daha fazla gerekli olmadığını düşünüyorum. split(0)aynı uzunluktadır split','(bunlar backticks gibidir)
edc65

Ahhh, üzgünüm, parantezi kaybedebileceğini düşünüyordum, bu kahve tablası değil! :)
Dom Hastings,

3

C #, 502 bayt

Bu projenin AssemblyName'in niçin doğru adda bir yürütülebilir dosya üreteceğine ayarlanmış olması gerekir .

Tamamen golf:

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

Girinti ve netlik için yeni çizgiler:

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

Örnek giriş / çıkış:

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

2

Powershell 437 461 453 Bayt

Düzenleme: çoğaltılmış fiiller cevapsız

Korpus ve bayt sayımı için hesaplamalar arasında bölme

  • 267 Bayt = Ön kodlu metin (hariç to, the, itve !beri sabit yerler).
  • 186 Bayt = hesaplama

Belirtilmezse varsayılan argümanı 0 olarak ayarlar. Eğer argüman ise <1rasgele bir sayı alır <99 fn:1ve tekrar eder. Teknik olarak bu araç -50aynı zamanda işe yarayacak ve rastgele bir durum olarak ele alınacaktır.

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

Açıklama:

# 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 Bir bayt kaydetmek için seçildi. Yukarıdaki 99'dan fazla olası cümle varsa (hesaplanmadı), geçerliyse 999 veya 9999'a yükseltin (+1/2 bayt)


2

MUMPS, 379 bayt

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

Giriş yapıldığında, 0..839'da rasgele bir sayı üretilir.

Kullanımı:

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

MUMPS'un soldan sağa değerlendirme stratejisi, burada parantez içinde iyi bir kaç bayt tasarrufu sağlar.

Yan not: benzeyen dizeleri görüyor "foo^bar^baz^qux"musun? Bunlar "sınırlandırılmış dizeler" olarak adlandırılır ve MUMPS gerçekte listeler / diziler (veya aslında ağaçların dışında herhangi bir veri yapıları) içermediğinden, maksimum dizge boyut sınırına uyan listelerin standart depolanması yöntemidir. Tek bir dizgeye sığmayacak kadar büyük listelerde, bunun yerine derinlik 1 ağaçları kullanırız ve değerleri ağacın yapraklarına koyarız. Eğlence!


+1: Tüm dillerdeki MUMPS, gerçekten bir whyişleve ihtiyaç duyar . ;)
DLosc

1

Emacs Lisp 473 Bayt

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

Büyük 'atık' muhtemelen format, %s... bölümleri. Değişkenler özellik belirtilmeden dizgelere eklenebilirse, 10 bayt %sve 12format


1

Ruby 396 378 372 bayt

Bunun en fazla golf oynamadığından eminim.

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!'}

Düzenleme: Operatör önceliğini bilmediğimi farkettim. Oh iyi..


rand (21) çok küçük görünüyor
edc65

Peki ya 99? : P
Peter Lenkefi

108 tane bileşik cümle + 3 özel durum vardır. Cümlelerin sırası periyodik ama dönem ... Bilmiyorum
edc65

Dönem muhtemelen 840 ... iyi sayı seçimi
edc65

1

CJam, 281 bayt

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!"]\(=}?

kalıcı

CJam'ı daha önce kullanmadım, bu yüzden herhangi bir ipucu alacağım. Eminim bilmediğim bir sürü numara var!

(Bunun "neden" olarak adlandırılan bir işlev olarak nasıl adlandırılacağını çözemedim - işlevler CJam'da yok gibi görünüyor - yani bir CJam yanıtının iyi olup olmadığından emin değilim ...)


Fonksiyonlar yapmak var, ancak sadece 26 geçerli işlev adları (A'dan Z'ye) vardır.
Dennis,

1

Lua 5.3.0, 452 460 446 bayt

Bu benim ilk golf kod denemem, bu yüzden yanlış bir şey yaparsam lütfen beni düzelt!

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 bayt

Hala öğreniyorum, lütfen nazik ol! :)

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

Komut satırı argümanı olarak int ile veya int olmadan çalışır.

Ben rasgele sayılar üreten olduğu gibi, mümkün olduğunca kod doğruluğunu vurgulamaya çalıştık -sys.maxint - 1için sys.maxintve sağ durumda cümleler görüntülenmesi.

Kod çok daha etkili bir yerle değiştirilebileceğinden emin olduğum if-ifadelerine dayanıyor.

Geribildirim çok açığız!

Ungolfed (1341 bayt)

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/… - özellikle okumanızı öneririz; özellikle, bu sayfadaki ilk ipucunu kullanarak birçok bayttan tasarruf edebilirsiniz. Fiil listesinin arkasından da indeksleyebilirsiniz, böylece sadece bir "tatmin" e ihtiyacınız vardır: ikinciyi kullanın argument%8/2-1ve kaldırın. Ayrıca yerini alabilir ==0ile <1.
lirtosiast
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.