Love Tester Code Golf

9

Cree un programa que cuente el número total de letras comunes a dos nombres y encuentre el producto de sus longitudes para funcionar como un "probador de amor".

Condiciones: es posible que no obtenga una respuesta 1: 1 (siendo 3 de 3, etc.) de salida.

Entrada

Dos nombres de STDIN o la alternativa más cercana.

Salida

Calcule xcomo el número total de letras en común entre los dos nombres, ignorando mayúsculas y minúsculas. Calcule ycomo el producto de las longitudes de los nombres. Entonces la salida, a STDOUT o la alternativa más cercana, es

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

Ejemplos

Entrada:

Wesley
Polly

Salida:

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

Wesley y Polly tienen 2 letras en común, yy lel producto de sus longitudes es 6 * 5 = 30.

Entrada:

Bill
Jill

Salida:

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

Bonos

  • Resta 30 bytes para usar fracciones simplificadas, x out of yes decir, está en forma totalmente reducida.

Tabla de clasificación:

La clasificación estará determinada por los idiomas. El código de golf termina el 17 de octubre a las 10:20 pm, hora del Pacífico (California)

Premios de representantes

  • Recibirá 10 repeticiones (un voto positivo) por estar entre los 5 primeros (excepto el primer lugar).
  • Recibirá 15 repeticiones (entrada aceptada) por ser el primer lugar.
  • También puede obtener una recompensa de otra persona.

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma. **

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

** Fragmento de pila de Sign That Word de Kslkgh


Felicitaciones a los siguientes:

  1. Ganador Dennis (Pyth)
  2. Dennis (CJam)
  3. NBZ (APL)
  4. molarmanful (JavaScript ES6)
  5. Alex A. (Julia)
juniorrubista
fuente
3
¿Para qué debería ser la salida Aaron\nAhmad? O samename\nsamename?
lirtosiast
3
No estoy claro cómo estás contando las letras totales en común cuando las letras se repiten. Si los nombres tienen ay bde alguna letra, ¿cuentan para min(a,b)repeticiones?
xnor
como dice @xor, ¿cómo estás contando letras repetidas? Según el segundo ejemplo, parece que está contando caracteres repetidos, por lo que si el primer ejemplo se invirtió, ¿espera un resultado diferente?
Rnet
¿Es totalmente ajeno a la complejidad de kolmogorov ?

Respuestas:

1

Pyth, 40 bytes

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

El código tiene una longitud de 70 bytes y califica para la bonificación de -30 bytes .

Pruébalo en línea.

  [                        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
fuente
3

Dyalog APL , 94 91-30 = 61 bytes

Por lo general, el golf APL da como resultado un código más compacto, pero no más complejo, de lo normal, pero en este caso guardo los caracteres de manera fea:

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

,⍪'out of' 'chances of'crear una tabla de 2 × 2 de los números (izquierda) y textos (derecha)
×/≢¨⍵producto de las longitudes de
32|⎕UCS¨⍵armonizar las mayúsculas y minúsculas valores UCS
≢⊃∩/coinciden la intersección de los dos conjuntos
⊢÷∨/dividir la cuenta y el producto con su GCD
,' love.',⍨∊convertirlo en una lista simple y append amor.
⍵,⍪'and' 'have'cree una tabla de nombres 2 × 2 (izquierda) y textos (derecha)
∊' ',¨anteponga un espacio a cada celda de la tabla y luego, en una lista simple,
1↓suelte el espacio superfluo inicial

Gracias a ngn por -3 bytes.

Adán
fuente
Parece que esto es solo una función, mientras que el OP especificó la entrada de STDIN y la salida a STDOUT (es decir, un programa completo en lugar de solo una función).
Alex A.
@AlexA. APL no tiene STDIN, pero puede emitir un mensaje para aceptar los dos nombres en el formato 'Wesley' 'Polly'. Si cree que esto sería más justo, siéntase libre de agregar (U + 2395) al final de la línea (después del }) y ajustar el puntaje a 65.
Adám
2

Javascript ES6, 123 bytes

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

Tanto por el "amor" ... Realmente podría hacer con menos bytes.

Ejecute el fragmento de código en Firefox.

Mama Fun Roll
fuente
2
Parece que esto es solo una función, mientras que el OP especificó la entrada de STDIN y la salida a STDOUT (es decir, un programa completo en lugar de solo una función).
Alex A.
2

Julia, 129 bytes

El código es de 159 bytes pero califica para el bono 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.")

Esto probablemente podría acortarse al no optar por la bonificación, pero quería mostrar el tipo de número racional de Julia. :)

Sin 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()función construye un objeto de tipo Rationalque tiene campos numy den, correspondiente al numerador y denominador respectivamente. El beneficio de usar este tipo aquí es que Julia hace la reducción por nosotros; no tenemos que preocuparnos por reducir la fracción nosotros mismos.

Alex A.
fuente
2

CJam, 55 bytes

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

El código tiene una longitud de 85 bytes y califica para la bonificación de -30 bytes .

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

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
fuente
1

Dyalog APL, 84-30 = 54 bytes

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

Este es un tren , inspirado en la respuesta de Adám .

×/≢¨ producto de las longitudes

{+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵} posibilidades de amor

(,÷v)la concatenación dividida por el MCD; entre las dos expresiones anteriores, esto reduce la fracción

⊢, anteponer los nombres

,¨⍨ baraja las cadenas de la izquierda con los valores de la derecha

aplanar


Cálculo de "posibilidades de amor" en detalle: {+/⌊⌿+⌿↑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

prueba , prueba2

ngn
fuente
0

Java 8, 192 bytes

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
fuente
0

Ruby, 153 bytes

Más de lo que esperaba. No sé si el bono de 30 bytes se aplica a esto.

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
fuente
¿Podría agregar un enlace a un compilador? (Recomiendo Ideone)
juniorRubyist
0

Python 2.7, 161 bytes

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

Pruébelo aquí: http://ideone.com/jeoVgV

Y aquí hay una versión que simplifica la fracción:

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)

Lamentablemente, este puntaje es 219-30 = 189 ...

dieter
fuente
1
Aquí es un compilador puede agregar: ideone.com/jeoVgV
juniorRubyist