주어진 문자열 s의 같은 소문자로 구성
aabaaababbbbaaba
및 t 가 s 의 길이로 반복 될 때 가능한 한 많은 문자를 갖도록 길이 n 스트링 t를 출력하는 것과 같은 양의 정수 n . 주어진 예제의 경우 대상 문자열과 공통으로 13 개의 문자가 있기 때문에 최적 출력은입니다 .4
aaba
s: aabaaababbbbaaba
t: aabaaabaaabaaaba (aaba)
^^^^^^^^ ^ ^^^^
그리고 가능한 t 는 더 이상 없습니다 . 그러나 대해 aaaaaab
:가 두 개의 가능한 출력은 다음 aaaa
과 aaba
각 대상 문자열 6 개 공통 문자를 갖는 :
s: aaaaaab
t: aaaaaaaa (aaaa)
^^^^^^
s: aaaaaab
t: aabaaaba (aaba)
^^ ^^^^
하나 aaaa
또는 aaba
출력, 또는 둘 모두 당신이 원하는 경우에 할 수있다. 참고 이야 지금까지 반복하지 않는다; t의a
반복되는 두 값의 후행 은 단순히 무시됩니다.
테스트 사례
Inputs -> Valid outputs
1 a -> a
1 aa -> a
2 aa -> aa
1 ab -> a b
2 ab -> ab
1 abb -> b
2 abb -> ab bb
2 ababa -> ab
2 abcba -> ab
2 aabbbbb -> bb (ab is not a valid output here)
3 aababba -> aab abb
3 aababbaa -> aab
3 asdasfadf -> asf
3 asdasfadfsdf -> asf adf
2 abcdefghijklmnopqrstuvwxyzyx -> yx
2 supercalifragilisticexpialidocious -> ic ii
3 supercalifragilisticexpialidocious -> iri ili ioi
4 supercalifragilisticexpialidocious -> scii
5 supercalifragilisticexpialidocious -> iapic
2 eeeebaadbaecaebbbbbebbbbeecacebdccaecadbbbaceebedbbbddadebeddedbcedeaadcabdeccceccaeaadbbaecbbcbcbea -> bb be
10 bbbbacacbcedecdbbbdebdaedcecdabcebddbdcecebbeeaacdebdbebaebcecddadeeedbbdbbaeaaeebbedbeeaeedadeecbcd -> ebbbdbeece ebdbdbeece
20 aabbbaaabaaabaaaabbbbabbbbabbbabbbbbabbaaaababbbaababbbaababaaaabbaaabbaabbbabaaabbabbaaabbaaaaaaaba -> aabbbbaaabbabbbaabba
규칙
- 입력이 비어 있지 않은 소문자 문자열이고 문자열 길이보다 크지 않은 양의 정수라고 가정 할 수 있습니다.
- 표준 형식과 순서에 상관없이 입력을받을 수 있습니다.
- 줄 바꿈 또는 공백 등으로 구분하여 단일 문자열 또는 하나 이상의 배열 형태로 출력 할 수 있습니다.
- 코드는 최신 컴퓨터에서 1 분 이내에 각 테스트 사례마다 완료해야합니다.
- 이것은 code-golf 이므로 가능한 한 코드를 짧게 만드십시오.
답변
젤리 , 11 바이트
sZµṢŒrUṀṪµ€
이것에 대해 Dennis를 이길 것으로 기대하지 않았으므로 FGITW를 시도했습니다 (여러 가지 가능성을 시도한 후 11 가지 방법이 있습니다). 놀랍게도 짧아졌습니다.
문자열을 가져온 다음 개수를 명령 줄 인수로 사용합니다. stdout에서 출력합니다.
설명
sZµṢŒrUṀṪµ€
s Split {the first input} into {the second input}-sized groups
Z Transpose
µ µ€ On each of the transposed groups:
Ṣ Sort it;
Œr Run-length encode it;
U Rearrange it to the form {count, letter};
Ṁ Take the largest element (i.e. largest count)
Ṫ Take the second element of the pair (i.e. just the letter)
패턴의 각 위치에있는 문자가 해당 위치에 해당하는 가장 일반적인 문자 여야한다는 통찰력을 사용합니다. 패턴 크기 그룹으로 분할하고 조옮김을 통해 특정 패턴에 해당하는 문자를 찾을 수 있습니다. 이 솔루션이 너무 긴 주된 이유는 Jelly가 목록 모드를 찾는 짧은 방법이없는 것 같습니다 (여러 시도했지만 6 바이트 이상입니다).
@Dennis ‘솔루션을 기반으로하는 Jelly , 10 바이트
⁸ċ$ÞṪ
sZÇ€
이것은 @Dennis의 솔루션과 내 자신의 조합입니다. 이 솔루션에는 5 바이트 모드가 있었고이 솔루션을 훔쳤습니다. (나는 이미을 기반으로 한 솔루션을 가지고 ⁸ċ
있었지만 6 바이트 이하로는 얻을 수 없었습니다 Þ
.
설명
µ…µ€
그리고 Ç€
( …
이전 줄에서) 3 바이트 길이 (후자는 줄 바꾸기가 필요함)이며 이에 상응하는 것입니다. 일반적으로 전자를 사용하지만 후자를 더 유연하게 사용할 ⁸
수 있으므로 인수를 언급하는 데 사용할 수 있습니다 .
이로써 (분류 할 수 Þ
있는 발생의 숫자로) ⁸
( ⁸ċ
(마지막 요소를 가지고 다음) Ṫ
불과 5 문자 모드를 찾기 위해).
답변
수학, 51 바이트
#&@@@Commonest/@(PadRight@Partition[#2,UpTo@#])&
입력 및 출력은 문자 목록입니다.
또한 조옮김 선의 모드를 기반으로합니다. 나는 그들이 코드 골퍼를 뱉을 Commonest
목적 으로 만 목록 모드로 내장 기능을 호출했다고 생각 합니다.
답변
파이썬 3, 99, 73 61 바이트
-12, @Rod까지
lambda s,n:''.join(max(s,key=s[i::n].count)for i in range(n))
같은 생각이지만 import 문을 제거하기 위해 다시 작성했습니다.
lambda s,n:''.join(max(s,key=lambda c:s[i::n].count(c))for i in range(n))
기발한
from collections import*
lambda s,n:''.join(Counter(s[i::n]).most_common(1)[0][0]for i in range(n))
설명:
s[i::n] a slice of every nth character of s, starting at position i
Counter(s[i::n]) counts the characters in the slice
.most_common() returns a list of (character, count) pairs, sorted by decreasing count
[0][0] grabs the letter from the first pair (i.e., the most common letter
for i in range(n) repeat for all starting positions
''.join combines the most common letters into a single string
답변
파이썬 2, 106
이제는 다른 대답입니다! 나는 구걸에서 하나 (거의) 라이너에 대해 생각하고있었습니다. @Rod의 zip 사용량을 기준으로 더 짧아졌습니다.
람다를 답변으로 사용하는 것에 대한 설명을 @@ L3viathan 및 @Rod에게 감사합니다
lambda S,N:max(combinations(S,N),key=lambda s:sum(x==y for x,y in zip(S,s*len(S))))
from itertools import*
설명:
combinations(S,N)
S의 문자에서 길이 N의 모든 조합을 만듭니다.
max()
key
요소를 비교하는 데 사용할 입력 함수로 사용되는 인수 가 있습니다.
lambda s:sum(x==y for x,y in zip(S,s*len(S)))
그러한 기능으로 전달
이 람다는 튜플 목록에서 일치하는 문자 수를 계산합니다. zip(S,s*len(S))
s
-조합 중 하나이며 len(S)
S보다 길게 보장되는 문자열을 생성 하여 곱합니다.
zip
각 문자열의 문자 튜플 생성 S
과 s*len(S)
과 (이상 다른 것보다 하나의 문자열의 경우) 일치시킬 수없는 모든 문자를 무시
그래서 max
이 선택하는 조합, 그 생산 최대 합
답변
자바 스크립트 (ES6), 104 (101) 94 바이트
(n,s)=>s.replace(/./g,(_,i)=>[...s].map((c,j,a)=>j%n-i||(a[c]=-~a[c])>m&&(m++,r=c),m=r=``)&&r)
@Arnauld 덕분에 3 바이트를 두 번 절약했습니다. 개행 문자 이외의 모든 문자와 작동하는 97 바이트 솔루션 :
(n,s)=>s.replace(/./g,(_,i)=>[...s].map((c,j)=>j%n-i||(o[c]=-~o[c])>m&&(m++,r=c),m=r=``,o={})&&r)
이전 104 바이트 솔루션은 개행 문자와도 작동합니다.
(n,s)=>[...Array(n)].map((_,i)=>[...s].map((c,j)=>j%n-i||(o[c]=-~o[c])>m&&(m++,r=c),m=0,o={})&&r).join``
답변
젤리 , 12 11 바이트
s@ZċþZMḢ$€ị
작동 원리
s@ZċþZMḢ$€ị Main link. Arguments: n (integer), s (string)
s@ Split swapped; split s into chunks of length n.
Z Zip/transpose, grouping characters that correspond to repetitions.
ċþ Count table; for each slice in the previous result, and each character
in s, count the occurrences of the character in the group.
This groups by character.
Z Zip/transpose to group by slice.
$€ Map the two-link chain to the left over the groups.
M Find all maximal indices.
Ḣ Head; pick the first.
ị Index into s to retrieve the corresponding characters.
답변
Pyth, 11 바이트
meo/dNd.TcF
s,n
문자 목록으로 입력을 받아서 출력합니다.
설명
meo/dNd.TcF
cFQ Split s into chunks of length n.
.T Transpose.
m o/dNd Sort characters in each string by frequency.
e Take the most common.