# Introduction

Every letter in the English alphabet can be represented as an ASCII code. For example, a is 97, and S is 83. As we all know, the formula for averaging two numbers $$\x\$$ and $$\y\$$ is $$\\frac{x+y}{2}\$$. I'm pretty sure you can see where this is going. Your challenge is to average two letters.

# Challenge

Your program must take two letters as input, and output the average of the ASCII values in it. If the average is a decimal, you should truncate it.

• Input will always be two ASCII letters. You can assume they will always be valid, but the case may vary. Basically, both letters will be in the range 97-122 or 65-90. The second letter will always have a greater ASCII value than the first. If your language has no method of input, you may take input from command line arguments or from a variable.
• You must output the ASCII character signified by the average of the two numbers. As stated above, it should always be truncated to 0 decimal places. If your language has no method of output, you may store it in a variable. Exit codes and return values are considered valid output methods.

# Example I/O

• Input: A, C
Output: B
• Input: a, z
Output: m
• Input: d, j
Output: g
• Input: B, e
Output: S
• Input: Z, a
Output: ]

# Rules

This is , so shortest answer in bytes wins!

• Please specify whether, for example, B e is a valid input. Nov 10, 2019 at 19:53
• Why is the output of the last example U? The value of B is 66 and the value of e is 101, which averages to 83.5, truncated to 83, which corresponds to S Nov 10, 2019 at 23:05
• If that example is correct, it will invalidate all of the existing answers.
– user85052
Nov 11, 2019 at 10:05
• Sorry. I read an ASCII table wrong and got 69 for B, not 66. Nov 11, 2019 at 14:00
• Could I enter for a non-ASCII compliant system? Nov 25, 2019 at 17:28

# C# (Visual C# Interactive Compiler), 20 bytes

a=>b=>(char)(a+b>>1)


Try it online!

# x86-16 machine code, IBM PC DOS, 1312 10 bytes

Binary (xxd):

00000000: a182 0002 c4d0 e8cd 29c3            ..........


Listing:

A1 0082     MOV  AX, [0082H]    ; load two chars into AH and AL from command line
02 C4       ADD  AL, AH         ; AL = AL + AH
D0 E8       SHR  AL, 1          ; AL = AL / 2
CD 29       INT  29H            ; write to console


Standalone PC DOS executable. Input is via command line, output to console.

Example: • Only 5 bytes if written as a function :-) Nov 12, 2019 at 18:57
• @CodyGray only 4 bytes as a snippet or a MACRO. Not sure where the "line" is though... :) Nov 13, 2019 at 17:22
• Functions are always permitted, as are full programs, per house code golfing rules. Not sure about macros, though; interesting suggestion. Although avoiding that 1-byte RET is probably not going to be enough to make a difference most of the time... Nov 14, 2019 at 0:53

# Jelly, 4 bytes

OSHỌ


Try it online!

# Explanation

OSHỌ  Main Link: takes (a, b)
O     (ord(a), ord(b))
S    sum; ord(a) + ord(b)
H   halve; (ord(a) + ord(b)) / 2
Ọ  chr


# Poetic, 163 bytes

software inside a computer
a robot+a man+a keypad+a plan=a PC
still,P.C.this,P.C.that?i await a day i crush a PC
i do Linux,i suppose


Try it online!

Poetic is an esolang I made in 2018 for a class project. It's basically brainfuck with word-lengths instead of symbols.

(I actually use PC myself. 😉)

• Love the idea of this language. Nov 12, 2019 at 21:55

# J, 17 bytes

(+/<.@%#)&.(3&u:)


Try it online!

• (+/<.@%#) truncated average...
• &. "Under", which applies a transform, then the verb it modifies -- truncated avg in this case -- then the inverse transform....
• 3&u: convert to ascii byte integer.

That is, it converts each letter to its ascii number, gets the truncated average of those, and applies the inverse of "convert to ascii number", which takes an ascii number and returns a letter.

# Ruby, 22 bytes

->a,b{""<<(a+b).sum/2}


Try it online!

• Huh. TIL the functionality of str << int. Nov 11, 2019 at 22:54

# R, 56 37 bytes

intToUtf8(mean(utf8ToInt(scan(,""))))


Try it online!

Description

• intToUtf8() converts the average into its ASCII character.

• mean() takes the average which is automatically truncated.

• utf8ToInt() converts the inputs into two ASCII numbers.

• scan() allows inputs.

• Welcome to CGCC! A few tips: 1. You can use an anonymous function, so don't need the f=; 2. You don't need print; 3. In this case, it is actually shorter to take input with scan that to define a function; 4. floor is not needed: if you feed a non-integer numeric to intToUtf8, R truncates it automatically before converting to character. Also, TIO must have been experiencing issues when you tried it; the base package is included. All in all, your solution can be shortened to 37 bytes. Nov 10, 2019 at 17:43
• @RobinRyder Thanks for the reduction! Nov 10, 2019 at 19:15

# Keg-ir-oc, 5 2 bytes (SBCS)

Works in all 3 test cases.

+½


Try it online!

# Explanation

-ir will *not* try to evaluate the input
½  Halve the value
-oc Output all as a character, if possible

Implicit print. The output is print nice by default.
$$$$

• Loading issue. I just tried the first test case and it didn't error.(I got to clone the most recent Keg interpreter.)
– user85052
Nov 9, 2019 at 14:36
• Using -ir and -oc will allow this two byter: +½ Nov 9, 2019 at 21:12
• What a great solution. I think we cannot go shorter. Nov 11, 2019 at 9:11

# K (oK), 8 bytes

Solution:

c$.5*+/  Try it online! Explanation: Sum, multiply by 0.5 and convert to ASCII. c$.5*+/ / the solution
.5*   / multiply by 0.5
c$/ convert to ASCII  # Bash, 56 bytes printf \\x$(printf %x $[printf "(%d+%d)/2" \'$1 \'$2])  Try it online! • 1) The outer pair of quotes is needed only because the \x, so better escape just that single character; 2) The deprecated $[..] is shorter for arithmetic evaluation; 3) The old .. is shorter for subcommand, except when needs escaping; 4) The inner pairs of quotes are needed only because of ', so better escape just those characters. Try it online! Nov 11, 2019 at 11:29
• @manatwork: Do you want to post this as an answer? Or should I edit my post? Nov 11, 2019 at 11:38
• Feel free to edit your post. Is mostly your work. I didn't had the patience this time to juggle with the printfs. Nov 11, 2019 at 11:47
• You have an error in the version posted here: the closing " should be on the left side of the nearby space to avoid touching the next argument's first character, the \. (The TIO code is correct though.) Nov 11, 2019 at 15:14
• @manatwork: Thanks for pointing me to this. Nov 11, 2019 at 15:21

# Shakespeare Programming Language, 144 bytes

Try it online!

/.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]
Ajax:Open mind.
Puck:Open mind.
You is the quotient betweenthe sum ofyou I a big cat.
Speak thy.


Simple enough, just finds the average. ASCII characters and numbers are identical in SPL, so this language was ideal for the task.

# dzaima/APL, 11 bytes

(+/÷≢)⍢⎕UCS


Try it online! dzaima/APLs ⎕UCS - convert to/from char currently ignores the fractional part of the given number, so no floor is necessary.

# Befunge-98 (PyFunge), 7 bytes

~~+2/,@


Try it online!

# Python 2, 31 bytes

lambda*A:chr(sum(map(ord,A))/2)


Try it online!

# jq, 23 characters

[explode|add/2]|implode


Sample run:

bash-5.0$jq -Rr '[explode|add/2]|implode' <<< 'AC' B  Try it online! # Excel, 28 bytes =CHAR((CODE(A1)+CODE(B1))/2)  # Lua, 42 41 bytes a=...print(a.char(a:byte()+a:byte(2)>>1))  Try it online! Removed 1 byte using ouflak's method of taking input as a single command line argument. Takes input as a single command line argument of two characters. Uses the convenient operator precedence of >>. Note that this is actually a full standalone Lua 5.3 program, because command line arguments are accessible as a top-level vararg. • You beat me: print(string.char((io.read():byte()+io.read():byte())/2)). Nov 11, 2019 at 9:30 • Thanks to your tip on my answer, I think I just figured out how to save 1 byte on yours. Nov 11, 2019 at 14:46 # Julia 1.0, 26 bytes a\b=Char(sum(Int[a,b])÷2)  TIO was timing out for me, so only tested at REPL. Try it online! • "You must output the ASCII character signified by the average of the two numbers". Shouldn't your output be a single ASCII character? Nov 12, 2019 at 16:58 • Thanks for catching that, fixed. – gggg Nov 12, 2019 at 17:42 # Preproc, 1187 bytes #define A #define B, #define C,, #define D,C #define E,D #define F,E #define G,F #define H,G #define I,H #define J,I #define K,J #define L,K #define M,L #define N,M #define O,N #define P,O #define Q,P #define R,Q #define S,R #define T,S #define U,T #define V,U #define W,V #define X,W #define Y,X #define Z,Y #define a Z H #define b,a #define c,b #define d,c #define e,d #define f,e #define g,f #define h,g #define i,h #define j,i #define k,j #define l,k #define m,l #define n,m #define o,n #define p,o #define q,p #define r,q #define s,r #define t,s #define u,t #define v,u #define w,v #define x,w #define y,x #define z,y #define _(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,_,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,$,...)#$#define$($a,$b)_($a$b z,y,y,x,x,w,w,v,v,u,u,t,t,s,s,r,r,q,q,p,p,o,o,n,n,m,m,l,l,k,k,j,j,i,i,h,h,g,g,f,f,e,e,d,d,c,c,b,b,a,a,,,_,_,^,^,],],\\,\\,[,[,Z,Z,Y,Y,X,X,W,W,V,V,U,U,T,T,S,S,R,R,Q,Q,P,P,O,O,N,N,M,M,L,L,K,K,J,J,I,I,H,H,G,G,F,F,E,E,D,D,C,C,B,B,A,A)


Try it online!

Defines a macro $ which can be called (as shown in the footer of the TIO link above) This challenge is barely possible in preproc (pure macro) -- if the input can be non-alphanumeric characters too, it would not be possible. I don't see any simple way to shorten this code -- it might be possible to make the part to take the (n)th element shorter, but that would come at the cost of making the initial macro definitions significantly longer. # Python 2, 33 32 bytes -1B from Embodiment of Ignorance using bit ops. Exactly as specified. For a Python 3 answer change the / into //. lambda a,b:chr(ord(a)+ord(b)>>1)  Try it online! • This could be just /2 in Python 2. Nov 9, 2019 at 14:18 • I mean, this way. Nov 9, 2019 at 14:24 • I see, I thought the complete function body can be turned into /2. – user85052 Nov 9, 2019 at 14:25 • You can save 2 bytes with lambda*s:chr(sum(map(ord,s))/2) Nov 9, 2019 at 15:42 • For a Python 3 answer change the / into //.  part is outdated – l4m2 Apr 22, 2020 at 8:45 # Lua, 63 60 bytes s=io.read()print(s.char(math.floor((s:byte()+s:byte(2))/2)))  Takes the two letters with no delimeters, i.e. AB, j$, |1, etc....

Try it online!

Saved 3 bytes thanks to PhillipRoman

• There are shorter Lua solutions. They look also interesting, @outflak. Nov 11, 2019 at 9:45
• @ouflak I'd like to clarify that my solution is a full standalone Lua 5.3 program, because command line arguments are always accessible as a top-level vararg Nov 11, 2019 at 13:26
• @PhilipRoman, So what TIO is doing is virtually running a command line Lua 'shell' and passing in the arguments appropriately? Interesting.... Nov 11, 2019 at 14:09
• @PhilipRoman, I assumed naturally that that's what you were doing. I was pondering how TIO did it. Somehow they have to emulate "lua myscript.lua a z". Nov 11, 2019 at 14:23
• @ouflak Ah, sorry, I misunderstood you. Yeah, the fact that TIO shows the time taken just like the linux "time" command, seems to indicate that there is indeed a real shell involved. Nov 11, 2019 at 14:26

# MarioLANG, 63 bytes

,
)
,
>[!(>[!
"=#="=#
- ( >
) ( + -
!+< ) [
#=" !-<)
#=".


Try it online!

Super golfable, I'm sure - not really able to think in MarioLANG yet. Calculates $$\\lfloor\frac{x+y}{2}\rfloor\$$.

# Zsh, 33 31 characters

a=({$1..$2} 0)
echo ${a[$#a/2]}


This one does no character code conversion.

Sample run:

manatwork ~ % set -- A C

manatwork ~ % a=({$1..$2} 0);echo ${a[$#a/2]}
B


Try it online!

• Very clever use of brace expansion! I managed 27 bytes in a more boring way :) Dec 8, 2020 at 14:47

# Forth (gforth), 15 bytes

: f + 2/ emit ;


Try it online!

### Code Explanation

: f      \ start a new word definition
+      \ add top two stack arguments
2/     \ divide top stack value by 2
emit   \ output char of resulting ascii value
;        \ end word definition

• The input requires char, e.g. char a char c f would output b.
– agc
Nov 12, 2019 at 21:46
• More usable version: : g char char + 2/ cr emit ;, run like g e B, (outputs S), etc. Note that it doesn't seem to matter which order the arguments are in, so g B e also outputs S.
– agc
Nov 12, 2019 at 21:51
• @agc In gforth ' will also work, so 'a 'b f would also output b and looks much more similar to other languages Nov 13, 2019 at 13:41

# K4, 9 8 bytes

Solution:

10h$_avg  Examples: q)k)10h$_avg"AC"
"B"
q)k)10h$_avg"az" "m" q)k)10h$_avg"dj"
"g"


Explanation:

Unfortunately the space is needed. Turns out the space isn't necessary!

10h$_avg / the solution avg / calculate mean _ / floor 10h$     / cast to char


Bonus:

• 10h$-256+avg for a 12 byte Q version (more/less hacky than 10h$(_)avg for 10)

# Hexagony, 14 13 bytes

|*;:2@+/',{,|


Try it online! Linear control flow: ,{,'+{*2':;@

I decide to plug it in the Hexagony brute forcer program, and it can't find a 12-byte program. At least for that specific linear code.

Other possible linear control flows:

,{,'+'2=':;@
,{,'+'2{=:;@
,},"+{*2':;@
,},"+'2=':;@
,},"+'2{=:;@
,{,'+{+2':;@


(none of them results in a 12-byte solution (there are only some non-halting 12-byte solutions); nevertheless, the brute force program has room for improvement.)

• That's one horrific control flow D: Jan 27, 2021 at 3:25

# Perl 5, 31 30 bytes

$x+=ord for@ARGV;print chr$x>>1


Try it online!

Shortened to 30 bytes thanks to comment by Dadsdy

• Welcome to Code Golf, and nice answer! Apr 8, 2022 at 20:09
• Can't you replace the >>1 with /2? Jun 8 at 6:03

# Red, 18 bytes

func[a][average a]


Try it online!

Takes the input as a list of two letters.

If this is not acceptable:

# Red, 20 bytes

func[a b][a + b / 2]


Try it online!

• So Red's default behavior is to do the conversion to numbers and then back to letter for the output? Nov 9, 2019 at 19:28
• @Jonah The type of the result is implied by the first argument. #"A" + 1 is #"B"; 1 + #"A" is 66 Nov 9, 2019 at 19:33
• @Jonah From the documentation: "The full range of mathematical functions can be used with char! values. A Math Error is raised if the result of the arithmetic falls outside of the range 00 - 10FFFF (hexadecimal)." Nov 9, 2019 at 19:39

# MATL, 3 bytes

Ymc


Try it online!

### Explanation

Ym   % Implicit input: string of two letters. Implicitly convert to ASCII, and take mean
c    % Implicitly round down, and convert to char
% Implicit display

• It's fun to stay at the... Nov 9, 2019 at 16:02

# Runic Enchantments, 7 bytes

ii+2,k@


Try it online!

Input is space sepatrated. Use invalid inputs at your own peril.