사랑 테스터 코드 골프


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.

웨슬리와 폴리 공통점이 개 문자가, y그리고 l, 그들의 길이의 제품은 6 * 5 = 30이다.

입력:

Bill
Jill

산출:

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

보너스

  • 단순화 된 분수를 사용하기 위해 30 바이트를 빼십시오. 즉 x out of y, 완전히 축소 된 형식입니다.

리더 보드 :

순위는 언어에 따라 결정됩니다. 코드 골프는 10 월 17 일 오후 10:20에 태평양 일광 절약 시간 (캘리포니아)에 종료됩니다.

대표 상

  • 상위 5 개 (1 위 제외)에 10 명 (공개 투표)을받습니다.
  • 1 위를 차지한 사람은 15 명 (입장 접수)입니다.
  • 다른 사람에게서 현상금 보상을받을 수도 있습니다.

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다. **

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

** Kslkgh의 Sign That Word의 스택 스 니펫


다음을 축하합니다 :

  1. 우승자 데니스 (Pyth)
  2. 데니스 (CJam)
  3. NBZ (APL)
  4. molarmanful (자바 스크립트 ES6)
  5. 알렉스 에이 (줄리아)

3
결과는 무엇입니까 Aaron\nAhmad? 아니면 samename\nsamename?
lirtosiast

3
글자가 반복 될 때 총 글자 수를 어떻게 계산하는지 잘 모르겠습니다. 이름에 문자 가 a있고 b일부 문자 가 있으면 min(a,b)반복 되는 것으로 간주 됩니까?
xnor

@ xor가 말했듯이 반복되는 문자를 어떻게 계산합니까? 두 번째 예에서는 반복되는 문자를 세는 것으로 보이므로 첫 번째 예가 반대로 된 경우 다른 결과가 예상됩니까?
Rnet

kolmogorov-complexity 와 완전히 관련이 없습니까?

답변:


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'길이가 2x2 인 숫자 표 (왼쪽)와 텍스트 (오른쪽)의
×/≢¨⍵제품이
32|⎕UCS¨⍵대문자와 소문자 UCS 값을 조화
≢⊃∩/시킵니다 두 세트의 교차 부분이
⊢÷∨/집계를 나누고 GCD가있는 제품
,' love.',⍨∊이 간단한 목록으로 만들어 추가합니다. 사랑. 각 테이블 셀에 공백을
⍵,⍪'and' 'have'두어 2x2 이름의 테이블 (왼쪽)과 텍스트 (오른쪽)
∊' ',¨를 만든 다음
1↓초기 불필요한 공간 을 간단한 목록으로 만듭니다.

-3 바이트에 대한 ngn 덕분입니다.


OP는 STDIN에서 입력을 지정하고 STDOUT으로 출력 (즉, 기능이 아닌 전체 프로그램)하는 반면 이것은 기능 일뿐입니다.
Alex A.

@AlexA. APL에는 STDIN이 없지만 형식으로 두 이름을 수락하라는 프롬프트를 발행 할 수 있습니다 'Wesley' 'Polly'. 이것이 더 공평하다고 생각한다면 , 라인 끝에 () 다음에 (U + 2395) 를 추가 }하고 점수를 65로 조정하십시오.
Adám

2

자바 스크립트 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으로 출력 (즉, 기능이 아닌 전체 프로그램)하는 반면 이것은 기능 일뿐입니다.
Alex A.

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

보너스 를 가지 않으면 짧아 질 수 있지만 Julia의 합리적인 숫자 유형을 보여주고 싶었습니다. :)

언 골프 드 :

# 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. 여기서이 유형을 사용하면 Julia가 축소 작업을 수행 할 수 있습니다. 우리는 분수 자체를 줄이는 것에 대해 걱정할 필요가 없습니다.


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↑⍵}(,÷∨)(×/≢¨)

열차Adám의 답변 에서 영감을 얻은 열차 입니다.

×/≢¨ 길이의 곱

{+/⌊⌿+⌿↑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

테스트 , TEST2


0

자바 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

파이썬 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.