Bảng chữ cái của con gái tôi


65

Hôm nọ chúng tôi đang viết câu với con gái tôi bằng một lá thư nam châm tủ lạnh. Mặc dù chúng tôi có thể tạo một số ( I love cat), chúng tôi không có đủ chữ cái để tạo các chữ cái khác ( I love you too) do không đủ số lượng chữ cái o(4)

Sau đó tôi phát hiện ra rằng trong khi một bộ bao gồm 3 echữ cái thì nó chỉ có 2 ochữ cái. Có lẽ lấy cảm hứng từ http://en.wikipedia.org/wiki/Letter_frequency điều này vẫn sẽ không phản ánh tình hình thực tế "trên tủ lạnh".

Vấn đề

Đưa ra tệp văn bản trong đó mỗi dòng chứa "câu mẫu" người ta muốn viết trên tủ lạnh, đề xuất một bảng chữ cái với số lượng chữ cái tối thiểu nhưng vẫn đủ để viết từng câu riêng lẻ.

Lưu ý: bỏ qua các trường hợp, tất cả các chữ cái nam châm là thủ đô nào.

Đầu vào

Các tập tin có chứa các câu phân tách dòng mới:

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

Đầu ra

Cung cấp lại danh sách các chữ cái được sắp xếp lại, trong đó mỗi chữ cái chỉ xuất hiện bao nhiêu lần là đủ để viết bất kỳ câu nào:

acdddeghillmmmoostvyy

(cảm ơn, isaacg!)

Người chiến thắng

Thời gian thực hiện ngắn nhất (mã)

CẬP NHẬT: Kiểm tra

Tôi đã tạo một bài kiểm tra bổ sung và thử với nhiều câu trả lời khác nhau ở đây:

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


2
Cần có một chữ cái vtrong đầu ra;)
Antonio Ragagnin

40
Chúng ta có được phép / bắt buộc phải thay thế lộn ngược Mcho một Whoặc một bên Ncho một Z? ;-)
Ilmari Karonen

4
Về cơ bản bạn có thể xây dựng bất kỳ chữ cái bằng Is.
swish

7
Nghiêm trọng hơn, khi bạn nói "bỏ qua các trường hợp", bạn có nghĩa là chúng ta có thể cho rằng đầu vào đã là tất cả trong cùng một trường hợp, hoặc chúng ta phải chuyển đổi tất cả thành cùng một trường hợp? Ngoài ra, đầu ra có bao gồm một số không gian hàng đầu không?
Ilmari Karonen

3
@Doorknob:_\¯
Ilmari Karonen

Câu trả lời:


18

GolfScript, 28/34 ký tự

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

Chương trình 28 ký tự ở trên giả định rằng tất cả các chữ cái đầu vào đều nằm trong cùng một trường hợp. Nếu điều này không nhất thiết là như vậy, chúng ta có thể buộc chúng vào chữ hoa bằng cách thêm vào {95&}%mã, với tổng số 34 ký tự:

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

Ghi chú:

  • Để hoạt động chính xác, đầu vào phải bao gồm ít nhất một dòng mới. Điều này sẽ đúng với các tệp văn bản thông thường có dòng mới ở cuối mỗi dòng, nhưng có thể không đúng nếu đầu vào chỉ bao gồm một dòng không có dòng mới. Điều này có thể được sửa chữa với chi phí của hai ký tự bổ sung, bằng cách thêm vào n+mã.

  • Chữ hoa được sử dụng trong phiên bản 34 ký tự thực sự thô sơ - nó ánh xạ các chữ cái ASCII viết thường thành chữ hoa tương đương (và khoảng trắng thành NULs), nhưng tạo ra một mớ hỗn độn về số và dấu chấm câu. Tôi giả định rằng đầu vào sẽ không bao gồm bất kỳ ký tự nào như vậy.

  • Phiên bản 28 ký tự xử lý tất cả các ký tự đầu vào (ngoại trừ dòng mới và NULs) như nhau. Cụ thể, nếu đầu vào chứa bất kỳ khoảng trắng nào, một số cũng sẽ xuất hiện trong đầu ra; một cách thuận tiện, họ sẽ sắp xếp trước bất kỳ ký tự ASCII có thể in nào khác. Tuy nhiên, phiên bản 34 ký tự không bỏ qua khoảng trắng (vì hóa ra tôi có thể làm điều đó mà không phải trả thêm bất kỳ ký tự nào).

Giải trình:

  • {95&}%Tiền tố tùy chọn viết hoa đầu vào bằng cách bỏ ra bit thứ sáu của mã ASCII của mỗi byte đầu vào ( ). Điều này ánh xạ các chữ cái ASCII viết thường thành chữ hoa, khoảng trắng thành byte rỗng và giữ nguyên dòng mới.95 = 64 + 31 = 10111112

  • n/chia đầu vào tại dòng mới và :agán mảng kết quả vào biến a. Sau đó, {|}*tính toán tập hợp các chuỗi trong mảng, (giả sử rằng mảng có ít nhất hai phần tử) tạo ra một chuỗi chứa tất cả các ký tự duy nhất (không phải dòng mới) trong đầu vào.

  • { }%Vòng lặp sau đây lặp lại qua từng ký tự duy nhất này. Bên trong thân vòng lặp, vòng lặp bên trong lặp a{.[2$]--}%lại qua các chuỗi trong mảng a, loại bỏ khỏi mỗi chuỗi tất cả các ký tự không bằng một vòng lặp bên ngoài đang lặp lại.

    Vòng lặp bên trong để lại mã ASCII của ký tự hiện tại trên ngăn xếp, bên dưới mảng được lọc. Chúng tôi sử dụng điều này bằng cách lặp lại mảng đã lọc nhiều lần như được chỉ định bởi mã ASCII ( *) trước khi sắp xếp nó ( $) và lấy phần tử cuối cùng ( -1=). Trong thực tế, điều này mang lại chuỗi dài nhất trong mảng được lọc (vì tất cả chúng đều bao gồm các lần lặp lại của cùng một ký tự, sắp xếp từ vựng chỉ sắp xếp chúng theo độ dài), trừ khi ký tự có mã ASCII bằng 0, trong trường hợp nó không mang lại kết quả gì.

  • Cuối cùng, $ở cuối chỉ sắp xếp đầu ra theo thứ tự abc.


3
Kinh ngạc. TODO: Tìm hiểu GolfScript!
DLosc

1
Bạn thậm chí có thể giảm nó xuống 26 : n/:a{|}*{{{=}+,}+a%$-1=}%$.
Howard

13

J - 37 char

Đọc từ stdin, đầu ra cho giao diện điều khiển.

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

1!:1]3là cuộc gọi đến stdin. tolower;._2thực hiện nhiệm vụ kép bằng cách tách các dòng và làm cho chúng viết thường cùng một lúc. Sau đó, chúng tôi đếm số lần một ký tự xuất hiện trong mỗi hàng +/"2=/&a.và lấy mức tối đa theo điểm trên tất cả các dòng với >./.

Cuối cùng, chúng tôi kéo nhiều nhân vật ra khỏi bảng chữ cái #&a.. Điều này bao gồm tất cả các khoảng trống được tìm thấy ở phía trước do giá trị ASCII thấp của chúng vì vậy chúng tôi chỉ cần xóa các khoảng trống hàng đầu với dlb.


12

JavaScript (ECMAScript 6) - 148 139 135 Ký tự

Phiên bản 2:

Cập nhật để sử dụng mảng hiểu:

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

Phiên bản 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])

Giả sử rằng:

  • Chuỗi đầu vào là trong biến s;
  • Chúng ta có thể bỏ qua trường hợp đầu vào (như được chỉ định bởi câu hỏi - tức là tất cả đều ở dạng chữ hoa hoặc chữ thường);
  • Đầu ra là một mảng các ký tự (gần bằng với JavaScript có thể đạt được yêu cầu của OP về danh sách các ký tự); và
  • Đầu ra sẽ được hiển thị trên bàn điều khiển.

Với nhận xét:

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.

Nếu bạn muốn:

  • Trả lại nó dưới dạng một chuỗi sau đó thêm .join('')vào cuối;
  • Lấy đầu vào từ người dùng sau đó thay thế sbiến bằng prompt(); hoặc là
  • Viết nó như là một hàm fsau đó thêm f=s=>vào đầu.

Đang chạy:

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

Cung cấp đầu ra:

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

1
Đẹp! Bạn có thể lưu 3 byte bằng cách giảm /\s*/đến / */và loại bỏ các dấu ngoặc xung quanhj=0
nderscore

1
bạn không thể sử dụng ...thay vì apply?
Ven

Cảm ơn cả hai bạn - giúp lưu 9 ký tự - Toán tử lây lan ( ...) là một toán tử mà tôi chưa từng gặp trước đây.
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

Perl - 46 byte

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

Đếm số shebang là 1. Đây là bản dịch lỏng lẻo của giải pháp Ruby bên dưới.


Ruby 1,8 - 72 byte

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

Đầu vào được lấy từ stdin.

Sử dụng mẫu:

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

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

Đầu ra cần phải được sắp xếp.
Matt

@Matt giờ đã sửa.
Primo

Đẹp. Nếu Perl của bạn gần đây mơ hồ, bạn sẽ muốn có một khoảng trống giữa /ifor.
tobyink

8

Python - 206 204 199 177 145 129 117 94 88 ký tự

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

Tôi không chắc chắn làm thế nào tôi có được tên tệp, vì vậy tại thời điểm mã giả định rằng nó được chứa trong một biến có tên f. Xin vui lòng cho tôi biết nếu tôi cần thay đổi điều đó.


8
trong tinh thần unix - bạn có thể đọc từ stdin.
romaninsh

5
luôn luôn đặt tên tệp dài một ký tự ...

3
@Tal Tôi cũng mới, nhưng nếu nó lưu ký tự, tại sao không?

1
Bằng cách giả sử ftên tệp đầu vào và sử dụng chữ hoa (dù sao tất cả các chữ cái đều là chữ hoa), bạn có thể lấy nó xuống 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 tốt, nếu chúng ta chạy cái này trong bảng điều khiển, theo lý thuyết, nó sẽ tự in kết quả ...
Tal

6

Ruby 1.9+, 51 (hoặc 58 hoặc 60)

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

Giả sử mọi thứ đều viết thường. Không nhạy cảm trường hợp có giá 7 ký tự thông qua .upcase, trong khi trường hợp không nhạy cảm và đầu ra chữ thường có giá 9 ký tự thông qua .downcase.


4

R (156, bao gồm tập tin đã đọc)

Với bảng tôi xây dựng bảng tần số chữ cái cho mỗi câu. Sau đó, tôi kết thúc với việc lấy cho mỗi chữ cái giá trị tối đa.

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

Ung dung:

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

Giải pháp:

acdddeghillmmmoooooostuvyy

@lambruscoAcido bạn có thể véc tơ ba dòng đầu tiên (của mã không được mã hóa) sẽ cung cấp cho bạn 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=""), nhưng nó chỉ ngắn hơn 3 ký tự
jkd

Một cách tiếp cận khác chỉ có 112 ký tự sẽ được cat(unlist(sapply(letters,function(i)rep(i,max(sapply(gregexpr(i,readLines(f)),function(x)sum(x>0)))))),sep="")giả sử flà tên tệp
jkd

4

Haskell, 109 108

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

Chương trình đọc từ stdin và ghi vào sdtout.

Nó khá đơn giản: nó chia chuỗi thành một danh sách các dòng và xây dựng lại nó bằng cách lặp lại trong danh sách và thêm các chữ cái mới có trong mỗi dòng.


Oh wow tại sao tôi chưa bao giờ nghe nói về (\\) trước đây?
Flonk


4

Perl 6: 56 53 ký tự; 58 55 byte

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

Đối với mỗi dòng, điều này kết hợp thông qua nó cho các ký tự không phải không gian của chuỗi ký tự thấp hơn ( comb /\S/,.lc) và tạo một Baghoặc một tập hợp của mỗi ký tự và số lần xảy ra. [∪]lấy sự kết hợp của Bags trên tất cả các dòng, lấy số lần tối đa của ký tự xảy ra. .pick(*)là hack-y ở đây, nhưng đó là cách ngắn nhất để có được tất cả các ký tự từ Bagbản sao theo số lần nó xảy ra.

EDIT: Để xem nó có ngắn hơn không, tôi đã thử dịch câu trả lời Ruby của histocrat . Đó là 63 ký tự, nhưng tôi vẫn rất thích cách tiếp cận:

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

3

Haskell, 183 162 159

Giả sử các tập tin được trong 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

Nếu file.txt chứa, ví dụ

abcde
abcdef
aaf

Kịch bản sẽ xuất

aabcdef

Về cơ bản, tôi đang nối toàn bộ bảng chữ cái vào mỗi dòng, để khi nhóm và sắp xếp, tôi chắc chắn tôi sẽ kết thúc với một danh sách chứa 27 thành phần. Tiếp theo, tôi transpose các "bảng tần số", do đó mỗi dòng trong mảng này bao gồm các tần số của một chữ cái trong mỗi dòng, ví dụ ["a","","aaa","aa","aaaa"]. Sau đó, tôi chọn tối đa của mỗi mảng (hoạt động giống như tôi muốn vì cách thức hoạt Ordđộng của Chuỗi) và thả chữ cái mà tôi đã thêm vào lúc bắt đầu, loại bỏ khoảng trắng và xuất kết quả.


1
Thay vì drop 1, chỉ cần sử dụngtail
Bergi

@Bergi Haha derp, cảm ơn! Tôi đã thay đổi nó trong bài viết.
Flonk

3

C, 99 ký tự

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

Nó gặp sự cố nếu ít hơn một dòng mới được cung cấp. Tôi nghĩ rằng nó có thể được sửa chữa khá dễ dàng.


Tôi đã thử, nhưng nó không mang lại kết quả chính xác. gist.github.com/romaninsh/11159751
romaninsh

3

kdb (q / k): 59 ký tự:

d:.Q.a! 26#0
.z.pi:{d|:.Q.a##:'=_y}.z.exit:{-1@,/.:[d]#'!:d}
  • tạo từ điển hạt giống được sắp xếp trước từ bảng chữ cái .Qa
  • xử lý từng dòng đầu vào, chuyển đổi thành chữ thường, nhóm thành từ điển, đếm từng yếu tố, lấy các ký tự chữ cái từ kết quả (không gian cắt tỉa, dòng mới, v.v. ở giai đoạn này) và sử dụng gán tối đa cho toàn cầu d để duy trì tổng số hoạt động.
  • xác định trình xử lý thoát, được chuyển đến .z.pi để lưu một dấu phân cách nhưng nếu không thì không được sử dụng ở đó. Lấy từ mỗi khóa-giá trị để tạo danh sách các ký tự, làm phẳng và cuối cùng in ra thiết bị xuất chuẩn.

-1 thêm một dòng mới, sử dụng 1 sẽ lưu một ký tự nhưng không tạo ra đầu ra được chỉ định. Ước gì tôi có thể thoát khỏi cái nồi hơi .z.pi / .z.exit, cái mà sẽ loại bỏ 14 ký tự.

Chỉnh sửa: tránh sử dụng inter / asc bằng cách sử dụng từ điển seed.


3

Perl, 46

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

Đây là một giải pháp Perl khác, đọc từ STDIN, yêu cầu -nchuyển đổi (+1 để đếm), liên kết với điểm số của primo nhưng chạy mà không có khiếu nại :-). Nó khai thác thực tế orlà kết quả của bitwise có độ dài của đối số chuỗi dài hơn.


1
đã thử với thử nghiệm của tôi và nó đã làm việc tuyệt vời.
romaninsh

3

Tôi đang thêm giải pháp của riêng mình:

Bash - 72

Giả sử rằng đầu vào nằm trong tệp "i"

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

Giải trình

Đối với mỗi chữ cái có thể, chỉ lọc nó từ tệp đầu vào dẫn đến kết quả như thế này:

AAA
A
A

AAAA

A
AAAAAAAAAAAAAAAA

Sau đó, kết quả được sắp xếp và dòng dài nhất được chọn. echo -nlà có để loại bỏ các dòng mới.


3

Bash, 171 159 158, 138 với đầu ra rác

Yêu cầu nhập chữ thường. Giả sử rằng tệp được gọi _(gạch dưới). Tối đa 26 dòng trong tệp đầu vào do tên tệp gây phiền nhiễu splittạo ra (xaa, xab ... xaz, ???).

Trong bash, {a..z}đầu ra 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

Sản lượng mẫu

acdddeghillmmmoostvyy

Giải trình

touch {a..z}

Tạo các tệp mà chúng ta sẽ đọc từ sau này để bash không phàn nàn rằng chúng không tồn tại. Nếu bạn loại bỏ dòng này, bạn sẽ tiết kiệm được 13 ký tự nhưng nhận được rất nhiều đầu ra rác.

split _ -1

Chia tệp đầu vào thành các phần, mỗi phần lưu trữ 1 dòng. Các tập tin mà lệnh này tạo ra được đặt tên xaa, xab, xac, v.v., tôi không biết tại sao.

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

Đối với mỗi chữ cái $lđọc qua tất cả các dòng được lưu trữ trong các tập tin xa$s.

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

Hủy bỏ công -stắc để lưu 1 char và nhận được rất nhiều đầu ra rác. Nó ngăn không cho grepphàn nàn về các tệp không tồn tại (sẽ xảy ra trừ khi bạn có 26 dòng đầu vào). Điều này xử lý tệp xa$s, loại bỏ bất cứ điều gì trừ sự xuất hiện $lvà gửi đầu ra đến tệp b$l. Vì vậy, "tôi yêu mẹ" trở thành "mmm" với các dòng mới sau mỗi chữ cái $llà m.

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

Nếu số lượng dòng trong tệp chúng tôi vừa tạo lớn hơn hoặc bằng (nghĩa là nhiều chữ cái hơn vì có một chữ cái trên mỗi dòng) thì số dòng trong kết quả cao nhất của chúng tôi cho đến nay (được lưu trữ trong $l...

then mv b$l $l

... lưu trữ hồ sơ mới của chúng tôi trong tập tin $l. Ở cuối vòng lặp này, khi chúng ta đã đi qua tất cả các dòng, tệp $lsẽ lưu trữ x dòng mỗi dòng chứa chữ cái $l, trong đó x là số lần xuất hiện cao nhất của chữ cái đó trong một dòng.

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

Xuất nội dung của tệp của chúng tôi cho chữ cái cụ thể đó, loại bỏ các dòng mới. Nếu bạn không muốn xóa các dòng mới, hãy thay đổi dòng trthành echo $l, lưu 6 ký tự.

done

Đã thử với bash GNU, phiên bản 3.2.51 (apple), nhưng tệp '-l1aa' trong thư mục hiện tại chứa dữ liệu đầu vào ..
romaninsh

@romaninsh Có thể bạn có một phiên bản khác split(từ coreutils). Tôi hiện đang chạy GNU bash 4.3.8 và GNU coreutils 8.21 trên Ubuntu 14.04 và nó hoạt động tốt (nó cũng hoạt động trên Ubuntu 13.10 trước khi tôi nâng cấp). Tuy nhiên, tôi đã phải đặt chương trình và tệp đầu vào vào một thư mục riêng để nó hoạt động chính xác - tôi nghi ngờ đây chỉdo hàng triệu tệp rác trong thư mục nhà của tôi .

@romaninsh trên thực tế, nếu bạn nhìn vào lệnh chính xác trong tập lệnh: split _ -l1và bạn nhận thấy rằng đầu vào của bạn đang được lưu vào -l1aa, tôi nghĩ rằng phiên bản của bạn split không nhận ra -l1là một tùy chọn và thay vào đó lấy nó làm tiền tố cho đầu ra . Hãy thử đặt một khoảng trắng giữa -l1, hoặc đặt --lines=1, hoặc chỉ -1(đây có vẻ là một cú pháp lỗi thời và nhiều golf hơn mà bây giờ tôi sẽ cập nhật bài đăng với).

3

C #, 172 byte

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

Thông minh ... thông minh ... Tôi đã nghĩ về việc chơi với linq, nhưng nghi ngờ nó sẽ ngắn như những lời thuyết minh mâu thuẫn này :)
Noctis

2

Con trăn 2 - 129

Ý tưởng từ @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)

Một vài cách khác để làm điều tương tự trong cùng một số ký tự:

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

Điều này giả sử tập tin được lưu dưới dạng f trong một thư mục có thể truy cập. Chương trình này có thể chạy trực tiếp, không cần thêm đầu vào.


Tại sao bỏ phiếu xuống? Xin lỗi nếu tôi làm sai.
isaacg

2

Toán học v10 - 110

Vẫn chưa ra, nhưng đọc tài liệu mới rất cẩn thận, tôi nghĩ việc này sẽ hiệu quả:

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

2

Scala, 125 ký tự

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

Đầu tiên tôi đọc đầu vào, chuyển đổi nó thành chữ thường và thêm một dòng trống.

Sau đó cho từng chữ cái từ ađể ztôi nhắc lại rằng thư số lần tối đa nó xuất hiện trong bất kỳ của các dòng (đó là lý do tại sao tôi cần những dòng trống: maxkhông thể được gọi vào một đầu vào enpty). Sau đó, tôi chỉ cần tham gia kết quả và in ra đầu ra.

Để đọc từ tệp, thay thế stdinbằng fromFile("FILENAME"), tăng kích thước mã lên 132 ký tự + độ dài tên tệp.


2

Javascript, 261 ký tự

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

Loại bỏ eval(...)và thực thi để có được mã thực sự; đây là ( phần nào ) được nén.

sđa chức năng như mảng các dòng và như chuỗi xuất ra, hchứa biểu đồ của các chữ cái trên mỗi dòng và Hchứa biểu đồ với các giá trị tối đa cho đến nay. Nó không phân biệt chữ hoa chữ thường và chỉ bỏ qua mọi thứ trừ az và AZ (tôi nghĩ ... mảng JS đôi khi kỳ lạ).

Bây giờ sửa :)


Đây chỉ là tổng số các nhân vật, không hoàn toàn những gì câu hỏi. Các chữ cái nên được tổng cộng là mức tối thiểu được đặt để tạo thành bất kỳ câu đơn nào trong đầu vào, không phải tất cả chúng. Tôi khá thích cách tiếp cận của bạn để ngăn chặn sự cần thiết phải sắp xếp đầu ra mặc dù.
Matt

@Matt oh đúng rồi ... Tôi sẽ sửa nó sau. Không thực sự có thời gian ngay bây giờ.
tomsmeding

1
Tự hỏi chuyện gì đang xảy ra với @tôi cho đến cuối cùng. Tôi thích nó :)
Matt

2

JavaScript ( ES5 ) 141 byte

Giả sử biến slà chuỗi đầu vào không có yêu cầu kiểm tra trường hợp và đầu ra mảng:

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

Tôi đã thử nghiệm giải pháp của bạn và đang tìm kiếm "o" bên trong cho một đầu ra, nhưng dường như nó không được sắp xếp đúng. (xem gist.github.com/romaninsh/11159751 )
romaninsh

@romaninsh đầu ra tôi thấy trong ý chính của bạn có vẻ được sắp xếp hợp lý
nderscore

Vâng, đó là một đầu ra tham khảo / chính xác. Khi tôi thử mã của bạn, tôi đã nhận được mã này: gist.github.com/romaninsh/11161018
romaninsh

Xin lỗi nếu tôi thực hiện ví dụ của bạn không chính xác.
romaninsh

@romaninsh ah, tôi đã có ý định chạy nó trong bảng điều khiển của trình duyệt. Đây là một phiên bản được định dạng lại hoạt động trên nút: gist.github.com/nderscore/96aa888c77d275c26c15
nderscore

2

PowerShell - 141

Đọc văn bản từ một tệp có tên '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 ký tự

Giả sử tập tin là tất cả trong một trường hợp (102 ký tự):

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

Giả sử tập tin nằm trong trường hợp hỗn hợp (116 ký tự):

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

Về cơ bản:

  • t=new File('f').text Để có được văn bản của tập tin.
  • t.findAll('[A-Z]').unique().sort().each{c-> Để có được các ký tự duy nhất, sắp xếp chúng và lặp lại.
  • print c*t.readLines()*.count(c).max() Lấy số lần xuất hiện tối đa trong một dòng và in ký tự đó nhiều lần.

2

Bash (chủ yếu là 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'

Văn bản cần phải được dẫn vào awk (hoặc được chỉ định dưới dạng tệp).

Ví dụ đầu vào

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

Ví dụ đầu ra

ACDDDEGHILLMMMOOSTVYY

PHP (có lẽ có thể tốt hơn) - 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;

Giả sử rằng chuỗi được chứa trong biến $ s

Ví dụ đầu vào

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

Ví dụ đầu ra

ACDDDEGHILLMMMOOSTVYY

2

Tôi nhận ra đây có lẽ không phải là câu trả lời hiệu quả nhất, nhưng tôi muốn thử và giải quyết vấn đề bằng mọi cách. Đây là biến thể ObjC của tôi:

- (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:)];
}    

Sau đó, bạn có thể gọi nó cho bất kỳ chuỗi nào:

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

Tôi đã suy nghĩ về các ứng dụng có số lượng văn bản lớn hơn và tôi không phải đếm mảng của mình. Đối với điều này, tôi đã thêm vào phương thức để có được điều này:

- (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;
}

Chạy như sau:

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

Sẽ cung cấp cho bạn:

{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; }

Mà tôi nghĩ là tốt hơn nếu tôi có một lượng văn bản rất lớn và tôi chỉ cần biết tôi cần bao nhiêu chữ cái.



2

Python 2, 154 byte

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

Chào mừng bạn đến với PCG! Trang web này hỗ trợ cú pháp Markdown, mà bạn có thể sử dụng để định dạng mã của mình, để nó có vẻ tốt: chỉ cần thụt vào từng dòng mã 4 khoảng trắng.
thuật toán

Bạn sẽ cần thêm các ký tự cần thiết để nhập bộ sưu tập.
isaacg

1
không trả lời câu hỏi, vì bạn cần số lượng chữ cái tối thiểu để viết từng câu riêng lẻ. Trong mã của bạn, bạn xuất số lượng chữ cái cần thiết để viết tất cả các câu cùng một lúc.
njzk2

Bạn đang thiếu một sphần cuối của importcâu lệnh và withkhối không thụt vào. Và vì đây là mã golf, nó sẽ giúp ích cho bạn rất nhiều để loại bỏ khoảng trắng không cần thiết nếu có thể.
Fraxtil

vì đây là mã golf, hãy xóa câu lệnh with (chỉ lặp qua một cuộc gọi để mở) và tôi không nghĩ các yếu tố cần sắp xếp.
RemcoGerlich

2

C, 298 byte

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

Mảng D giữ kiểm đếm các chữ cái cho mỗi dòng, sau đó số lượng tối đa được sao chép vào C.

Lưu ý: Tôi đã đặt câu trả lời của mình ngày hôm qua nhưng hiện tại không được liệt kê, có thể tôi đã nhấn xóa thay vì chỉnh sửa do nhầm lẫn?


Nó chỉ có 271 byte. Bạn cũng có rất nhiều dòng mới. Ngoài ra, bạn có thể bỏ qua inttừ int main()int j,n;.
nyuszika7h

Ngoài ra, câu trả lời trước của bạn vẫn còn đó.
nyuszika7h

2

PHP, 143 byte

Giả sử rằng đầu vào được truyền trong biến $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));}

Giải trình

Đối với mỗi chữ cái có thể, tôi ánh xạ mảng chứa danh sách các chuỗi thông qua hàm do người dùng xác định, thay thế mỗi dòng bằng số ký tự được sử dụng. Đối với chữ 'd', dòng "Mẹ yêu bố" sẽ được ánh xạ thành 3.

Sau đó, tôi tìm thấy giá trị tối đa bên trong mảng và chữ cái đầu ra nhiều lần. Đây là phiên bản nhiều dòng:

$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, với mẫu bao gồm, 136 không có.):

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

Tôi sẽ đăng một mẫu PYG chiều nay.


Tôi không biết chuỗi Python có phương pháp đếm ... Tôi không cho rằng nó được coi là hợp pháp để thay đổi câu trả lời của tôi cho câu hỏi để sử dụng kiến ​​thức mới tìm thấy này? : p
Tal

@tal Họ không. Đó là một phương pháp của một danh sách, nếu bạn nhìn kỹ hơn
vào

1
Ồ, tôi hiểu rồi ... nhưng trong một vòng xoắn bất ngờ, hóa ra các chuỗi dường như cũng có phương thức này (dù sao cũng là 3.x)
Tal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.