g | x | w | all
Bytes Lang Time Link
016Dyalog APL250926T182152ZAaron
035APLNARS251001T072724ZRosario
nanUiua250930T062931ZElNico56
228C 224 bytes or 227 bytes or250930T053739ZFoxie Fl
119AWK250929T145802Zxrs
007Thunno 2 J230623T164817ZThe Thon
094jq220804T133513Zcustomco
005Vyxal s220707T155209ZnaffetS
nan220707T131257ZCzylabso
095JavaScript Node.js210916T200015Zl4m2
00805AB1E190107T113454ZKevin Cr
008Japt Px210916T093913ZShaggy
012Vyxal as210916T064530Zemanresu
010Pyth190107T145610ZSok
104JavaScript190107T124608ZShaggy
087Powershell181213T175601Zmazzy
116PHP181214T091627ZTitus
054Jelly181213T184806Zais523
011Japt v1.4.5180601T004906ZBubbler
008Stax180511T001430Zrecursiv
143PHP140422T001326Zromanins
172C#140414T013819Zmnsr
298C140414T090023Zbacchusb
181C# / LINQPad140414T132250Zjimbobmc
298C140414T192228Zbacchusb
154Python 2140410T215726ZFrankfur
041Haskell180510T112739ZLaikoni
189Kotlin180201T143629Zjrtapsel
034K140605T095734Ztmartin
146C# 146 Bytes140605T091202Ztsavinho
135JavaScript ECMAScript 6 135 Characters140410T231608ZMT0
138Bash140410T134542Zuser1640
nan140421T235210Zromanins
265C#140416T035153ZJacob
nan140415T060931ZParasu
nanI realize this probably isn't the most efficient answer140413T231346ZLogan
157Bash mostly awk 172 163140413T203220ZTyzoid
046Perl140413T175657Zuser2846
159Julia140413T031435ZwaTeim
088Python140410T062400ZTal
055Perl 6140410T231637ZMouq
059kdb q/k140412T082923ZDarren
206Lua 206 Chars140412T164216ZHenrik I
099C140411T163044Zzakk
nan140410T162830Zdbramwel
141PowerShell140411T151914ZRynant
159Haskell140410T070919ZFlonk
141JavaScript ES5140410T155845Znderscor
nanRuby 1.9+140410T144026Zhistocra
244JavaScript140410T070950ZMatt
037J140410T073731Zalgorith
264C++140410T174716Zuser2028
199JavaScript140410T190520ZAndrew
261Javascript140410T082408Ztomsmedi
125Scala140410T142419ZKarol S
2834GolfScript140410T123119ZIlmari K
nanHaskell140410T132647Zlortabac
110Mathematica v10140410T113900Zswish
046Perl140410T071531Zprimo
129Python 2140410T071543Zizzyg
nanR 156140410T072934Zlambrusc
136Python 209140410T065437Zɐɔıʇǝɥʇu

Dyalog APL, 22 16 bytes

Minus a whopping 6 bytes thanks to @Mat_rdv's tacitification

⎕A⌈⌿⍛/⍨1⊥¨∘.=∘⎕A

Original explanation: Takes uppercase list of sentences on the right

{⎕A/⍨⌈⌿↑{+⌿↑⎕A∘∊¨⍵}¨⍵}­⁡​‎‎⁡⁠⁣⁡‏⁠‎⁡⁠⁢⁡⁣‏⁠‎⁡⁠⁢⁡⁤‏⁠‎⁡⁠⁢⁢⁡‏‏​⁡⁠⁡‌⁢​‎⁠⁠⁠⁠‎⁡⁠⁢⁡⁡‏⁠‎⁡⁠⁢⁡⁢‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁤⁡‏⁠‎⁡⁠⁤⁢‏⁠‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁣⁤‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁢‏⁠‎⁡⁠⁣‏‏​⁡⁠⁡‌­
        {         }¨⍵   # ‎⁡For each sentence
                ¨⍵      # ‎⁢For each letter
            ⎕A∘∊        # ‎⁣Mark if its present in the alphabet
           ↑            # ‎⁤Mix into a matrix
         +⌿             # ‎⁢⁡Sum columns.  This gives the count of each letter but indexed at alphabet position
       ↑                # ‎⁢⁢Mix this vector of counts for each sentence into a matrix
     ⌈⌿                 # ‎⁢⁣Take max down columns
   /⍨                   # ‎⁢⁤Select that many letters
 ⎕A                     # ‎⁣⁡From the alphabet
💎

Created with the help of Luminespire.

APL(NARS), 35 chars

{k←↑∪⍦/(⊂''),⍨{⍵/⍨⍵∊⎕A∪⎕a}¨⍵⋄k[⍋k]}

function input one array of array of chars, output one array of chars. It suppose input is not the array of array of char void.

Are elaborate all letter with case sensitive this means that 'a' and 'A' will be two different types of letter not the same. At end it order the output.

Note that:

  (⊂'hello')
┌────────┐
│┌5─────┐│
││ hello││
│└──────┘2
└∊───────┘
  ('hello')
┌5─────┐
│ hello│
└──────┘

so alone "('hello')" is not the right type, instead (⊂'hello') it seems right one array of array of chars of lenght 1.

It use ∪⍦/ that make the union of the sets the kind as the question request. I add the (⊂''),⍨ for the case there is only one element of the array of array.

test:

  f←{k←↑∪⍦/(⊂''),⍨{⍵/⍨⍵∊⎕A∪⎕a}¨⍵⋄k[⍋k]}
  f (⊂'hello')
┌5─────┐
│ ehllo│
└──────┘
  f ('hello')('i love cat')('i love mommy')('mommy loves daddy')
┌20───────────────────┐
│ acdddehillmmmoostvyy│
└─────────────────────┘

Uiua, 25 chars 20 chars 21 chars

ver3: +@a⊚↘55/↥⬚0⊜°⊚⊸±-@\n⌵

ver2: +@*↘2⊚/↥⬚0⊜°⊚⊸±-@\n⌵

ver1: +@a⊚/↥⬚0⊜(°⊚-@A▽⊸±⌵)⊸≠@\n

C - 224 bytes or 227 bytes or 228 bytes

(I belive this one breaks the record for C UwU, at the time of writing this there 99 bytes one but it doesn't work)

This assumes that the input has NO same letter with differing casing so "Sentence sentence" (where the 's' has two casing)

// 224 bytes

#include <stdio.h>
int main(){int b,d,a['{']={};do{int c['{']={};while((b=getchar())!=10&&b!=EOF)c[b]++;for(d='a';d<='z';d++)if(c[d]>a[d])a[d]=c[d];}while(b!=EOF);for(b='a';b<='z';b++)for(d=a[b];d--;putchar(b));putchar(10);}

This version always lowercase outputs and does fine with mixed input casing so "Sentence sentence" is treated correctly by the program

// 227 bytes

#include <stdio.h>
int main(){int b,d,a['{']={};do{int c['{']={};while((b=getchar())!=10&&b!=EOF)c[b]++;for(d='A';d<='z';d++)if(c[d]>a[d])a[d]=c[d];}while(b!=EOF);for(b='A';b<='z';b++)for(d=a[b];d--;putchar(b));putchar(10);}

Same as lowercase version but it always uppercase

// 228 bytes

#include <stdio.h>
int main(){int b,d,a['{']={};do{int c['{']={};while((b=getchar())!=10&&b!=EOF)c[b&~32]++;for(d='A';d<='Z';d++)if(c[d]>a[d])a[d]=c[d];}while(b!=EOF);for(b='A';b<='Z';b++)for(d=a[b];d--;putchar(b));putchar(10);}

Explanation

The 'a' array is used to keep track minimal count of each letter required to able to make up any lines up to current line. The inner 'c' array (which reinitialized to 0 at start of line iteration) is used to keep track current counter.

Then the inner "getchar" loop is the loop reading input and increment the corresponding counter with the ASCII value as its index.

Then at the end of line iteration, it would compare each letter and does "max" operation (essentially a > b ? a : b) to update the count of minimal letters needed.

And the end it iterates from letter A to Z, and uses ASCII value to index to array. If its non zero then the printing loop essentially loops 'counter' times and does putchar that many times of the current character. The way it was iterated make it naturally sorted at output therefore no need for sorting.

Right before returning the main function, it puts a newline. Finishing the program.

Note: the 'b' and 'd' variable are temporary and used at multiple places for different purposes. It does not need initialization at definition time because it always initialized before used through unconditional assignments.

AWK, 119 bytes

@load"ordchr"
{for(i=0;i++<26;y>a[x]&&a[x]=y)y=gsub(x=chr(i+96),X)}END{for(;j++<26;)for(i=a[x=chr(j+96)];i--;)printf x}

Attempt This Online!

Assumes lowercase input.

Thunno 2 J, 7 bytes

ẠıȷcGn×

Attempt This Online!

Port of Kevin Cruijssen's 05AB1E answer.

Explanation

ẠıȷcGn×  # Implicit input
Ạı       # Map over lowercase alphabet:
  ȷc     #  Count in each input string
    G    #  Pop and leave the maximum
     n×  #  Repeat the character that many times
         # Implicit output, joined

jq, 94 bytes

[.,inputs]|map(explode-[32]|group_by(.)[])|group_by(.[0])|map(max_by(length)|implode)|join("")

Try it online!


[., inputs]                          # from raw input to array of strings
                                     # e.g. ["hello", "i love cat", …]

| map(explode-[32] | group_by(.)[])  # splits each string into groups of
                                     # similar codepoints (excluding spaces)
                                     # e.g. "hello" -> [[101],[104],[108,108],[111]]


| group_by(.[0])                     # groups all groups of similar codepoints

| map(max_by(length)|implode)        # then only keep the largest group of
                                     # each sub groups and transform the
                                     # group into a string

| join("")                           # finally join all the strings

Vyxal s, 5 bytes

ɾƒÞ∪s

Try it Online!

Julia

78 bytes

it is my 1st approach

!I=join((A='A':'Z').^[max([count(c->c==a,i)
for i=split(I,'\n')]...) for a=A])

Attempt This Online!

or

69 66 bytes

!I=prod(maximum(filter(==(a),i) for i=split(I,'
')) for a='A':'Z')

Attempt This Online!

JavaScript (Node.js), 95 bytes

a=>(g=i=>i?g(i-1,i=i.toString(36))+i.repeat(Math.max(...a.map(y=>y.split(i).length))-1):'')(35)

Try it online!

05AB1E, 12 10 8 bytes

Aεδ¢ày×?

-2 bytes thanks to @ovs, which also allowed -2 more bytes.

Input taken as a list of lowercase strings. (Would require 1 additional byte if taking the input newline-delimited is mandatory.)

Try it online.

Explanation:

A        # Push the lowercase alphabet
 ε       # For-each over the letters:
  δ¢     #  Count how many times this letter occurs in each string of the (implicit)
         #  input-list
    à    #  Pop and leave the maximum of these counts
     y×  #  Repeat the current letter that many times
       ? #  And print it (without newline)

Japt -Px, 9 8 bytes

I knew there had to be a way to to it in 8!

cü üÎËÍÌ

Try it

cü üÎËÍÌ     :Implicit input of array
c            :Flat map
 ü           :  Group & sort by value
   ü         :Group & sort by
    Î        :  First character
     Ë       :Map
      Í      :  Sort
       Ì     :  Last element
             :Implicitly join, trim and output

Original (w/o flags), 9 bytes

Takes input as an array of lowercase strings.

;C£ËoXÃÍo

Try it

;C£ËoXÃÍo     :Implicit input of array U
;C            :Lowercase alphabet
  £           :Map each X
   Ë          :  Map U
    oX        :    Remove all characters but X
      Ã       :  End inner map
       Í      :  Sort
        o     :  Pop last element

Vyxal as, 12 bytes

ȧ∑U:ƛ?vOG;*s

Try it Online!

  U          # Unique characters of...
ȧ∑           # The input, with whitespace removed
          *  # Repeated by...
   :ƛ    ;   # Themselves mapped to...
        G    # The highest...
      vO     # Amount of...
             # (implicit) That character
     ?       # In the input
           s # Sorted.

Pyth, 14 10 bytes

smeS@Ld.zG

Accepts input as lowercase strings. Try it online here.

smeS@Ld.zG   Implicit: .z=input as list of strings, G=lowercase alphabet
 m       G   Map each letter in G, as d, using:
     L .z      In each string in .z ...
    @ d        ... keep only those characters which match d
   S           Sort by length
  e            Take the last element (i.e. longest)
s            Concatenate into string, implicit print

Edit: golfed 3 bytes. Previous version: sm*deSml@dk.zG

JavaScript, 105 104 bytes

Takes input as an array of character arrays and returns a string.

a=>[...new Set(a+``)].sort().map(c=>c.repeat(a.map(r=w=>r=w.map(l=>o+=c>{}&c==l,o=0)|o<r?r:o)|r)).join``

Try it online

Powershell, 118 116 87 bytes

-join($args|%{$_|% t*y|group|%{-join$_.Group}}|sort|group{$_[0]}|%{$_.Group[-1]})|% t*m

Less golfed test script:

$f = {

$x=$args|%{$_|% t*y|group|%{-join$_.Group}} # unsorted groups of the same letters for each sentence: (h,e,ll,o), (...), (...), (i, ,l,oo,v,e,d,g),...
$y=$x|sort|group{$_[0]}                     # sort all groups and group it again by the first letter (( , , , ), (a,a), (c), (d,ddd), ... (y,yy))
$z=$y|%{$_.Group[-1]}                       # get a last item (maximum item) from each group
-join($z)|% t*m                             # join it and trim spaces

}

@(
    ,("acdddeghillmmmoostvyy",
      "hello",
      "i love cat",
      "i love dog",
      "i love mommy",
      "mommy loves daddy")

    ,("AAAAAAAAAAAAAAAABBBCCCCDDDDDEEEEEEEEEFFGGGGHHHHHHIIIIIIIIIIJJKKLLLLMMMMMMMNNNNNNNNNNNNNOOOOOOOOOPPPPPPPQRRRRRRSSSSSSSTTTTTTUUUUUVWWXYYY",
      "I SAW THE MAN WITH THE BINOCULARS",
      "THEY ARE HUNTING DOGS",
      "FREE WHALES",
      "POLICE HELP DOG BITE VICTIM",
      "HE SAW THAT GAS CAN EXPLODE",
      "TURN RIGHT HERE",
      "WE SAW HER DUCK",
      "IN ANIMAL CRACKERS GROUCHO MARX AS CAPTAIN RUFUS T SPAULDING QUIPPED ONE MORNING I SHOT AN ELEPHANT IN MY PAJAMAS HOW HE GOT IN MY PAJAMAS I DONT KNOW",
      "SHIP SAILS TOMORROW",
      "BOOK STAYS IN LONDON",
      "WANTED A NURSE FOR A BABY ABOUT TWENTY YEARS OLD",
      "THE GIRL IN THE CAR THAT NEEDED WATER IS WAITING",
      "DID YOU EVER HEAR THE STORY ABOUT THE BLIND CARPENTER WHO PICKED UP HIS HAMMER AND SAW",
      "THOSE PROSECUTORS HAVE BEEN TRYING TO LOCK HIM UP FOR TEN YEARS",
      "FLYING PLANES CAN BE DANGEROUS",
      "I ONCE SAW A DEER RIDING MY BICYCLE",
      "TOILET OUT OF ORDER PLEASE USE FLOOR BELOW",
      "LOOK AT THE DOG WITH ONE EYE")
) | %{
    $expected,$s = $_
    $result = &$f @s
    "$($result-eq$expected): $result"
}

Output:

True: acdddeghillmmmoostvyy
True: AAAAAAAAAAAAAAAABBBCCCCDDDDDEEEEEEEEEFFGGGGHHHHHHIIIIIIIIIIJJKKLLLLMMMMMMMNNNNNNNNNNNNNOOOOOOOOOPPPPPPPQRRRRRRSSSSSSSTTTTTTUUUUUVWWXYYY

PHP, 116 bytes

foreach(file(T)as$y=>$s)for($i=0;~$c=ucfirst($s[$i++]);)$$c[$y]++;for($c=A;!$c[1];$c++)echo str_repeat($c,max($$c));

assumes filename T. Run with -nr.

breakdown

foreach(file(T)as$y=>$s)            # loop through lines of file
    for($i=0;~$c=ucfirst($s[$i++]);)    # loop through line characters
        $$c[$y]++;							# increment counter ($A..$Z)
	for($c=A;!$c[1];$c++)				# loop $c through uppercase letters
		echo str_repeat($c,max($$c));      # get max from $A, $B etc, use as multiplier for str_repeat

Jelly, 7, 6, 5 or 4 bytes

ỴŒuœ|/Ṣ

Try it online!

Function submission. Depending on how you interpret the I/O rules, it may be possible to drop the leading (which would then require input to be the data structure "list of strings", as opposed to a single string that was divided using newlines); and it may be possible to drop the Œu (which would then require the input to use a consistent case for the output to be correct).

Explanation

ỴŒuœ|/Ṣ
Ỵ        Split on newlines
 Œu      Uppercase each resulting string
     /   Combine the resulting strings using…
   œ|      …multiset union
      Ṣ  Sort

Japt v1.4.5, 11 bytes

;CËpUmèD rw

Try it online!

Unpacked & How it works

;CmDEF{DpUmèD rw

;                 Use an alternative set of predefined variables
 C                "abc...z"
  mDEF{           Map over each char and form a string...
         UmèD       Map over input array into char count
              rw    Reduce with max
       Dp           Repeat the char this number of times

Stax, 8 bytes

ü2lLÜ▀⌂æ

Run and debug it

  1. Reduce the array of inputs using a multiset union operation.
  2. Sort the resulting characters.
  3. Remove spaces.

PHP, 143 bytes

Assuming that input is passed in variable $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));}

Explanation

For each possible letter I'm mapping array containing list of strings through a user-defined function which replaces each line with number of characters used. For letter 'd' the line "Mommy loves daddy" will be mapped into 3.

Afterwards I find maximum value inside array and output letter just this many times. Here is multi-line version:

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

C#, 172 bytes

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

C, 298 bytes

(242 bytes by not counting newlines)

Array D keeps tally of letters in each line, then the maximum count of each letter is copied into array C.

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

Note: I just discovered Notepad++ which gives my character count, counts newlines as 2 chars. Should these be subtracted?

C# / LINQPad, 181 bytes

In C# Expression mode; assumes input file is named a (and probably in the LINQPad Program Files folder)

string.Join("",File.ReadAllLines("a").SelectMany(s=>s.ToUpper().Where(c=>c>64&&c<91).GroupBy(c=>c)).GroupBy(g=>g.Key).Select(g=>new string(g.Key,g.Max(x=>x.Count()))).OrderBy(s=>s))

Ungolfed

string.Join("",                                                     // concat all substrings, with no separator
    File.ReadAllLines("a")                                          // read all lines from text file called 'a'
        .SelectMany(                                                // apply function to each subset and union into a single set
            s => s.ToUpper()                                        // convert strings to uppercase
                  .Where(c => c > 64 && c < 91)                     // shorter than char.IsLetter(c) for all uppercase
                  .GroupBy(c => c)                                  // group on each character in the string
         )                            
        .GroupBy(g => g.Key)                                        // group again on each character (I'd love to get rid of this...)
        .Select(g => new string(g.Key, g.Max(x => x.Count())))      // string(char, count) constructor build repeating-char string
        .OrderBy(s => s)                                            // sorted set required
)

Input (text file called a)

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

Output

ACDDDEGHILLMMMOOSTVYY

C, 298 bytes

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

Array D holds tally of letters for each line, then the maximum count is copied to C.

Note: I put my answer yesterday but is now not listed, maybe I pressed delete instead of edit by mistake?

Python 2, 154 bytes

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

Haskell, 41 bytes

f s=do c<-['a'..];maximum$filter(==c)<$>s

Try it online! f takes a list of lines as input.

Add main=interact$f.lines to get a full program for a total of 63 bytes.

Explanation

f s=                -- input s is the list of lines
 do c<-['a'..];     -- for each char c starting at c='a', concatenate the following strings
    filter(==c)<$>s -- for each line in s remove all characters except for the current c
   maximum$         -- take the longest of those strings

Kotlin, 189 bytes

lines().map{it.filter{it.isLetter()}.groupingBy{it}.eachCount()}.fold(mutableMapOf<Char,Int>()){r,i->i.map{(t,u)->r[t]=maxOf(r[t] ?:0,u)}
r}.flatMap{(k,v)->(0..v-1).map{k}}.joinToString("")

Beautified

lines()
    .map { it.filter { it.isLetter() }.groupingBy { it }.eachCount() }
    .fold(mutableMapOf<Char, Int>()) { r, i ->
        i.map { (t, u) -> r[t] = maxOf(r[t] ?: 0, u)}
        r
    }
    .flatMap { (k, v) -> (0..v-1).map { k } }
    .joinToString("")

Test

fun String.f() =

lines().map{it.filter{it.isLetter()}.groupingBy{it}.eachCount()}.fold(mutableMapOf<Char,Int>()){r,i->i.map{(t,u)->r[t]=maxOf(r[t] ?:0,u)}
r}.flatMap{(k,v)->(0..v-1).map{k}}.joinToString("")

fun main(args: Array<String>) {
    val i = """hello
i love cat
i love dog
i love mommy
mommy loves daddy"""
    println(i.f().map { it }.sorted().joinToString(""))
    println("acdddeghillmmmoostvyy")
}

TIO

TryItOnline

K, 34

{`$a@<a:,/(.:a)#'!:a:|/#:''=:'0:x}

C# - 146 Bytes

var x="";foreach(var l in File.ReadAllLines(t))foreach(var p in l)if(x.Count(c=>c==p)<l.Count(c=>c==p))x+=p;string.Concat(x.OrderBy(o=>o)).Trim();

Well, I think this is as short as C# can get. This code expects a path to the text file in the variable t.

JavaScript (ECMAScript 6) - 148 139 135 Characters

Version 2:

Updated to use array comprehension:

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

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

Assumes that:

With comments:

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.

If you want to:

Running:

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

Gives the output:

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

Bash, 171 159 158, 138 with junk output

Requires lowercase-only input. Assumes that the file is called _ (underscore). Maximum of 26 lines in the input file due to the annoying filenames which split creates (xaa, xab... xaz, ???).

In bash, {a..z} outputs 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

Sample output

acdddeghillmmmoostvyy

Explanation

touch {a..z}

Create files that we will be reading from later on so that bash doesn't complain that they don't exist. If you remove this line you will save 13 chars but get a lot of junk output.

split _ -1

Split the input file into sections, each storing 1 line. The files this command creates are named xaa, xab, xac and so on, I have no idea why.

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

For each letter $l read through all lines stored in files xa$s.

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

Remove the -s switch to save 1 char and get a lot of junk output. It prevents grep from complaining about nonexistent files (will occur unless you have 26 lines of input). This processes the file xa$s, removing anything but occurences of $l, and sending output to the file b$l. So "i love mommy" becomes "mmm" with new lines after each letter when $l is m.

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

If the number of lines in the file we just created is greater than or equal to (i.e. more letters since there is one letter per line) the number of lines in our highest result so far (stored in $l)...

then mv b$l $l

...store our new record in the file $l. At the end of this loop, when we have gone through all the lines, the file $l will store x lines each containing the letter $l, where x is the highest number of occurences of that letter in a single line.

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

Output the contents of our file for that particular letter, removing new lines. If you don't want to remove the new lines, change the line with tr to echo $l, saving 6 chars.

done

I'm adding my own solution:

Bash - 72

Assumes that input is in file "i"

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

Explanation

For each possible letter, filters it out only from input file resulting in something like this:

AAA
A
A

AAAA

A
AAAAAAAAAAAAAAAA

Then result is sorted and the longest line is selected. echo -n is there to remove newlines.

C#, 265 characters

Assuming input is in variable s, here's a C# Expression, using mainly LINQ (Enumerable.cs):

string.Join("",s.ToLower().Split('\n').Select(e=>e.Where(l=>l!=' '&&l!='\r')
.GroupBy(l=>l).ToDictionary(k=>k.Key,v=>v.Count())).SelectMany(u=>u).GroupBy(l=>l.Key)
.Select(g=>new String(Enumerable.Range(1,g.Max(v=>v.Value)).Select(i=>g.Key).ToArray()))
.OrderBy(l=>l))

Java, 335

Here is the executable code in java in a more readable form. Once all the unnecessary white spaces are removed, you will see 335 characters in all. The output is:

ACDDDEGHILLMMMOOSTVYY

It gets a filename as input and reads each character from the file, converts it to uppercase and stores the count of it's occurrence in an array. For every new line, the maximum occurrence of each character is updated. At last it is printed. Pre-requiste: The file should end with a newline.

class F {
    public static void main(String[] a) throws Exception {
        java.io.FileInputStream f = new java.io.FileInputStream(a[0]);
        int j, r, l = 256;
        int[] i = new int[l], t = new int[l];
        while ((r = f.read()) > 0) {
            r = r > 96 ? r - 32 : r;
            if (r == 10)
                for (j = 0; j < l; j++) {
                    i[j] = i[j] < t[j] ? t[j] : i[j];
                    t[j] = 0;
                }
            else
                t[r]++;
        }
        for (j = 65; j < 91; j++)
            while (i[j]-- > 0)
                System.out.print((char) j);
    }
}

After removing the white spaces the code will look like the following:

class F{public static void main(String[] a)throws Exception{java.io.FileInputStream f=new java.io.FileInputStream(a[0]);int j,r,l=256;int[] i=new int[l],t=new int[l];while((r=f.read())>0){r=r>96?r-32:r;if(r==10)for(j=0;j<l;j++){i[j]=i[j]<t[j]?t[j]:i[j];t[j]=0;}else t[r]++;}for(j=65;j<91;j++)while(i[j]-->0)System.out.print((char)j);}}

I realize this probably isn't the most efficient answer, but I wanted to try and solve the problem anyways. Here's my ObjC variation:

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

Then you can call it for whatever string:

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

I was thinking about applications with larger amounts of text and I'd rather not have to count my array. For this, I added to the method to get this:

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

Run like:

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

Will give you:

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

Which I think is better if I had a very large amount of text and I just needed to know how many of each letter I would need.

Bash (mostly 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'

Text needs to be piped in to awk (or specified as a file).

Example Input

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

Example Output

ACDDDEGHILLMMMOOSTVYY

PHP (probably could be better) - 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;

Assumes that the string is contained in the variable $s

Example Input

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

Example Output

ACDDDEGHILLMMMOOSTVYY

Perl, 46

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

Here's another Perl solution, reads from STDIN, requires -n switch (+1 to count), ties with primo's score but runs without complaints :-). It exploits the fact that bitwise or's result has longer string argument's length.

Julia, 159

My objective is help understand/improve the expressiveness of Julia. Here's a first attempt.

a='a'-1;print(foldl((c,n)->(global a+=1;"$c"*"$a"^n),"",int(mapreduce(s->hist(int({s...}),0:255)[2],(S,T)->max(S,T),zeros(255),readlines(STDIN))[97:122]))"\n")

Here's my crazy idea.

Using mapreduce, foldl, and hist (builtin histogram) were advantageous, but having to deal assembling an array from a string and then back to a string from an array and globals expanded the length.

Program reads from STDIN. Required foldl which is new in Julia 0.30.

Sample Input

alskdja
flkjaslakjd
asa
as
g
alkdjaslkajsd
Output
aaaddfgjjkkllss

Python - 206 204 199 177 145 129 117 94 88 chars

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

I wasn't sure how I was supposed to obtain the file name, so at the moment the code assumes that it is contained in a variable named f. Please let me know if I need to change that.

Perl 6: 56 53 characters; 58 55 bytes

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

For each line, this combs through it for the non-space characters of the lower-cased string (comb /\S/,.lc), and makes a Bag, or a collection of each character and how many times it occurs. [∪] takes the union of the Bags over all the lines, which gets the max number of times the character occurred. .pick(*) is hack-y here, but it's the shortest way to get all the characters from the Bag replicated by the number of times it occurred.

EDIT: To see if it would be shorter, I tried translating histocrat's Ruby answer. It is 63 characters, but I still very much like the approach:

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

kdb (q/k): 59 characters:

d:.Q.a! 26#0
.z.pi:{d|:.Q.a##:'=_y}.z.exit:{-1@,/.:[d]#'!:d}

-1 adds a newline, using 1 would save a character but does not generate the output specified. Wish I could get rid of the .z.pi / .z.exit boilerplate, which would remove 14 characters.

Edit: avoid use of inter/asc by using seed dictionary.

Lua - 206 Chars

g=string
f,t,b,e=io.lines(({...})[1]),{},g.byte,g.char
for s in f do for c=b"a",b"a" do _,d=s:lower():gsub(e(c),"");t[c]=t[c]and(t[c]>d and t[c])or d end end for c=b"a",b"z" do io.write(g.rep(e(c),t[c]))end

Reads from the file passed via command line, then creates a table with the maximum number of occurences per letter. Finally outputs the occuring letters.

C, 99 chars

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

It crashes if less than one newline is provided. I think it could be fixed quite easily.

Groovy, 113/127 102/116 characters

Assuming the file is all in one case (102 chars):

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

Assuming the file is in mixed case (116 chars):

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

Basically:

PowerShell - 141

Reads text from a file named '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""

Haskell, 183 162 159

Assuming the file is in 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

If file.txt contains, for example

abcde
abcdef
aaf

The script will output

aabcdef

Basically I'm appending the whole alphabet to each line, so that when grouping and sorting, I'm sure I'll end up with a list that contains 27 elements. Next, I transpose the "frequency table", so that each row in this array consists of the frequencies of a single letter in each line, e.g. ["a","","aaa","aa","aaaa"]. I then choose the maximum of each array (which works just like I want because of how the Ord-instance of Strings work), and drop the letter that I appended at the start, get rid of the spaces, and output the result.

JavaScript (ES5) 141 bytes

Assuming variable s is the input string with no case-checking requirements and array output:

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

Ruby 1.9+, 51 (or 58 or 60)

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

Assumes everything's in lowercase. Case insensitivity costs 7 characters via .upcase, while case insensitivity and lowercase output costs 9 characters via .downcase.

JavaScript - 244

Accepts a parameter of string with newlines.

function s(z){n=m="",y=[];z.toLowerCase().split("\n").map(function(g){a=[];g.replace(/ /g,n).split(n).map(function(e,i){if((+y[e]|0)<(a[e]=(+a[e]|0)+1))y[e]=a[e];});});for(var b in y){m+=Array(y[b]+1).join(b);}return m.split(n).sort().join(n);}

Not happy with the sorting and preparation of the output.

Edit: case-insensitive regex unnecessary! Thanks @Bergi

J - 37 char

Reads from stdin, outputs to console.

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

1!:1]3 is the call to stdin. tolower;._2 performs double duty by splitting up the lines and making them lowercase simultaneously. Then we count how many times a character occurs in each row with +/"2=/&a., and take the pointwise maximum over all lines with >./.

Finally, we pull that many of each character out of the alphabet with #&a.. This includes spaces—all found at the front due to their low ASCII value—so we just delete leading blanks with dlb.

C++, 264 characters.

Reads lowercase text from standard input.

#include<algorithm>
#include<iostream>
#include<map>
using namespace std;main(){string s;map<int,long> m;while(getline(cin,s)){int c='`';while(c++<'z')m[c]=max(m[c],count_if(begin(s),end(s),[c](int d){return d==c;}));}for(auto i:m)cout<<string(i.second,i.first);}

C++ function, 205 characters.

string a(istream&i){string s;map<int,long> m;while(getline(i,s)){int c='`';while(c++<'z')m[c]=max(m[c],count_if(begin(s),end(s),[c](int d){return d==c;}));}for(auto i:m)s.append(i.second,i.first);return s;}

JavaScript, 199 characters

function(n){for(s in p=n.toUpperCase(t=[]).split("\n"))for(i in p[k={},s])t[l=p[s][i]]=Math.max(t[l]||0,k[l]=k[l]+1||1);for(l in t)t.push(new Array(t[l]+1).join(l));return t.sort().join('').trim()}

Javascript, 261 chars

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

Remove the eval(...) and execute to get the real code; this is (somewhat) compressed.

s multi-functions as the array of lines and as the outputted string, h contains the histogram of the letters per line and H contains the histogram with the maximum values up until now. It's case-insensitive, and just ignores anything but a-z and A-Z (I think... JS arrays are sometimes weird).

Now correct :)

Scala, 125 characters

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

First I read the input, converting it into lower case and adding one empty line.

Then for each letter from a to z I repeat that letter maximum number of times it appears in any of the lines (that's why I need the empty line: max cannot be called on an enpty input). Then I just join the results and print to the output.

To read from a file, replace stdin with fromFile("FILENAME"), increasing the size of the code to 132 characters + file name length.

GolfScript, 28 / 34 chars

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

The 28-character program above assumes that all the input letters are in the same case. If this is not necessarily so, we can force them into upper case by prepending {95&}% to the code, for a total of 34 chars:

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

Notes:

Explanation:

Haskell, 109 108

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

The program reads from stdin and writes to sdtout.

It is quite straightforward: it breaks the string into a list of lines, and rebuilds it by iterating on the list and adding the new letters contained in each line.

Mathematica v10 - 110

It's not out yet, but reading new documentation very carefully, I think this should work:

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

Perl - 46 bytes

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

Counting the shebang as 1. This is a loose translation of the Ruby solution below.


Ruby 1.8 - 72 bytes

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

Input is taken from stdin.

Sample usage:

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

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

Python 2 - 129

Idea from @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 couple more ways to do the same thing in the same number of characters:

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

This assumes the file is saved as f in an accessible directory. This program is directly runable, with no extra input necessary.

R (156, incl. file read)

With table I construct the letter frequency table for each sentence. Then I end up with taking for each letter the maximum value.

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

Ungolfed:

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

Solution:

acdddeghillmmmoooooostuvyy

Python (209, with the sample included, 136 without.):

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

I'll post a PYG sample this afternoon.