Eu vim com dois que levam seus valores de STDIN, que são baseados na resposta do Perl 5.
lines~~/(.*).*' '$0/;say ~$0
lines~~/:s(.*).* $0/;say ~$0
O primeiro requer exatamente um espaço entre as entradas, enquanto o outro requer pelo menos um caractere de espaço em branco entre as entradas.
Isso é um pouco menor do que a primeira coisa que tentei, que utiliza os valores da linha de comando.
say [~] map ->($a,$b){$a eq$b&&$a||last},[Z] @*ARGS».comb # 58 bytes
ou mesmo a versão lambda:
{[~] map ->($a,$b){$a eq$b&&$a||last},[Z] @_».comb} # 52 bytes
Embora isso seja muito mais fácil de ajustar para aceitar qualquer número de strings de entrada, ao custo de apenas um toque.
{[~] 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"
.