g | x | w | all
Bytes Lang Time Link
062Google Sheets250919T093338Zdoubleun
054Python 3250919T205423ZUnmitiga
063Python 3.8 prerelease250919T032624ZTed
00705AB1E250920T012628Zdarthbee
043R250919T133826ZGlory2Uk
027x86_64 machine code250919T152201ZIfier
069JavaScript Node.js250919T091146ZArnauld
3875Vyxal g250919T050553Zlyxal
004Vyxal 3 G250919T080834ZThemooni
011Charcoal250919T063442ZNeil
013TinyAPL250919T063325ZRubenVer
042Arturo250919T054046Zchunes
019Dyalog APL250919T053533ZAaron

Google Sheets, 62 bytes

Assuming that "any letter which is not present (ignoring case)" means to get one of the uniques when lowercase is considered equal to uppercase:

=char(filter(row(65:90),iserror(search(char(row(65:90)),A1))))

This gets #N/A when there are no letters to show.

To get all letters that aren't present, upper and lower case (80 bytes):

=let(a,sort(char({row(65:90);row(97:122)})),ifna(filter(a,iserror(find(a,A1)))))

screenshot

Python 3, 65 57 54 bytes

lambda s:max({"",*map(chr,range(65,91))}-{*s.upper()})

Try it online!

Saved 8 bytes thanks to Albert.Lang.

Saved 3 bytes thanks to xnor.

Python 3.8 (pre-release), 63 bytes

f=lambda w,n=65:n<91and[c:=chr(n),f(w,n+1)][c in w.upper()]or''

Try it online!

Previous case-sensitive version of question: 61 bytes

f=lambda w,n=32:n<83and[c:=chr(65+n%58),f(w,n+1)][c in w]or''

Try it online!

05AB1E, 7 bytes

lAsмõªн

Try it online!

Explanation:

lAsмõªн
l       ; lowercase
 A      ; all lowercase letters
  s     ; swap positions in stack
   м    ; remove anything from the top position in stack (lowercasified input) that occurs in the second position (all lowercase letters)
     ª  ; append empty string to array
      н ; get first item in array

R, 43 bytes

\(s)max(sub(paste("[",s,"]"),"",letters,T))

Attempt This Online!

Converts the argument string into a regular expression by adding [] around it. Then sub removes from the alphabet list all letters that are present in the argument string (replaces them with an empty string). And finally the letter with the highest value is taken - to ensure the output of the empty string only when no letters are present. The argument T added to ignore the case.

If we are allowed to input a list of characters instead of a string (thanks to pajonk for the suggestion):

R, 34 bytes

\(s)setdiff(letters,tolower(s))[1]

Attempt This Online!

x86_64 machine code, 27 bytes

Running on Godbolt

0:  6a ff                   push   0xffffffffffffffff
2:  e3 15                   jrcxz  19 <empty>
4:  5a                      pop    rdx
0000000000000005 <checklist>:
5:  ac                      lods   al,BYTE PTR ds:[rsi]
6:  24 df                   and    al,0xdf
8:  2c 41                   sub    al,0x41
a:  3c 1a                   cmp    al,0x1a
c:  73 03                   jae    11 <nonalpha>
e:  0f b3 c2                btr    edx,eax
0000000000000011 <nonalpha>:
11: e2 f2                   loop   5 <checklist>
13: 0f bc c2                bsf    eax,edx
16: 04 61                   add    al,0x61
18: c3                      ret
0000000000000019 <empty>:
19: 58                      pop    rax
1a: c3                      ret

Sysv calling convention, C-style signature of:

unsigned char find_missing(int, const char* string, int, unsigned long long string_length)

Where the ints are to pad arguments into the right registers and can be any value. Returns a lowercase ascii letter ('a'-'z') indicating the missing letter on failure, or any other bit pattern on success (either 255 or 123).

Fairly simple: set up a bitset tracking which letters haven't been encountered, go through each letter, collapse down to lowercase, then if it's a valid letter clear the corresponding bit. Once the entire string has been processed the index of the first set bit in the bitset is added to 'a' to produce the first missing letter (or '{' if all characters were found, which indicates success)

JavaScript (Node.js), 69 bytes

f=(s,n=65)=>n>90?"":eval(`/${c=Buffer([n])+""}/i`).test(s)?f(s,n+1):c

Try it online!

f = (               // f is a recursive function taking:
  s,                //   s = input string
  n = 65            //   n = ASCII code counter
) =>                //       starting at 65 ('A')
n > 90 ?            // if n is greater than 90 ('Z'):
  ""                //   abort and return ""
:                   // else:
  eval(             //   build a regex:
    `/${            //     with the character c
    c = Buffer([n]) //     whose ASCII code is n
        + ""        //
    }/i`            //     case insensitive
  )                 //   end of eval()
  .test(s) ?        //   if it's matching s:
    f(s, n + 1)     //     do a recursive call with n + 1
  :                 //   else:
    c               //     return c

JavaScript (ES6), 65 bytes

Or 69 bytes if we're not allowed to return undefined instead of an empty string when there's no solution.

x=b=>[...x+Date].find(y=>/^([a-zghjklmpqrw])(?!.*\1)/i.test(y+b))

Try it online!

x =                             // u is a function taking:
b =>                            //   b = input string
[...x + Date]                   // split the source code concatenated with
                                // "function Date() { [native code] }"
.find(y =>                      // for each character y in this list:
  /^([a-zghjklmpqrw])(?!.*\1)/i //   look for a letter in any case that only
                                //   appears at the leading position
  .test(y + b)                  //   in the concatenation of c and b
)                               // end of find()

Vyxal g, 31 bitsv2, 3.875 bytes

Ǎ⇩n⊍

Try it Online!

Bitstring:

1101010110010110111001000011100

Pretty much an exact port of the v3 answer.

Vyxal 3 -G, 4 bytes

ʀ⦷n⊍

Vyxal It Online!

ʀ⦷n⊍­⁡​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁣‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁤‏‏​⁡⁠⁡‌⁢⁡​‎‏​⁢⁠⁡‌­
ʀ     # ‎⁡to lowercase
 ⦷    # ‎⁢keep letters
  n   # ‎⁣lowercase alphabet
   ⊍  # ‎⁤set difference
# ‎⁢⁡-G flag prints maximum of top at the end of the program
💎

Created with the help of Luminespire.

Charcoal, 11 bytes

F⁺αβ¿¬№θιPι

Try it online! Link is to verbose version of code. Outputs the last missing letter by ASCII code. Explanation:

F⁺αβ

Loop over the uppercase and lowercase alphabet.

¿¬№θι

If this letter is not present in the input...

Pι

... overwrite any previous output.

(10 bytes would be possible if either the output could be None if all letters are present or if the code could throw an exception without output if all letters are present.)

TinyAPL, 13 bytes

⊃⬚⍬∘~⍛(⎕u⍪⎕l)

Explanation: remove from all the letters the input, take the first element or the empty list if it's empty

Arturo, 42 bytes

$=>[take--++@`a`..`z`@`A`..`Z`to[:char]&1]

Try it!

Dyalog APL, 19 bytes

(⊢↑⍨1⌊≢)(⎕A,⎕C⎕A)∘~­⁡​‎‎⁡⁠⁢⁡⁣‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁣⁡‏⁠‎⁡⁠⁢⁡⁡‏⁠‎⁡⁠⁢⁡⁢‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏⁠‎⁡⁠⁤⁡‏⁠‎⁡⁠⁤⁢‏⁠‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁢⁣‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁣‏⁠‎⁡⁠⁤‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁢‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌­
                  ~  # ‎⁡Without
        (       )∘   # ‎⁢  with the left argument bound as
         ⎕A,⎕C⎕A     # ‎⁣  the uppercase alphabet concated with the lowercase alphabet
(      )             # ‎⁤Run atop this train
      ≢              # ‎⁢⁡Tally of the arg
    1⌊               # ‎⁢⁢Minimum with 1
  ↑⍨                 # ‎⁢⁣Take that many from
 ⊢                   # ‎⁢⁤  the right
(      )             # ‎⁣⁡This all to prevent taking the first element of the result of `without` giving me a prototypal value of ` ` when I really do want an empty list of there is nothing to be found
💎

Created with the help of Luminespire.