Se me ocurrieron dos que toman sus valores de STDIN que se basan en la respuesta de Perl 5.
lines~~/(.*).*' '$0/;say ~$0
lines~~/:s(.*).* $0/;say ~$0
El primero requiere exactamente un espacio entre las entradas, mientras que el otro requiere al menos un espacio en blanco entre las entradas.
Eso es bastante más corto que lo primero que probé, que toma los valores de la línea de comando.
say [~] map ->($a,$b){$a eq$b&&$a||last},[Z] @*ARGS».comb # 58 bytes
o incluso la versión lambda de la misma:
{[~] map ->($a,$b){$a eq$b&&$a||last},[Z] @_».comb} # 52 bytes
Aunque esto es mucho más fácil de ajustar para que acepte cualquier número de cadenas de entrada, a costa de un solo trazo.
{[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb} # 53 bytes
# ┗━┛ ┗━━━━━━━┛ ┗━━━┛
my &common-prefix = {[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb}
say common-prefix <department depart>; # "depart"
say common-prefix; # ""
say common-prefix <department depart depot deprecated dependant>; # "dep"
# This code does not work directly with a single argument, so you have
# to give it an itemized List or Array, containing a single element.
say common-prefix $('department',); # "department"
# another option would be to replace `@_` with `(@_,)`
"aca", "aba"
.