I have an excercise where I need to sum together every digit up until a given number like this:
Suppose I have the number 12, I need to do 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2.
(numbers past 9 are split up into their separate digits eg. 11 = 1 1, 234 = 2 3 4, etc.)
I know I can just use:
seq -s '' 12
which outputs 123456789101112 and then add them all together with ' ' in between and then pipe to 'bc' BUT I have to specifically do :
echo 12 | ...
as the first step (because the online IDE fills it in as the unchangeable first step for every testcase) and when I do this I start to have problems with seq
I tried
echo 12 | seq -s '' $1
### or just ###
echo 12 | seq -s ''
but can't get it to work as this just gives back a missing operand error for seq (because I'm in the terminal, not a script and the '12' isn't just assigned to $1 I assume), any recommendations on how to avoid it or how to get seq to interpret the 12 from echo as operand or alternative ways to go?
CodePudding user response:
Or
echo 12 | { echo $(( $({ seq -s '' $(< /dev/stdin); echo; } | sed -E 's/([[:digit:]])/\1 /g; s/$/0/') )); }
without sed
:
d=$(echo 12 | { seq -s '' $(< /dev/stdin); echo; }); echo $(( "${d//?/& }0" ))
CodePudding user response:
seq -s '' $(< /dev/stdin)
full solution:
echo "12" | seq -s '' $(< /dev/stdin) | sed 's/./& /g; s/$/0/' | bc
CodePudding user response:
echo 12 | awk '{
cnt=0
for(i=1;i<=$1;i ) {
cnt =i
printf("%s%s",i,i<$1?" ":"=")
}
print cnt
}'
Prints:
1 2 3 4 5 6 7 8 9 10 11 12=78
If it is supposed to be just the digits added up:
echo 12 | awk '{s=""
for(i=1;i<=$1;i ) s=s i
split(s,ch,"")
for(i=1;i<=length(ch); i ) cnt =ch[i]
print cnt
}'
51
Or a POSIX pipeline:
$ echo 12 | seq -s '' "$(cat)" | sed -E 's/([0-9])/\1 /g; s/$/0/' | bc
51