Código do Verificador do Amor Golfe

9

Crie um programa que conte o número total de letras comuns a dois nomes e encontre o produto de seus comprimentos para funcionar como um "testador de amor".

Condições: você pode não obter uma resposta 1: 1 (sendo 3 em 3, etc.).

Entrada

Dois nomes de STDIN ou alternativa mais próxima.

Resultado

Calcule xcomo o número total de letras em comum entre os dois nomes, ignorando maiúsculas e minúsculas. Calcule ycomo o produto dos comprimentos dos nomes. Então a saída, para STDOUT ou alternativa mais próxima, é

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

Exemplos

Entrada:

Wesley
Polly

Resultado:

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

Wesley e Polly têm 2 letras em comum, ye l, e o produto de seus comprimentos é 6 * 5 = 30.

Entrada:

Bill
Jill

Resultado:

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

Bónus

  • Subtraia 30 bytes para usar frações simplificadas, ou x out of yseja, na forma totalmente reduzida.

Entre os melhores:

A classificação será determinada por idiomas. O código de golfe termina em 17 de outubro às 22h20. Horário de verão do Pacífico (Califórnia)

Prêmios de Rep

  • Você receberá 10 representantes (um voto positivo) por estar entre os 5 primeiros (exceto o primeiro lugar).
  • Você receberá 15 representantes (entrada aceita) por ser o primeiro lugar.
  • Você também pode receber uma recompensa de outra pessoa.

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma. **

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

** Fragmento de pilha de Sign That Word por Kslkgh


Parabéns pelo seguinte:

  1. Vencedor Dennis (Pitth)
  2. Dennis (CJam)
  3. NBZ (APL)
  4. Molarmanful (JavaScript ES6)
  5. Alex A. (Julia)
juniorRubyist
fonte
3
Para que serve a saída Aaron\nAhmad? Ou samename\nsamename?
lirtosiast
3
Não sei como você está contando o total de letras em comum quando as letras se repetem. Se os nomes têm ae bde alguma letra, eles contam para min(a,b)repetições?
Xnor
como diz o @xor, como você está contando cartas repetidas? No segundo exemplo, parece que você está contando caracteres repetidos; portanto, se o primeiro exemplo foi revertido, espera um resultado diferente?
Rnet 15/10
Não está totalmente relacionado à complexidade de kolmogorov ?

Respostas:

1

Pitão, 40 bytes

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

O código tem 70 bytes e se qualifica para o bônus de -30 bytes .

Experimente 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
fonte
3

Dyalog APL , 94 91-30 = 61 bytes

Normalmente, o golfe APL resulta em um código que é mais compacto - mas não mais complexo - do que o normal, mas nesse caso eu salvo caracteres de maneira feia:

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

,⍪'out of' 'chances of'crie uma tabela 2 × 2 de números (esquerda) e textos (direita)
×/≢¨⍵de comprimentos,
32|⎕UCS¨⍵harmonize os valores UCS maiúsculos e minúsculos
≢⊃∩/, a interseção dos dois conjuntos
⊢÷∨/divide o registro e o produto com seu GCD o
,' love.',⍨∊transforma em uma lista simples e anexa amor.
⍵,⍪'and' 'have'crie uma tabela 2 × 2 de nomes (esquerda) e textos (direita)
∊' ',¨acrescente um espaço a cada célula da tabela e, em seguida, faça uma lista simples
1↓soltar o espaço supérfluo inicial

Graças a ngn por -3 bytes.

Adão
fonte
Parece que isso é apenas uma função, enquanto o OP especificou a entrada STDIN e a saída para STDOUT (ou seja, um programa completo em vez de apenas uma função).
Alex A.
@AlexA. O APL não possui STDIN, mas pode emitir um prompt para aceitar os dois nomes no formato 'Wesley' 'Polly'. Se você acha que isso seria mais justo, sinta-se livre para acrescentar (U + 2395) para, em seguida, final da linha (após a }), e ajustar o placar para 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 "amor" ... eu realmente poderia fazer com menos bytes.

Execute o trecho de código no Firefox.

Mama Fun Roll
fonte
2
Parece que isso é apenas uma função, enquanto o OP especificou a entrada STDIN e a saída para STDOUT (ou seja, um programa completo em vez de apenas uma função).
Alex A.
2

Julia, 129 bytes

O código tem 159 bytes, mas é qualificado para o bônus -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.")

Provavelmente isso poderia ser reduzido se não fosse pelo bônus, mas eu queria mostrar o tipo de número racional de Julia. :)

Ungolfed:

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

A Rational()função constrói um objeto do tipo Rationalque possui campos nume den, correspondendo ao numerador e denominador, respectivamente. O benefício de usar esse tipo aqui é que Julia faz a redução para nós; não precisamos nos preocupar em reduzir a fração.

Alex A.
fonte
2

CJam, 55 bytes

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

O código tem 85 bytes de comprimento e se qualifica para o bônus de -30 bytes .

Experimente on-line no intérprete CJam .

Como 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
fonte
1

Dyalog APL, 84-30 = 54 bytes

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

Este é um trem , inspirado na resposta de Adám .

×/≢¨ produto dos comprimentos

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

(,÷v)a concatenação dividida pelo GCD; entre as duas expressões acima, isso reduz a fração

⊢, preceda os nomes

,¨⍨ embaralha as cordas à esquerda com os valores à direita

aplainar


Computação "Chances de amor" em detalhes: {+/⌊⌿+⌿↑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

teste , teste2

ngn
fonte
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
fonte
0

Ruby, 153 bytes

Mais do que eu esperava. Não sei se o bônus de 30 bytes se aplica a isso.

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
fonte
Você poderia adicionar um link para um compilador? (Ideone 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))

Teste aqui: http://ideone.com/jeoVgV

E aqui está uma versão que simplifica a fração:

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)

Infelizmente a pontuação dessa pessoa é 219-30 = 189 ...

dieter
fonte
11
Aqui está um compilador que você pode adicionar: ideone.com/jeoVgV
juniorRubyist 15/10/2015