Subleq: Difference between revisions

Content added Content deleted
m (→‎{{header|Ruby}}: mild idiomaticity adjustment)
(→‎bash: lowercase non-env vars; take advantage of arithmetic contexts; use printf instead of echo)
Line 3,086: Line 3,086:
</lang>
</lang>
===bash===
===bash===
<lang bash>#!/bin/sh
<lang bash>#!/usr/bin/env bash


mem=(15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1 72 101 108 108 111 44 32 119 111 114 108 100 33 10 0 )
mem=(15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1
72 101 108 108 111 44 32 119 111 114 108 100 33 10 0)


ADDR=0
addr=0
STEP=0
step=0


while [[ $((STEP++ )) -lt 300 ]]
while (( addr >= 0 )); do
(( step++ ))
do
A=${mem[$ADDR]}
a=${mem[addr]}
B=${mem[(($ADDR + 1))]}
b=${mem[addr + 1]}
C=${mem[(($ADDR + 2))]}
c=${mem[addr + 2]}
ADDR=$((ADDR + 3))
(( addr += 3 ))
if [[ $B -lt 0 ]]; then
if (( b < 0 )); then
printf '%b' '\x'$(printf '%x' ${mem[$A]})
printf '%b' '\x'$(printf '%x' ${mem[a]})
else
else
mem[$B]=$((${mem[$B]} - ${mem[$A]}))
if (( (mem[b] -= mem[a]) <= 0 )); then
addr=$c
if [[ ${mem[$B]} -le 0 ]]; then
if [[ $C -eq -1 ]]; then
echo "Total step:"$STEP
exit 0
fi
ADDR=$C
fi
fi
fi
fi
done
done
echo "Total step:"$STEP
printf 'Total step:%d\n' "$step"
</lang>
</lang>