내 딸의 알파벳


65

다른 날에는 냉장고 자석 문자로 딸과 함께 문장을 쓰고있었습니다. 우리가 일부 (만들 수있는 동안 I love cat), 우리는 다른 사람을 (하기에 충분한 문자를 가지고 있지 않았다 I love you too때문에 문자의 불충분 한 양) o(4)

그런 다음 한 세트에 3 e글자가 포함되었지만 2 o글자 만 있음을 알았습니다 . 아마도 http://en.wikipedia.org/wiki/Letter_frequency에서 영감을 얻은 것은 여전히 ​​"냉장고에있는"실제 상황을 반영하지 않을 것입니다.

문제

각 줄에 "샘플 문장"이 포함 된 텍스트 파일이 있다면, 냉장고에 쓰려고하는 최소한의 문자로 된 알파벳 세트를 제안하지만 여전히 각 문장을 개별적으로 쓸 수는 있습니다.

참고 : 모든 자석 문자는 대문자 인 경우를 무시하십시오.

입력

파일은 개행으로 구분 된 문장을 포함합니다 :

hello
i love cat
i love dog
i love mommy
mommy loves daddy

산출

각 문자가 문장을 쓰기에 충분할만큼만 나타나는 정렬 된 문자 목록을 다시 제공하십시오.

acdddeghillmmmoostvyy

(감사합니다, isaacg!)

우승자

최단 구현 (코드)

업데이트 : 테스트

추가 테스트를 작성하고 여기에서 다양한 답변을 시도했습니다.

https://gist.github.com/romaninsh/11159751


2
v출력에 문자가 있어야합니다 ;)
Antonio Ragagnin

40
우리는 / 거꾸로 대체하는 데 필요한 수 있습니다 MA에 대한 W, 또는 옆으로 NA의를 Z? ;-)
Ilmari Karonen

4
기본적으로 Is를 사용하여 모든 글자를 구성 할 수 있습니다 .
swish

7
더 진지하게, "사례 무시"라고 할 때 , 입력이 모두 같은 경우에 있다고 가정 하거나 모두 같은 경우로 변환해야 한다고 가정 합니까? 또한 출력에 선행 공백이 포함되어 있습니까?
Ilmari Karonen

3
@Doorknob :_\¯
Ilmari Karonen

답변:


18

GolfScript, 28/34 자

n/:a{|}*{a{.[2$]--}%*$-1=}%$

위의 28 자 프로그램은 모든 입력 문자가 동일한 경우라고 가정합니다. 이것이 반드시 필요한 것은 아니라면 {95&}%, 코드 앞에 추가 하여 총 34 개의 문자 를 대문자로 만들 수 있습니다 .

{95&}%n/:a{|}*{a{.[2$]--}%*$-1=}%$

노트:

  • 올바르게 작동하려면 입력에 적어도 하나의 줄 바꿈이 포함되어야합니다. 이것은 각 줄 끝에 줄 바꿈이있는 일반 텍스트 파일의 경우에 해당하지만 입력이 후행 줄 바꿈이없는 한 줄로만 구성된 경우에는 맞지 않을 수 있습니다. 이것은 n+코드 앞에 추가 하여 두 개의 추가 문자를 사용하여 해결할 수 있습니다 .

  • 34 자 버전에서 사용 된 대문자는 실제로 조잡합니다. 소문자 ASCII 문자를 대문자와 동등한 문자 (및 공백은 NULs)로 매핑 하지만 숫자와 구두점을 완전히 엉망으로 만듭니다. 입력에 이러한 문자가 포함되지 않는다고 가정합니다.

  • 28 자 버전은 모든 입력 문자 (개행 및 NULs 제외 )를 동일하게 취급합니다 . 특히, 입력에 공백이 있으면 일부가 출력에도 나타납니다. 편리하게 인쇄 가능한 다른 ASCII 문자보다 먼저 정렬됩니다. 그러나 34 자 버전은 공백을 무시합니다 (추가 문자가 들지 않고 그렇게 할 수 있기 때문에).

설명:

  • 선택적 {95&}%접두어는 각 입력 바이트의 ASCII 코드의 6 번째 비트를 0으로 만들어 입력을 대문자로합니다 ( ). 이렇게하면 소문자 ASCII 문자를 대문자로, 공백을 null 바이트로 매핑하고 줄 바꿈을 변경하지 않습니다.95 = 64 + 31 = 10111112

  • n/입력을 개행으로 나누고 :a결과 배열을 변수에 할당합니다 a. 그런 다음 {|}*배열에서 문자열의 합집합을 계산합니다 (배열에 두 개 이상의 요소가 있다고 가정 할 경우). 입력에서 개행 문자가 아닌 모든 문자를 포함하는 문자열을 생성합니다.

  • 다음 { }%루프는 이러한 각 고유 문자를 반복합니다. 루프 본문 내에서 내부 루프 a{.[2$]--}%는 배열의 문자열을 반복 a하여 각 문자열에서 외부 루프가 반복되는 문자와 같지 않은 모든 문자를 제거합니다.

    내부 루프는 현재 문자의 ASCII 코드를 스택의 필터링 된 배열 아래에 둡니다. 필터링 된 배열을 *정렬하기 전에 ( ) ASCII 코드 ( ) 로 표시된 횟수만큼 반복 $하고 마지막 요소 ( -1=)를 가져 와서이를 사용합니다 . 실제로, 이것은 문자가 ASCII 코드가 0 인 경우를 제외하고 필터링 된 배열에서 가장 긴 문자열을 생성합니다 (모두 동일한 문자의 반복으로 구성되므로 사전 식 정렬은 길이별로 정렬 함) .

  • 마지막으로 $끝에는 출력을 알파벳순으로 정렬합니다.


3
놀랄 만한. TODO : GolfScript를 배우십시오!
DLosc

1
26으로 줄일 수도 있습니다 n/:a{|}*{{{=}+,}+a%$-1=}%$.
Howard

13

J-37 자

stdin에서 읽고 콘솔로 출력합니다.

dlb#&a.>./+/"2=/&a.tolower;._2[1!:1]3

1!:1]3stdin에 대한 호출입니다. tolower;._2행을 분할하고 동시에 소문자를 만들어 이중 의무를 수행합니다. 그런 다음 각 행에서 문자가 몇 번이나 발생하는지 계산 +/"2=/&a.하고를 사용하여 모든 행에서 최대 포인트 수를 취합니다 >./.

마지막으로, 각 문자의 많은 문자를로 알파벳에서 빼냅니다 #&a.. 여기에는 ASCII 값이 낮아 전면에서 발견되는 공백이 포함됩니다. 따라서 앞에 공백을 삭제 dlb합니다.


12

자바 스크립트 (ECMAScript를 6) - 148 개 139 135 문자

버전 2 :

배열 이해를 사용하도록 업데이트되었습니다.

[a[i][0]for(i in a=[].concat(...s.split('\n').map(x=>x.split(/ */).sort().map((x,i,a)=>x+(a[i-1]==x?++j:j=0)))).sort())if(a[i-1]<a[i])]

버전 1 :

[].concat(...s.split('\n').map(x=>x.split(/ */).sort().map((x,i,a)=>x+(a[i-1]==x?++j:j=0)))).sort().filter((x,i,a)=>a[i-1]!=x).map(x=>x[0])

다음을 가정합니다.

  • 입력 문자열은 변수에 있습니다 s.
  • 우리는 입력의 경우를 무시할 수 있습니다 (질문에 의해 지정된대로 – 그것은 모두 대문자 또는 소문자입니다);
  • 출력은 문자 배열입니다 (JavaScript가 문자 목록에 대한 OP의 요구 사항에 근접 할 수있는 정도). 과
  • 출력이 콘솔에 표시됩니다.

의견으로 :

var l = s.split('\n')             // split the input up into sentences
         .map(x=>x.split(/ */)   // split each sentence up into letters ignoring any
                                  // whitespace
                  .sort()         // sort the letters in each sentence alphabetically
                  .map((x,i,a)=>x+(a[i-1]==x?++j:j=0)))
                                  // append the frequency of previously occurring identical
                                  // letters in the same sentence to each letter.
                                  // I.e. "HELLO WORLD" =>
                                  // ["D0","E0","H0","L0","L1","L2","O0","O1","R0","W0"]
[].concat(...l)                   // Flatten the array of arrays of letters+frequencies
                                  // into a single array.
  .sort()                         // Sort all the letters and appended frequencies
                                  // alphabetically.
  .filter((x,i,a)=>a[i-1]!=x)     // Remove duplicates and return the sorted
  .map(x=>x[0])                   // Get the first letter of each entry (removing the
                                  // frequencies) and return the array.

원하는 경우 :

  • 문자열로 반환 .join('')하고 끝에 추가 하십시오.
  • 사용자로부터 입력을받은 다음 s변수를 prompt(); 또는
  • 함수로 작성 하고 시작 부분에 f추가 f=s=>하십시오.

달리는:

s="HELLO\nI LOVE CAT\nI LOVE DOG\nI LOVE MOMMY\nMOMMY LOVE DADDY";
[].concat(...s.split('\n').map(x=>x.split(/ */).sort().map((x,i,a)=>x+(a[i-1]==x?++j:j=0)))).sort().filter((x,i,a)=>a[i-1]!=x).map(x=>x[0])

출력을 제공합니다.

["A","C","D","D","D","E","G","H","I","L","L","M","M","M","O","O","T","V","Y","Y"]

1
좋은! 당신은 줄여 3 바이트를 저장할 수 /\s*// */주위에 괄호를 제거j=0
nderscore

1
...대신 사용할 수 apply없습니까?
Ven

둘 다 덕분에 9 문자를 절약 할 수 있습니다. 스프레드 ( ...) 연산자는 제가 전에 보지 못한 것입니다.
MT0

[].concat(...s.split`N`.map(x=>x.split(/ */).map((x,i,a)=>x+(a[x]=a[x]?++j:j=1)))).sort().map((x,i,a)=>a[i-1]<x?x[0]:'').join``;
l4m2

11

펄-46 바이트

#!perl -p
$s=~s/$_//ifor/./g;$s.=uc}for(sort$s=~/\w/g){

shebang을 1로 계산합니다. 이것은 아래 Ruby 솔루션의 느슨한 번역입니다.


루비 1.8-72 바이트

s='';s+=$_.upcase.scan(/./){s.sub!$&,''}while gets;$><<s.scan(/\w/).sort

에서 입력을받습니다 stdin.

샘플 사용법 :

$ more in.dat
Hello
I love cat
I love dog
I love mommy
Mommy loves daddy

$ ruby fridge-letters.rb < in.dat
ACDDDEGHILLMMMOOSTVYY

출력을 정렬해야합니다.
Matt

@ 매트가 수정되었습니다.
primo

좋은. Perl이 막연히 최근이라면 /i과 사이에 공백이 필요합니다 for.
tobyink

8

파이썬 - 206 204 199 177 145 129 개 117 94 개 88 문자

print(''.join(c*max(l.lower().count(c)for l in open(f))for c in map(chr,range(97,123))))

파일 이름을 얻는 방법을 잘 모르겠으므로 현재 코드는이라는 변수에 포함되어 있다고 가정합니다 f. 변경해야 할 경우 알려주십시오.


8
유닉스의 정신으로-stdin에서 읽을 수 있습니다.
romaninsh

5
항상 파일 이름을 한 문자 길이로

3
@Tal 나는 또한 새롭지 만 문자를 저장하면 왜 안됩니까?

1
f입력 파일 이름 을 가정 하고 대문자를 사용하면 (자석은 모두 대문자 임) 91까지 줄일 수 있습니다.print(''.join([chr(i)*max(l.upper().count(chr(i))for l in open(f))for i in range(65,91)]))
Gabe

1
@ njzk2 글쎄, 만약 우리가 콘솔에서 이것을 실행한다면 이론적으로 결과 자체를 출력 할 것이다 ...
Tal

6

루비 1.9+, 51 (또는 58 또는 60)

a=*$<
?a.upto(?z){|c|$><<c*a.map{|l|l.count c}.max}

모든 것이 소문자라고 가정합니다. 소문자 구분 비아 7 자 비용 .upcase동안 케이스 무감각, 소문자 출력 비용 9 개 문자로 .downcase.


4

R (156, 파일 읽기 포함)

함께 테이블 나는 각 문장의 편지 주파수 테이블을 구성. 그런 다음 각 문자마다 최대 값을 가져옵니다.

a=c();for(w in tolower(read.csv(fn,h=F)$V1))a=c(a,table(strsplit(w,"")[[1]]));a=tapply(seq(a),names(a),function(i)max(a[i]))[-1];cat(rep(names(a),a),sep="")

언 골프 드 :

a=c()
words = read.csv(fn,h=F)$V1
for(w in tolower(words))
  a=c(a, table(strsplit(w, "")[[1]]))
a = tapply(seq(a), names(a), function(i) max(a[i]))[-1] ## The -1 excludes the space count.
cat(rep(names(a), a), sep="")

해결책:

acdddeghillmmmoooooostuvyy

@lambruscoAcido 당신은 당신에게 줄 것입니다 (golfed 코드의) 첫 번째 세 줄을 벡터화 할 수 a=unlist(lapply(readLines(fn),function(x)table(strsplit(tolower(x),""))));a=tapply(seq(a),names(a),function(i)max(a[i]))[-1];cat(rep(names(a),a),sep="")는 있지만 3 자만 짧습니다
jkd

것이라고는 할 만 112 문자를 또 다른 방법 cat(unlist(sapply(letters,function(i)rep(i,max(sapply(gregexpr(i,readLines(f)),function(x)sum(x>0)))))),sep="")가정은 f파일 이름입니다
JKD

4

하스켈, 109 108

import Data.List
import Data.Char
main=interact$sort.filter(/=' ').foldl1(\x y->x++(y\\x)).lines.map toLower

프로그램은 stdin에서 읽고 sdtout에 씁니다.

매우 간단합니다. 문자열을 줄 목록으로 나누고 목록을 반복하고 각 줄에 포함 된 새 문자를 추가하여 다시 작성합니다.


오, 왜 내가 전에 (\\)를 들어 본 적이 없습니까?
Flonk


4

6:56 53 자; 58 55 바이트

say |sort
([∪] lines.map:{bag comb /\S/,.lc}).pick(*)

각 줄에 대해 소문자 문자열 ( comb /\S/,.lc) 의 공백이 아닌 문자에 대해이 문자를 조합하여 Bag각 문자 의 , 또는 모음과 발생 횟수를 만듭니다.[∪]Bag모든 줄 에 대해 s 의 합집합을 취하여 문자가 발생한 최대 횟수를 가져옵니다. .pick(*)여기에 해킹이 있지만 Bag발생 횟수만큼 모든 문자를 복제 하는 가장 짧은 방법 입니다.

편집 : 그것이 더 짧은 지 확인하기 위해 histocrat의 Ruby 답변을 번역하려고했습니다 . 63 자이지만 여전히 접근 방식이 매우 좋습니다.

$!=lines».lc;->$c{print $c x max $!.map:{+m:g/$c/}} for"a".."z"

3

하스켈 183 162 159

파일이 있다고 가정합니다 file.txt!

import Data.Char
import Data.List
main=readFile"file.txt">>=putStr.concat.tail.map(tail.maximum).transpose.map(group.sort.(++' ':['a'..'z'])).lines.map toLower

예를 들어 file.txt에

abcde
abcdef
aaf

스크립트가 출력됩니다

aabcdef

기본적으로 각 줄에 전체 알파벳을 추가하여 그룹화 및 정렬 할 때 27 개의 요소가 포함 된 목록으로 끝날 것입니다. 다음으로, "frequency table"을 바꿉니다. 그래서이 배열의 각 행은 각 줄의 단일 문자의 주파수로 구성됩니다 ["a","","aaa","aa","aaaa"]. 그런 다음 각 배열의 최대 값을 선택하고 ( Ord문자열 의 인스턴스가 작동 하는 방식 때문에 원하는대로 작동 함) 시작 부분에 추가 한 문자를 삭제하고 공백을 제거하고 결과를 출력합니다.


1
대신drop 1tail
Bergi

@Bergi Haha derp, 감사합니다! 게시물에서 변경했습니다.
Flonk

3

C, 99 자

t[256];main(c){for(--*t;++t[1+tolower(getchar())];);for(c=97;c<123;c++)while(t[c]--)putchar(c-1);}

하나 이상의 줄 바꿈이 제공되면 충돌이 발생합니다. 나는 그것이 아주 쉽게 고칠 수 있다고 생각합니다.


시도했지만 올바른 결과를 얻지 못했습니다. gist.github.com/romaninsh/11159751
romaninsh

3

kdb (q / k) : 59 자 :

d:.Q.a! 26#0
.z.pi:{d|:.Q.a##:'=_y}.z.exit:{-1@,/.:[d]#'!:d}
  • 알파벳에서 사전 분류 된 시드 사전 생성 .Qa
  • 각 입력 줄을 처리하고, 소문자로 변환하고, 사전으로 그룹화하고, 각 요소를 세고, 결과에서 알파벳 문자를 가져옵니다 (즉, 공백, 줄 바꿈 등을이 단계에서 제거하십시오).
  • 구분 기호를 저장하기 위해 .z.pi로 전달되는 엑시트 핸들러를 정의하십시오. 각 키-값에서 가져와 문자 목록을 생성하고 평평한 다음 stdout으로 인쇄하십시오.

-1은 개행을 추가합니다. 1을 사용하면 문자가 저장되지만 지정된 출력이 생성되지 않습니다. 14 문자를 제거하는 .z.pi / .z.exit 상용구를 제거 할 수 있기를 바랍니다.

편집 : 시드 사전을 사용하여 inter / asc를 사용하지 마십시오.


3

펄, 46

for$:(a..z){$a[ord$:]|=$:x s/$://gi}}{print@a

STDIN에서 읽은 다른 Perl 솔루션은 다음과 같습니다 -n(+1 카운트). 프리모 점수와 관련이 있지만 불만없이 실행됩니다 :-). 비트 단위 or의 결과가 더 긴 문자열 인수의 길이를 갖는다 는 사실을 이용합니다 .


1
내 테스트로 시도하고 훌륭하게 작동했습니다.
romaninsh

3

내 솔루션을 추가하고 있습니다.

배쉬-72

입력이 파일 "i"에 있다고 가정

for x in {A..Z};do echo -n `cat i|sed "s/[^$x]//g"|sort -r|head -1`;done

설명

가능한 모든 문자에 대해 입력 파일에서만 필터링하여 다음과 같은 결과를 얻습니다.

AAA
A
A

AAAA

A
AAAAAAAAAAAAAAAA

그런 다음 결과가 정렬되고 가장 긴 줄이 선택됩니다. echo -n줄 바꿈을 제거해야합니다.


3

배쉬, 171 159 정크 출력 158, 138

소문자 전용 입력이 필요합니다. 파일이 _밑줄 이라고 가정합니다 . split(xaa, xab ... xaz, ???) 를 생성 하는 성가신 파일 이름으로 인해 입력 파일에 최대 26 줄이 있습니다.

에서는 bash, {a..z}출력한다 a b c d e f ....

touch {a..z}
split _ -1
for l in {a..z}
do for s in {a..z}
do grep -so $l xa$s>b$l
if [ `wc -l<b$l` -ge `wc -l<$l` ]
then mv b$l $l
fi
done
tr -d '\n'<$l
done

샘플 출력

acdddeghillmmmoostvyy

설명

touch {a..z}

bash가 존재하지 않는다고 불평하지 않도록 나중에 읽을 파일을 작성하십시오. 이 줄을 제거하면 13 문자를 저장하지만 많은 정크 출력을 얻을 수 있습니다.

split _ -1

입력 파일을 섹션 1 개씩 저장하는 섹션으로 분할하십시오. 이 명령으로 생성 된 파일의 이름은 xaa, xab, xac 등입니다. 이유는 모르겠습니다.

for l in {a..z}
do for s in {a..z}

각 문자마다 $l파일에 저장된 모든 줄을 읽습니다 xa$s.

do grep -so $l xa$s>b$l

-s1 문자를 저장하고 많은 정크 출력을 얻으려면 스위치를 제거하십시오 . 그것은 방지 grep(당신이 입력의 26 개 라인을 가지고하지 않는 한 발생) 존재하지 않는 파일에 대한 불평에서. 이것은 파일을 처리하고 xa$s, 발생하는 것만 제거 $l하고 출력을 파일로 보냅니다 b$l. 따라서 $lm 일 때 "I love mommy"는 각 문자 다음에 새로운 줄이있는 "mmm"이됩니다 .

if [ `wc -l<b$l` -ge `wc -l<$l` ]

방금 만든 파일의 줄 수가 (즉, 한 줄에 하나의 문자가 있기 때문에 더 많은 문자) 크거나 같으면 지금까지 가장 높은 결과의 줄 수 (에 저장 됨 $l) ...

then mv b$l $l

... 새 레코드를 파일에 저장하십시오 $l. 이 루프의 끝에서, 우리가 모든 줄을 다 지나갔을 때, 파일 $l은 각각 문자를 포함하는 x 줄을 저장합니다 $l. 여기서 x는 한 줄에서 그 문자의 가장 많은 발생 횟수입니다.

fi
done
tr -d '\n'<$l

특정 문자에 대한 파일 내용을 출력하여 줄 바꿈을 제거하십시오. 새 줄을 제거하지 않으려면 줄을로 변경하여 6 tr자를 echo $l저장하십시오.

done

GNU bash, 버전 3.2.51 (애플)을 사용해 보았지만 입력 데이터가 들어있는 현재 폴더에 '-l1aa'파일이 있습니다.
romaninsh

@romaninsh 다른 버전의 splitcoreutils 가있을 수 있습니다 . 현재 우분투 14.04에서 GNU bash 4.3.8 및 GNU coreutils 8.21을 실행 중이며 제대로 작동합니다 (업그레이드하기 전에 우분투 13.10에서도 작동했습니다). 그러나 프로그램과 입력 파일을 제대로 작동하려면 별도의 디렉토리에 배치해야했습니다 . 홈 폴더에있는 수백만 개의 정크 파일 때문일뿐입니다 .

사실 @romaninsh, 스크립트에서 정확한 명령을 보면 split _ -l1입력 내용이에 저장되고 있음을 알았을 -l1aa때 귀하의 버전이 옵션으로 split 인식되지 -l1않고 대신 출력 접두사로 사용 한다고 생각합니다 . -land 사이 1에 또는 공백을 --lines=1넣거나 그냥 -1넣으십시오 (이것은 이제 게시물을 업데이트 할 쓸모없고 골프적인 구문으로 보입니다).

3

C #, 172 바이트

var x="";foreach(var i in File.ReadAllText(t).ToLower().Split('\r','\n'))foreach(var j in i)if(x.Count(c=>c==j)<i.Count(c=>c==j))x+=j;string.Concat(x.OrderBy(o=>o)).Trim();

영리한 ... 영리한 ... 나는 linq와 함께 연주하는 것에 대해 생각했지만, 이러한 왜곡 된 foreachs만큼 짧을 것입니다 :)
Noctis

2

파이썬 2-129

@Tal의 아이디어

a,r=[0]*26,range(26)
for l in open('f'):a=[max(a[i],l.lower().count(chr(i+97)))for i in r]
print''.join(chr(i+97)*a[i]for i in r)

같은 수의 문자로 같은 일을하는 몇 가지 방법 :

a=[0]*26
b='(chr(i+97)))for i in range(26)'
exec'for l in open("f"):a=[max(a[i],l.lower().count'+b+']\nprint"".join(a[i]*('+b+')'

a=[0]*26
b='(chr(i+97)))for i in range(26))'
exec'for l in open("f"):a=list(max(a[i],l.lower().count'+b+'\nprint"".join(a[i]*('+b

이것은 파일이 액세스 가능한 디렉토리에 f로 저장되어 있다고 가정합니다. 이 프로그램은 추가 입력없이 직접 실행할 수 있습니다.


왜 다운 투표? 내가 잘못했다면 죄송합니다.
isaacg

2

매스 매 티카 v10-110

아직은 아니지만 새로운 문서를 매우 신중하게 읽으면 이것이 효과가 있다고 생각합니다.

StringJoin@MapIndexed[#2~Table~{#1}&,Rest@Merge[Counts/@Characters@StringSplit[ToLowerCase@Input[],"\n"],Max]]

2

스칼라, 125 자

val i=""::io.Source.stdin.getLines.toList.map(_.toLowerCase);println('a'to'z'map(c=>(""+c)*i.map(_.count(_==c)).max)mkString)

먼저 입력을 읽고 소문자로 변환하고 빈 줄을 추가합니다.

다음에서 각 문자 az나는 그것이 라인의에 나타납니다 배의 편지 최대 수를 반복한다 (필자는 빈 줄이 필요합니다 그 이유는 : maxenpty 입력에 호출 할 수 없습니다). 그런 다음 결과를 결합하고 출력으로 인쇄합니다.

대체 파일에서 읽으려면 stdin함께 fromFile("FILENAME")+ 파일 이름 길이 132 개 문자 코드의 크기를 증가.


2

자바 스크립트, 261 자

eval('s=prompt().toUpperCase().split("\\n");Z=[########0,0];H=Z.slice();s@r){h=Z.slice();r.split("")@c){if(c.match(/\\w/))h[c.charCodeAt(0)-65]++});H=H@V,i){return V>h[i]?V:h[i]})});s="";H@n,i){s+=Array(n+1).join(String.fromCharCode(i+97))});s'.replace(/@/g,".map(function(").replace(/#/g,"0,0,0,"))

를 제거하고 eval(...)실제 코드를 얻으려면 실행 하십시오 . 이것은 ( 약간 ) 압축되어 있습니다.

s행의 배열 및 출력 된 문자열로서의 다기능 h은 행당 문자 히스토그램을 H포함하고 지금까지 최대 값을 가진 히스토그램을 포함합니다. 대소 문자를 구분하지 않으며 az 및 AZ 이외의 것을 무시합니다 (JS 배열은 때때로 이상하다고 생각합니다).

이제 맞습니다 :)


이것은 질문의 내용이 아닌 문자의 합계입니다. 문자는 전부가 아니라 입력에서 단일 문장을 구성하기 위해 최소한으로 설정되어야합니다. 나는 출력을 정렬 할 필요가 없도록하기 위해 당신의 접근 방식을 아주 좋아합니다.
Matt

@Matt 아 맞다 ... 나중에 고칠 것이다. 지금은 시간이 없어요.
tomsmeding

1
@내가 끝날 때까지 무슨 일이 있었는지 궁금했습니다 . 나는 그것을 좋아한다 :)
Matt

2

자바 스크립트 ( ES5 ) 141 바이트

변수 s는 대소 문자 확인 요구 사항이없고 배열 출력이없는 입력 문자열 이라고 가정합니다 .

for(a in s=s[o=_='',y='split']('\n'))for(i=0;x=s[a][i++];)o+=x!=0&&(l=s[a][y](x).length-~-o[y](x).length)>0?Array(l).join(x):_;o[y](_).sort()

귀하의 솔루션을 테스트하고 출력을 위해 "o"를 찾고 있었지만 올바르게 정렬되지 않은 것 같습니다. ( gist.github.com/romaninsh/11159751 참조 )
romaninsh

@romaninsh 당신의 요지에서 볼 수있는 결과가 올바르게 정렬 된 것 같습니다
nderscore

예, 참조 / 올바른 출력입니다. : 나는 코드를 시도했을 때, 나는이 가지고 gist.github.com/romaninsh/11161018
romaninsh

예제를 잘못 실행하면 사과드립니다.
romaninsh

@romaninsh ah, 브라우저 콘솔에서 실행되도록 설계되었습니다. 다음은 노드에서 작동하는 형식이 바뀐
nderscore

2

PowerShell-141

'a'라는 파일에서 텍스트를 읽습니다.

$x=@{}
gc a|%{[char[]]$_|group|%{$c=$_.name.tolower().trim()
$n=$_.count;$x[$c]=($n,$x[$c])[$n-lt$x[$c]]}}
($x.Keys|sort|%{$_*$x[$_]})-join""

2

Groovy, 113/127 102/116 자

파일이 모두 한 경우에 있다고 가정하면 (102 자) :

t=new File('f').text;t.findAll('[A-Z]').unique().sort().each{c->print c*t.readLines()*.count(c).max()}

파일이 대소 문자를 혼합한다고 가정하면 (116 자) :

t=new File('f').text.toUpperCase();t.findAll('[A-Z]').unique().sort().each{c->print c*t.readLines()*.count(c).max()}

원래:

  • t=new File('f').text 파일의 텍스트를 얻으려면
  • t.findAll('[A-Z]').unique().sort().each{c-> 고유 한 문자를 얻으려면 해당 문자를 정렬하고 반복하십시오.
  • print c*t.readLines()*.count(c).max() 한 줄에 최대 발생 횟수를 가져 와서 여러 번 문자를 인쇄하십시오.

2

배쉬 (주로 awk)- 172 163 157

awk -v FS="" '{delete l;for(i=1;i<=NF;i++)l[toupper($i)]++;for(i in l)o[i]=(o[i]>l[i]?o[i]:l[i])}END{for(i in o)for(j=0;j<o[i];j++)print i}'|sort|tr -d ' \n'

텍스트를 awk (또는 파일로 지정)로 파이프해야합니다.

입력 예

Hello
I love cat
I love dog
I love mommy
Mommy loves daddy

출력 예

ACDDDEGHILLMMMOOSTVYY

PHP (아마 더 좋을 수도 있음)- 174 210

$o=array();foreach(explode("\n",$s) as $a){$l=array();$i=0;while($i<strlen($a)){$k=ucfirst($a[$i++]);if($k==' ')continue;$o[$k]=max($o[$k],++$l[$k]);}}ksort($o);foreach($o as $k=>$v)for($i=0;$i<$v;$i++)echo $k;

문자열이 변수 $ s에 포함되어 있다고 가정

입력 예

Hello
I love cat
I love dog
I love mommy
Mommy loves daddy

출력 예

ACDDDEGHILLMMMOOSTVYY

2

나는 이것이 가장 효율적인 대답이 아니라는 것을 알고 있지만 어쨌든 문제를 해결하려고했습니다. 내 ObjC 변형은 다음과 같습니다.

- (NSArray *) lettersNeededForString:(NSString *)sourceString {
    sourceString = [sourceString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    sourceString = [sourceString stringByReplacingOccurrencesOfString:@" " withString:@""];
    const char * sourceChars = sourceString.UTF8String;
    NSMutableArray * arr = [NSMutableArray new];
    for (int i = 0; i < sourceString.length; i++) {
        [arr addObject:[NSString stringWithFormat:@"%c", sourceChars[i]]];
    }
    return [arr sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}    

그런 다음 문자열에 관계없이 호출 할 수 있습니다.

NSArray * letters = [self lettersNeededForString:@"Hello\nI love cat\nI love dog\nI love mommy\nMommy loves daddy"];
NSLog(@"%@",letters);

더 많은 양의 텍스트가있는 응용 프로그램에 대해 생각하고 있었고 배열을 세지 않아도됩니다. 이를 위해이 방법을 추가했습니다.

- (NSDictionary *) numberOfLettersNeededFromString:(NSString *)sourceString {

    sourceString = [sourceString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    sourceString = [sourceString stringByReplacingOccurrencesOfString:@" " withString:@""];
    const char * sourceChars = sourceString.UTF8String;
    NSMutableArray * arr = [NSMutableArray new];
    for (int i = 0; i < sourceString.length; i++) {
        [arr addObject:[NSString stringWithFormat:@"%c", sourceChars[i]]];
    }

    static NSString * alphabet = @"abcdefghijklmnopqrstuvwxyz";
    NSMutableDictionary * masterDictionary = [NSMutableDictionary new];
    for (int i = 0; i < alphabet.length; i++) {
        NSString * alphabetLetter = [alphabet substringWithRange:NSMakeRange(i, 1)];
        NSIndexSet * indexes = [arr indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            if ([[(NSString *)obj lowercaseString] isEqualToString:alphabetLetter]) {
                return YES;
            }
            else {
                return NO;
            }
        }];

        masterDictionary[alphabetLetter] = @(indexes.count);
    }

    return masterDictionary;
}

다음과 같이 실행하십시오.

NSDictionary * lettersNeeded = [self numberOfLettersNeededFromString:@"Hello\nI love cat\nI love dog\nI love mommy\nMommy loves daddy"];
NSLog(@"%@", lettersNeeded);

당신에게 줄 것이다 :

{a = 2; b = 0; c = 1; d = 4; e = 5; f = 0; g = 1; h = 1; i = 3; j = 0; k = 0; l = 6; m = 6; n = 0; o = 8; p = 0; q = 0; r = 0; s = 1; t = 1; u = 0; v = 4; w = 0; x = 0; y = 3; z = 0; }

매우 많은 양의 텍스트를 가지고 있고 각 문자의 수를 알아야 할 필요가 있다고 생각합니다.



2

파이썬 2, 154 바이트

import collections
c = collections.Counter()
for line in open("input.txt"):
    c |= collections.Counter(line.upper())
print "".join(sorted(c.elements()))

PCG에 오신 것을 환영합니다! 이 사이트는 코드 형식을 지정하는 데 사용할 수있는 Markdown 구문을 지원하므로 코드의 각 줄을 4 칸씩 들여 쓰기하면됩니다.
algorithmshark

컬렉션을 가져 오는 데 필요한 문자를 추가해야합니다.
isaacg

1
각 문장을 개별적으로 쓰려면 최소한의 글자가 필요하기 때문에 질문에 대답하지 않습니다. 코드에서 모든 문장을 동시에 작성하는 데 필요한 글자 수를 출력합니다.
njzk2

문의 s끝에 가 누락 되었으며 블록에 들여 쓰기가 없습니다. 그리고 이것은 코드 골프이기 때문에 가능하면 불필요한 공백을 제거하는 것이 큰 도움이됩니다. importwith
Fraxtil

이것은 코드 골프이기 때문에 with 문을 제거하고 (열기 위해 호출을 반복하십시오) 요소를 정렬해야한다고 생각하지 않습니다.
RemcoGerlich

2

C, 298 바이트

char c;
int j,n;
char C[26];
char D[26];
int main()
{
char a='a';
while((c=getchar())>=0)
{
c=tolower(c);
if(c>=a&&c<='z'){j=c-a;D[j]++;}
if(c=='\n'){
for(j=0;j<26;j++){
if(D[j]>C[j])
{C[j]=D[j];}
D[j]=0;
}
}
}
for(j=0;j<26;j++)
{
n=C[j];
while(n--)
{
putchar(a+j);
}
}
}

배열 D는 각 줄에 대해 문자의 집계를 보유하고 최대 개수는 C로 복사됩니다.

참고 : 어제 대답을했지만 지금 나열되지 않았습니다. 실수로 편집 대신 삭제를 눌렀습니까?


271 바이트에 불과합니다. 또한 외래 줄 바꿈이 많이 있습니다. 또한 intfrom int main()및을 생략 할 수 있습니다 int j,n;.
nyuszika7 시간

또한 이전 답변 이 여전히 있습니다.
nyuszika7 시간

2

PHP, 143 바이트

입력이 변수에 전달되었다고 가정하십시오 $s.

$i=explode("\n",$s);foreach(range('a','z')as$c){$x=array_map(function($l)use($c){return substr_count($l,$c);},$i);echo str_repeat($c,max($x));}

설명

가능한 각 문자에 대해 각 줄을 사용 된 문자 수로 바꾸는 사용자 정의 함수를 통해 문자열 목록을 포함하는 배열을 매핑합니다. 문자 'd'의 경우 "Mommy loves daddy"행이 3으로 매핑됩니다.

나중에 배열과 출력 문자 내에서 최대 값을 여러 번 발견합니다. 다음은 여러 줄 버전입니다.

$i=explode("\n",$s);
foreach(range('A','Z')as $c){
    $x=array_map(function($l)use($c){
        return substr_count($l,$c);
    },$i);
    echo str_repeat($c,max($x));
}

1

Python (209, 샘플 포함, 136 제외) :

from collections import*;c=Counter()
for i in ["Hello","I love cat", "I love Dog", "I love mommy", "Mommy loves daddy"]:
 for j in i.lower(): c[j]=max(c[j],list(i).count(j))
print "".join(sorted(c.elements()))

오늘 오후에 PYG 샘플을 게시하겠습니다.


파이썬 문자열에 count 메소드가 있다는 것을 몰랐습니다 ...이 새로운 발견 된 지식을 사용하기 위해 질문에 대한 답변을 변경하는 것이 합법적이라고 생각하지 않습니까? : p
Tal

@tal 그들은하지 않습니다. 자세히 보면 목록의 방법입니다.
ɐɔıʇǝɥʇuʎs

1
아, 알지만 ... 예상치 못한 트위스트에서 문자열이이 방법을 가지고있는 것 같습니다 (3.x)
Tal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.