Любовь Тестер Код Гольф


9

Создайте программу, которая подсчитывает общее количество букв, общих для двух имен, и находит произведение их длины, чтобы функционировать как «тестер любви».

Условия: вы не можете получить ответ 1: 1 (3 из 3 и т. Д.).

вход

Два имени из STDIN или ближайшей альтернативы.

Вывод

Вычислить xкак общее количество букв, общих между двумя именами, игнорируя регистр. Вычислить yкак произведение длин имен. Тогда вывод на STDOUT или ближайшую альтернативу

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

Примеры

Входные данные:

Wesley
Polly

Вывод:

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

Уэсли и попка есть 2 буквы в общем, yи l, а произведение их длин равна 6 * 5 = 30.

Входные данные:

Bill
Jill

Вывод:

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

Бонусы

  • Вычтите 30 байт для использования упрощенных дробей, т.е. x out of yв полностью приведенном виде.

Leaderboard:

Рейтинг будет определяться языками. Кодовый гольф заканчивается 17 октября в 22:20 по тихоокеанскому летнему времени (Калифорния)

Реп Призы

  • Вы получите 10 повторений (повышение) за попадание в топ-5 (кроме первого места).
  • За первое место вы получите 15 повторений (принятая запись).
  • Вы также можете получить вознаграждение от другого человека.

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. **

Чтобы убедиться, что ваш ответ отображается, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

** Фрагмент стека от Подписи этого слова от Kslkgh


Поздравляю со следующим:

  1. Победитель Деннис (Пиф)
  2. Деннис (CJam)
  3. НБЗ (APL)
  4. молярный (JavaScript ES6)
  5. Алекс А. (Юлия)

3
Для чего нужен выход Aaron\nAhmad? Или samename\nsamename?
lirtosiast

3
Мне неясно, как вы подсчитываете общее количество букв, когда буквы повторяются. Если в именах есть aи bкакие-то буквы, учитываются ли эти min(a,b)повторения?
xnor

как говорит @xor, как ты считаешь повторяющиеся буквы? Во втором примере кажется, что вы подсчитываете повторяющиеся символы, поэтому, если первый пример был перевернут, то ожидаете ли вы другого результата?
Rnet

Разве это совершенно не связано с колмогоровской сложностью ?

Ответы:


1

Pyth, 40 байт

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

Код длиной 70 байт соответствует бонусу -30 байт .

Попробуйте онлайн.

  [                        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.

3

Dyalog APL , 94 91-30 = 61 байт

Обычно игра в гольф APL приводит к тому, что код становится более компактным, но не более сложным, чем обычно, но в этом случае я сохраняю символы ужасными способами:

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

,⍪'out of' 'chances of'создайте таблицу чисел 2 × 2 (слева) и текст (справа):
×/≢¨⍵произведение длин
32|⎕UCS¨⍵гармонизирует верхний и нижний регистры значений UCS,
≢⊃∩/пересечение двух наборов
⊢÷∨/делит счет, а произведение с их GCD
,' love.',⍨∊превращает его в простой список и добавляет любовь.
⍵,⍪'and' 'have'создать таблицу имен 2 × 2 (слева) и тексты (справа),
∊' ',¨добавив пробел к каждой ячейке таблицы, а затем превратить в простой список
1↓исходный лишний пробел

Спасибо ngn за -3 байта.


Похоже, что это только функция, в то время как OP указывает ввод из STDIN и вывод в STDOUT (т. Е. Полная программа, а не просто функция).
Алекс А.

@AlexA. APL не имеет STDIN, но может выдать приглашение принять два имени в формате 'Wesley' 'Polly'. Если вы считаете, что это будет более справедливо, не стесняйтесь добавлять (U + 2395) к самому концу строки (после }) и скорректируйте счет до 65.
Adám

2

Javascript ES6, 123 байта

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

Так много для "любви" ... Я действительно мог бы сделать с меньшим количеством байтов.

Запустите фрагмент кода в Firefox.


2
Похоже, что это только функция, в то время как OP указывает ввод из STDIN и вывод в STDOUT (т. Е. Полная программа, а не просто функция).
Алекс А.

2

Юлия, 129 байт

Код составляет 159 байт, но он соответствует бонусу -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.")

Вероятно, это можно было бы сделать короче, если бы не получить бонус, но я хотел показать рациональный тип чисел Джулии. :)

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

Rational()Функция создает объект типа , Rationalкоторый имеет поле numи den, соответствующий числитель и знаменатель соответственно. Преимущество использования этого типа здесь в том, что Джулия делает сокращение для нас; нам не нужно беспокоиться о сокращении доли сами.


2

CJam, 55 байтов

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

Код длиной 85 байт соответствует бонусу -30 байт .

Попробуйте онлайн в интерпретаторе CJam .

Как это работает

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.

1

Dyalog APL, 84-30 = 54 байта

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

Это поезд , вдохновленный ответом Адама .

×/≢¨ произведение длин

{+/⌊⌿+⌿↑1↑¨⍨-32|⍉⎕ucs↑⍵} шансы на любовь

(,÷v)конкатенация, разделенная на GCD; между двумя вышеупомянутыми выражениями это уменьшает долю

⊢, добавлять имена

,¨⍨ перемешивает строки слева со значениями справа

расплющить


Вычисление «Шансов любви» подробно: {+/⌊⌿+⌿↑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

тест , тест2


0

Java 8, 192 байта

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

Пример:

System.out.println(y.apply("Bill","Jill"));
System.out.println(y.apply("Wesley","Polly"));

0

Рубин, 153 байта

Дольше, чем я ожидал. Я не знаю, применяется ли 30-байтовый бонус для этого.

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

Не могли бы вы добавить ссылку на компилятор? (Я рекомендую Ideone)
juniorRubyist

0

Python 2,7, 161 байт

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

Проверьте это здесь: http://ideone.com/jeoVgV

И вот версия, которая упрощает дробь:

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)

К сожалению, этот счет 219-30 = 189 ...


1
Вот компилятор, который вы можете добавить: ideone.com/jeoVgV
juniorRubyist
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.