Love Tester Code Golf

9

Créez un programme qui compte le nombre total de lettres communes à deux noms et trouve le produit de leurs longueurs pour fonctionner comme un "testeur d'amour".

Conditions: vous ne pouvez pas obtenir de réponse 1: 1 (soit 3 sur 3, etc.).

Contribution

Deux noms de STDIN ou de l'alternative la plus proche.

Production

Calculez xle nombre total de lettres en commun entre les deux noms, en ignorant la casse. Calculez ycomme le produit de la longueur des noms. Ensuite, la sortie, vers STDOUT ou l'alternative la plus proche, est

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

Exemples

Contribution:

Wesley
Polly

Production:

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

Wesley et Polly ont 2 lettres en commun, yet l, et le produit de leurs longueurs est 6 * 5 = 30.

Contribution:

Bill
Jill

Production:

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

Bonus

  • Soustrayez 30 octets pour l'utilisation de fractions simplifiées, c'est x out of y-à- dire sous une forme entièrement réduite.

Classement:

Le classement sera déterminé par les langues. Le golf de code se termine le 17 octobre à 22 h 20, heure avancée du Pacifique (Californie)

Prix ​​des représentants

  • Vous recevrez 10 rep (un vote positif) pour être dans le top 5 (sauf la première place).
  • Vous recevrez 15 rep (entrée acceptée) pour être la première place.
  • Vous pourriez également obtenir une récompense de prime d'une autre personne.

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue. **

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

** Extrait de pile de Sign That Word par Kslkgh


Félicitations à ce qui suit:

  1. Gagnant Dennis (Pyth)
  2. Dennis (CJam)
  3. NBZ (APL)
  4. molarmanful (JavaScript ES6)
  5. Alex A. (Julia)
juniorRubyist
la source
3
À quoi devrait servir la sortie Aaron\nAhmad? Ou samename\nsamename?
lirtosiast
3
Je ne sais pas comment vous comptez le nombre total de lettres en commun lorsque les lettres se répètent. Si les noms ont aet bd'une certaine lettre, ceux-ci comptent-ils pour les min(a,b)répétitions?
2015
comme le dit @xor, comment comptez-vous les lettres répétées? Dans le deuxième exemple, il semble que vous comptiez des caractères répétés, donc si le premier exemple était inversé, vous attendez-vous à un résultat différent?
Rnet
Est-ce totalement indépendant de la complexité de kolmogorov ?

Réponses:

1

Pyth, 40 octets

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

Le code fait 70 octets et se qualifie pour le bonus de -30 octets .

Essayez-le en ligne.

  [                        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
la source
3

Dyalog APL , 94 91-30 = 61 octets

Habituellement, le golf APL donne un code plus compact - mais pas plus complexe - que la normale, mais dans ce cas, j'enregistre les caractères de façon laide:

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

,⍪'out of' 'chances of'créer un tableau 2 × 2 de nombres (à gauche) et de textes (à droite)
×/≢¨⍵produit de longueurs
32|⎕UCS¨⍵harmoniser les valeurs UCS majuscules et minuscules
≢⊃∩/correspondent l'intersection des deux ensembles
⊢÷∨/diviser le décompte et le produit avec leur GCD en
,' love.',⍨∊faire une liste simple et ajouter amour.
⍵,⍪'and' 'have'créer un tableau 2 × 2 des noms (à gauche) et des textes (à droite)
∊' ',¨ajouter un espace à chaque cellule du tableau puis en faire une liste simple
1↓supprimer l'espace superflu initial

Merci à ngn pour -3 octets.

Adam
la source
Il semble que ce ne soit qu'une fonction, alors que l'OP spécifiait l'entrée de STDIN et la sortie de STDOUT (c'est-à-dire un programme complet plutôt qu'une simple fonction).
Alex A.
@AlexA. APL n'a pas STDIN, mais peut émettre une invite pour accepter les deux noms au format 'Wesley' 'Polly'. Si vous pensez que ce serait plus juste, n'hésitez pas à ajouter (U + 2395) jusqu'à la toute fin de la ligne (après le }) et ajustez le score à 65.
Adám
2

Javascript ES6, 123 octets

(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.`

Voilà pour "l'amour" ... Je pourrais vraiment faire avec moins d'octets.

Exécutez l'extrait de code dans Firefox.

Mama Fun Roll
la source
2
Il semble que ce ne soit qu'une fonction, alors que l'OP spécifiait l'entrée de STDIN et la sortie de STDOUT (c'est-à-dire un programme complet plutôt qu'une simple fonction).
Alex A.
2

Julia, 129 octets

Le code fait 159 octets mais il bénéficie du bonus de -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.")

Cela pourrait probablement être raccourci en n'optant pas pour le bonus, mais je voulais montrer le type de nombre rationnel de Julia. :)

Non golfé:

# 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.")

La Rational()fonction construit un objet de type Rationalqui a des champs numet den, correspondant respectivement au numérateur et au dénominateur. L'avantage d'utiliser ce type ici est que Julia effectue la réduction pour nous; nous n'avons pas à nous soucier de réduire la fraction nous-mêmes.

Alex A.
la source
2

CJam, 55 octets

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

Le code fait 85 octets de long et se qualifie pour le bonus de -30 octets .

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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
la source
1

Dyalog APL, 84-30 = 54 octets

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

Ceci est un train , inspiré par la réponse d' Adám .

×/≢¨ produit des longueurs

{+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵} les chances de l'amour

(,÷v)la concaténation divisée par le GCD; entre les deux expressions ci-dessus, cela réduit la fraction

⊢, ajouter les noms

,¨⍨ mélange les cordes à gauche avec les valeurs à droite

aplatir


Le calcul "Chances of love" en détail: {+/⌊⌿+⌿↑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
la source
0

Java 8, 192 octets

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.";

Ex:

System.out.println(y.apply("Bill","Jill"));
System.out.println(y.apply("Wesley","Polly"));
Rnet
la source
0

Rubis, 153 octets

Plus longtemps que prévu. Je ne sais pas si le bonus de 30 octets s'applique à cela.

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
la source
Pourriez-vous s'il vous plaît ajouter un lien vers un compilateur? (Je recommande Ideone)
juniorRubyist
0

Python 2.7, 161 octets

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

Testez-le ici: http://ideone.com/jeoVgV

Et voici une version qui simplifie la fraction:

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)

Malheureusement, le score de celui-ci est de 219-30 = 189 ...

diète
la source
1
Voici un compilateur que vous pouvez ajouter: ideone.com/jeoVgV
juniorRubyist