Je ne résiste pas à la réintroduction de split juste pour faire plus aisément la validation du fichier en entrée. Par contre, pas de commande connue qui nous serait utile dans la résolution... Du coup on peut sortir son langage de scripting favori, bien la chose ne soit pas insurmontable malgré l'absence de tableau/liste en POSIX shell (je sais, il y a set qui est très contraignant comparé aux tableaux dans (k|ba|z)sh si on veut rester dans du shell.)
#!/bin/sh# 1ドル: input file# 2ドル: split prefixfor c in 'cut''grep''tail''test'doif ! command -v "$c" >/dev/null
thenecho"Error: command '$c' not found" >&2exit3fidoneiftest -z "1ドル"thenecho"Please call me with an input file..." >&2exit1fi_if="1ドル"_sp=${2:-x}# Split Prefix
split -p '^( *[0-9])* *$' -a 1"$_if""$_sp"||exit4_bf="Found invalid line, check the file!"# Bad File messageiftest$( ls -1 "$_sp"? | wc -l ) -ne 3thenecho"$_bf a" >&2exit2fiif grep -Eqsv '^( *\[[A-Z]\])+ *$'"$_sp"a
thenecho"$_bf b" >&2exit2fiif tail -n+2 "$_sp"c | grep -Eqsv '^move [0-9]+ from [1-9] to [1-9]$'thenecho"$_bf c" >&2exit2fiunset _bf
_nc=0# Number of stacks/Columnsfor i in $( cat "$_sp"b )do_nc=$idone_cc=2# Column Counter_sl=''# Stacks Listwhiletest$_nc -ne 0do_sl="$_sl$( cut -c "$_cc""$_sp"a | tr -d ' \n')"_nc=$(( _nc -1))_cc=$(( _cc +4))doneecho"$_sl"#debug# Stack Stard# Stack End# Cranes Count# trashed Word #
tail -n +2 "${_sp}c"|whileread -r _w1 _cc _w2 _ss _w3 _se
do#echo "$_ss→$_se:" #debugwhiletest$_cc -ne 0do_nl=''# New List_nc=1# New Counter_cm=''# Crane Movedfor j in $_sldoiftest$_nc -ne $_ssthen_nl="$_nl$j"else_cm=$(echo"$j"| cut -c 1)iftest${#j} -ne 1then_nl="$_nl$(echo"$j"| cut -c 2- )"else_nl="$_nl -"fifi_nc=$(( _nc +1))done_sl=$_nl_nl=''# New List_nc=1# New Counterfor k in $_sldoiftest$_nc -ne $_sethen_nl="$_nl$k"elseiftest$k='-'then_nl="$_nl$_cm"else_nl="$_nl$_cm$k"fifi_nc=$(( _nc +1))done_sl=$_nl_cc=$(( _cc -1))doneecho"$_sl"done
Bien, le tube crée un processus fils avec des variables qui lui sont locales... (i.e. la variable globale $_sl n'est pas modifiée...) Il y a des solutions à cela, mais c'est un plaisir de suivre le travail de la grue avec un truc vite fait d'une part
NZ DCM P
DNZ CM P
- CM ZNDP
MC - ZNDP
C M ZNDP
...et s'il fallait y passer du temps (plus d'un quart d'heure) et de l'énergie d'autre part, on pouvait directement partir sur un langage de programmation.
"It is seldom that liberty of any kind is lost all at once." ― David Hume
# un peu de shell
Posté par Gil Cot ✔ (site web personnel, Mastodon) . En réponse au message Avent du Code, jour 5. Évalué à 1.
Je ne résiste pas à la réintroduction de
splitjuste pour faire plus aisément la validation du fichier en entrée. Par contre, pas de commande connue qui nous serait utile dans la résolution... Du coup on peut sortir son langage de scripting favori, bien la chose ne soit pas insurmontable malgré l'absence de tableau/liste en POSIX shell (je sais, il y asetqui est très contraignant comparé aux tableaux dans(k|ba|z)shsi on veut rester dans du shell.)Bien, le tube crée un processus fils avec des variables qui lui sont locales... (i.e. la variable globale
$_sln'est pas modifiée...) Il y a des solutions à cela, mais c'est un plaisir de suivre le travail de la grue avec un truc vite fait d'une part...et s'il fallait y passer du temps (plus d'un quart d'heure) et de l'énergie d'autre part, on pouvait directement partir sur un langage de programmation.
"It is seldom that liberty of any kind is lost all at once." ― David Hume