Tester miłości Code Golf

9

Utwórz program, który zlicza całkowitą liczbę liter wspólnych dla dwóch nazw i znajduje iloczyn ich długości, aby działał jako „tester miłości”.

Warunki: możesz nie otrzymać odpowiedzi 1: 1 (3 z 3 itd.).

Wejście

Dwie nazwy z STDIN lub najbliższa alternatywa.

Wynik

Oblicz xjako całkowitą liczbę liter wspólnych między dwoma nazwami, ignorując wielkość liter. Oblicz yjako iloczyn długości nazw. Następnie wyjście, do STDOUT lub najbliższej alternatywy, to

Name1 and Name2 have x out of y chances of love.

Przykłady

Wejście:

Wesley
Polly

Wynik:

Wesley and Polly have 2 out of 30 chances of love.

Wesley i Polly mają 2 litery wspólne, ya liloczyn ich długości wynosi 6 * 5 = 30.

Wejście:

Bill
Jill

Wynik:

Bill and Jill have 3 out of 16 chances of love.

Bonusy

  • Odejmij 30 bajtów, aby użyć ułamków uproszczonych, tzn. x out of yJest w formie całkowicie zredukowanej.

Tabela liderów:

Ranking będzie ustalany na podstawie języków. Kod golfowy kończy się 17 października o 22:20 czasu pacyficznego (Kalifornia)

Nagrody Rep

  • Otrzymasz 10 powtórzeń (upvote) za bycie w pierwszej piątce (z wyjątkiem pierwszego miejsca).
  • Otrzymasz 15 powtórzeń (zaakceptowane zgłoszenie) za bycie pierwszym miejscem.
  • Możesz także otrzymać nagrodę główną od innej osoby.

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. **

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes

** Ułóż fragment kodu z Sign That Word autorstwa Kslkgh


Gratulacje dla następujących osób:

  1. Zwycięzca Dennis (Pyth)
  2. Dennis (CJam)
  3. NBZ (APL)
  4. molarmanful (JavaScript ES6)
  5. Alex A. (Julia)
juniorRubyist
źródło
3
Po co powinien być wynik Aaron\nAhmad? Czy samename\nsamename?
lirtosiast
3
Nie jestem pewien, w jaki sposób liczone są wszystkie litery wspólne, gdy litery się powtarzają. Jeśli imiona mają ai bjakaś litera, to czy liczą się one jako min(a,b)powtórzenia?
xnor
jak mówi @xor, jak liczyć powtarzające się litery? Z drugiego przykładu wynika, że ​​liczysz powtarzające się znaki, więc jeśli pierwszy przykład został odwrócony, to czy spodziewasz się innego wyniku?
Rnet
Czy jest to całkowicie niezwiązane ze złożonością Kołmogorowa ?

Odpowiedzi:

1

Pyth, 40 bajtów

jd[z"and"Jw"have"/K-lzl.-rz0rJ0i=J*lzlJK"out of"/JiJK"chances of love.

Kod ma 70 bajtów długości i kwalifikuje się do premii -30 bajtów .

Wypróbuj online.

  [                        Begin an array and fill it with the following:
   z                         The first line of input.
   "and"                     That string.
   Jw                        The second line of input, saved in J.
   "have"                    That string.
           rz0rJ0              Convert both lines to lowercase.
         .-                    Remove the characters form the second string
                               from the first, counting multiplicities.
        l                      Get the length.
     -lz                       Subtract it from the length of the first line.
    K                          Save in K.
                  =J*lzlJ      Save the lines' lengths' product in J.
                 i       K     Compute the GCD of J and K.
   /                         The quotient of K and the GCD.
   "out of"                  That string.
   /JiJK                     The quotient of J and the GCD of J and K.
   "chances of love.         That string.
jd                         Join the elements, separated by spaces.
Dennis
źródło
3

Dyalog APL , 94 91-30 = 61 bajtów

Zwykle gra w golfa APL powoduje, że kod jest bardziej kompaktowy - ale nie bardziej złożony - niż zwykle, ale w tym przypadku zapisuję znaki w brzydki sposób:

{1↓(∊' ',¨⍵,⍪'and' 'have'),' love.',⍨∊((⊢÷∨/)(≢⊃∩/32|⎕ucs¨⍵),×/≢¨⍵),⍪'out of' 'chances of'}

,⍪'out of' 'chances of'utwórz tablicę liczb 2 × 2 (po lewej) i tekst (po prawej)
×/≢¨⍵iloczyn długości
32|⎕UCS¨⍵zharmonizuj wartości LUW wielkimi i małymi literami tak
≢⊃∩/, aby przecięcie dwóch zestawów
⊢÷∨/podzieliło sumę, a iloczyn z ich GCD
,' love.',⍨∊tworzy prostą listę i dołącza miłość.
⍵,⍪'and' 'have'utwórz tabelę nazw 2 × 2 (po lewej) i teksty (po prawej)
∊' ',¨wstaw spację do każdej komórki tabeli, a następnie ułóż na prostej liście
1↓początkową zbędną spację

Dzięki ngn za -3 bajty.

Adám
źródło
Wygląda na to, że jest to tylko funkcja, podczas gdy OP określa dane wejściowe ze STDIN i dane wyjściowe do STDOUT (tzn. Pełny program, a nie tylko funkcja).
Alex A.,
@AlexA. APL nie ma STDIN, ale może wydać monit o zaakceptowanie dwóch nazw w formacie 'Wesley' 'Polly'. Jeśli uważasz, że byłoby to bardziej sprawiedliwe, możesz dołączyć (U + 2395) do samego końca linii (po }) i dostosować wynik do 65.
Adám
2

JavaScript ES6, 123 bajty

(a,b)=>a+` and ${b} have ${[...a].map(x=>eval(`/${x}/i.test(b)&&c++`),c=0),c} out of ${a.length*b.length} chances of love.`

Tyle o „miłości” ... Mógłbym naprawdę zrobić z mniejszą liczbą bajtów.

Uruchom fragment kodu w przeglądarce Firefox.

Mama Fun Roll
źródło
2
Wygląda na to, że jest to tylko funkcja, podczas gdy OP określa dane wejściowe ze STDIN i dane wyjściowe do STDOUT (tzn. Pełny program, a nie tylko funkcja).
Alex A.,
2

Julia, 129 bajtów

Kod ma 159 bajtów, ale kwalifikuje się do premii -30.

A,B=map(chomp,readlines())
a,b=map(lowercase,[A,B])
L=length
r=Rational(L(ab),L(a)L(b))
print("$A and $B have $(r.num) out of $(r.den) chances of love.")

Prawdopodobnie można to skrócić, nie wykorzystując bonusu, ale chciałem pochwalić się rozsądnym typem Julii. :)

Nie golfowany:

# Read two names from STDIN on separate lines
A, B = map(chomp, readlines())

# Construct their lowercase equivalents
a, b = map(lowercase, [A, B])

# Construct a rational number where the numerator is the
# length of the intersection of a and b and the denominator
# is the product of the lengths
r = Rational(length(a  b), length(a) * length(b))

# Tell us about the love
print("$A and $B have $(r.num) out of $(r.den) chances of love.")

Rational()Funkcji tworzy obiekt typu Rational, który ma pola numi den, odpowiednio do licznika i mianownika odpowiednio. Zaletą korzystania z tego typu jest to, że Julia robi dla nas redukcję; sami nie musimy się martwić o zmniejszenie frakcji.

Alex A.
źródło
2

CJam, 55 bajtów

ll]_~@_{'~,\elfe=}/.e<:+\:,:*]_2>~{_@\%}h;f/"and
have
out of
chances of love."N/.{}S*

Kod ma 85 bajtów długości i kwalifikuje się do premii -30 bajtów .

Wypróbuj online w interpretatorze CJam .

Jak to działa

ll]      e# Read two lines and wrap them in an array.
_~       e# Copy the array and dump the lines on the stack.
@_       e# Rotate the array on top and push a copy.
{        e# For each line of the copy.
  '~,    e#   Push the array of all ASCII charcters up to '}'.
  \el    e#   Convert the line to lowercase.
  fe=    e#   Count the occurrences of each character in the line.
}/       e#
.e<      e# Vectorized minimum of the occurrences.
:+       e# Add to find the number of shared charaters.
\:,      e# Compute the length of each line.
:*       e# Push the product.
]_       e# Wrap the stack in an array and push a copy.
2>~      e# Discard the lines of the copy and dump the calculated integers.
{_@\%h}; e# Compute their GCD, using the Euclidean algorithm.
f/       e# Divide each element of the array by the GCD.
         e# This also splits the names, which won't affect printing.

"and
have
out of
chances of love."

N/       e# Split the above string at linefeeds.
.{}      e# Vectorized no-op. Interleaves the arrays.
S*       e# Join the results elements, separated by spaces.
Dennis
źródło
1

Dyalog APL, 84-30 = 54 bajty

∊' and ' ' have' 'out of' 'chances of love.',¨⍨⊢,{+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵}(,÷∨)(×/≢¨)

To pociąg zainspirowany odpowiedzią Adama .

×/≢¨ iloczyn długości

{+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵} szanse na miłość

(,÷v)konkatenacja podzielona przez GCD; pomiędzy powyższymi dwoma wyrażeniami zmniejsza to ułamek

⊢, dodaj nazwy

,¨⍨ tasuje łańcuchy po lewej stronie z wartościami po prawej

spłaszczyć


Szczegółowo obliczenia „Szanse miłości”: {+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵} ↑⍵ arrange the names in a 2×N matrix, pad with spaces ⎕ucs take ascii codes ⍉ transpose the matrix as N×2 32| modulo 32 to case-fold 1↑¨⍨- for each X create a vector 0 0...0 1 of length X ↑ arrange into a 3d array, pad with 0s +⌿ 1st axis sum, obtain freqs per letter and per name ⌊⌿ 1st axis min, obt. nr of common occurrences per letter +/ sum

test , test2

ngn
źródło
0

Java 8, 192 bajty

BiFunction y=(a,b)->a+" and "+b+" have "+(""+a).chars().filter(c->(""+b).toUpperCase().indexOf(c>'Z'?c-32:c)>=0).count()+" out of "+(""+a).length()*(""+b).length()+" chances of love.";

Dawny:

System.out.println(y.apply("Bill","Jill"));
System.out.println(y.apply("Wesley","Polly"));
Rnet
źródło
0

Rubin, 153 bajty

Dłużej niż się spodziewałem. Nie wiem, czy dotyczy to premii 30 bajtów.

d=[];2.times{d<<gets.chop<<$_.downcase.chars<<$_.length-1};$><<"#{d[0]} and #{d[3]} have #{d[2]-(d[1]-d[4]).length} out of #{d[2]*d[5]} chances of love."
Peter Lenkefi
źródło
Czy możesz dodać link do kompilatora? (Polecam Ideone)
juniorRubyist
0

Python 2.7, 161 bajtów

import string;r=raw_input;a,b=r(),r();print'%s and %s have %i out of %i chances of love'%(a,b,sum(map(lambda c:c in a and c in b,string.letters)),len(a)*len(b))

Przetestuj tutaj: http://ideone.com/jeoVgV

A oto wersja, która upraszcza ułamek:

import string,fractions;r=raw_input;a,b=r(),r();F=fractions.Fraction(sum(map(lambda c:c in a and c in b,string.letters)),len(a)*len(b))
print'%s and %s have %i out of %i chances of love'%(a,b,F.numerator,F.denominator)

Niestety ten wynik to 219-30 = 189 ...

dieter
źródło
1
Oto kompilator, który możesz dodać: ideone.com/jeoVgV
juniorRubyist