Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Challenges

Post History

60%
+1 −0
Challenges 5 by 5 knight's tour string validator

Perl 5, 121 bytes Reads a string from stdin. Exits 0 if valid tour, 1 if invalid. perl -ne'map{$h=~y/7-^/<-c/;$h.=q|A8>HL B79?IKM C8:<@FJLN D9;=GMO E:>HN |}1..5;map{exit(1)if$p&&a...

posted 4mo ago by jhnc‭  ·  edited 4mo ago by jhnc‭

Answer
#7: Post edited by user avatar jhnc‭ · 2026-05-27T14:45:55Z (4 months ago)
"not space" is shorter than "not comma" and avoids $_[...] ambiguity as bonus
  • # [Perl 5], 124 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/7-^/<-c/;$h.=q|A8>HL,B79?IKM,C8:<@FJLN,D9;=GMO,E:>HN,|}1..5;map{exit(1)if$p&&$h!~"$_\[^,]*$p";$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # Z[\]^
  • # _`abc
  • # using ABCDE row as examplar, encode lookup data as
  • # comma-terminated list of move followed by valid
  • # previous positions
  • # generate string containing data for all five rows
  • # by repeatedly translating ascii+5
  • map {
  • $h =~ y/7-^/<-c/;
  • $h .= q|A8>HL,B79?IKM,C8:<@FJLN,D9;=GMO,E:>HN,|
  • } 1..5;
  • # walk the moves
  • map {
  • # after first move, do regex match to check if
  • # the actual previous position of current move
  • # is present in the lookup data and abort if not
  • exit(1) if $p && $h !~ "$_\[^,]*$p";
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpo1o19m]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpo1o19m]: https://tio.run/##dZDpbtQwFIX/@ylMMN2URRVUbcfNQPZ9XyYRpaOhZJqR2iTEGQnUTh@dwSkiAiT@@fp@/nSOu6q/P9u/hkNFBliv@qYiBGxJBcn2M4GH1bfNcIgBHeB4hI8Q9SKzXt2T6rphMLxrhxZ@aZsK7sC4GfrtywLc1u1Dh0HXb5phDZk33Nt3BHJzyLBoSX0C5E8EAe8fVt0jqsXn78I5dyNccbcCRjUvfn2SLuamy8rnl@8tx2OVi9nVB912fVa9xKLhBaw2m5s@@7Q75fkzDEbNmO/o9HizRt3BAapfPTNoef3xhv10gjoGo05Ey53AC3fw37YYjAVmv7LSfhhQ@Oh479mKHhWBaoSL1JKdPDE1v4wzV4IzOPYEkpvFpa@ZSe7IVroIDTUoIl2xvd/AX6/@1FHg5Q/BfwSSOxGuJdvhwlf0lKqkIIsN1Sui0tEmwtdVI6YXZlSEtuLSsBRLck@eiDgwnVxNLTdTSt8I5cKzE20hRfpEmHR0E7uQnThQcz3yldJKvdDIJuJH2w2btiF7rvkJ "Perl 5 – Try It Online"
  • # [Perl 5], 121 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/7-^/<-c/;$h.=q|A8>HL B79?IKM C8:<@FJLN D9;=GMO E:>HN |}1..5;map{exit(1)if$p&&$h!~/$_\S*$p/;$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # Z[\]^
  • # _`abc
  • # using ABCDE row as examplar, encode lookup data as
  • # space-terminated list of move followed by valid
  • # previous positions
  • # generate string containing data for all five rows
  • # by repeatedly translating ascii+5
  • map {
  • $h =~ y/7-^/<-c/;
  • $h .= q|A8>HL B79?IKM C8:<@FJLN D9;=GMO E:>HN |
  • } 1..5;
  • # walk the moves
  • map {
  • # after first move, do regex match to check if
  • # the actual previous position of current move
  • # is present in the lookup data and abort if not
  • exit(1) if $p && $h !~ /$_\S*$p/;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpo65pht]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpo65pht]: https://tio.run/##dZDpTttAFIX/z1PcBpdNtS1UEBDjtN638b7EllCjlDo4Etiux5FaQXh00jEVFq3Ev7lzv/l0zrRld3e224O@JD1Uy64uCUEbUgLZfCdwUP5a9wcCogMMR3gAphMnq@UdKa/riQC3Td/Aj6YuYYuGTd9tXhbopmruWwG13bruVzD5yH4@JcDOYPKJWVAfD9wxzwu7@2X7wFTi02/@nP3GX7E3vMBUnPjzUbqYmRjk88svluOCcjG9@qrb2AP1UhAN1wdtOjM9eNyecNyZgAbNkO/w5Gi9Ytr9fab68MQzi@v4mGmpshWZxZbn@Nv/mwpoCD/9m5N2ExBlD492rq3oYe6rRjBPLNnJYlPziijFEkxh6IgknEaFp5lx5shWMg8M1c9DXbHdV@CfV291FHj5P/SOQMIjgS3ZDuaeoidUJflpZKhuHhaONhKerhoRvTDDPLAVTMNSLM5ceSQi33QyNbFwqhSeEci5a8faXAr1kTDpiGM7l53IVzM99JTCStzASEfiuWn7dVOTHVv/AQ "Perl 5 – Try It Online"
#6: Post edited by user avatar jhnc‭ · 2026-05-27T12:40:05Z (4 months ago)
using delimited list gives simpler translation and regex by avoiding uc/lc issue
  • # [Perl 5], 130 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/a-y7-Y/f-~<-Y./;$h.=q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|}1..5;map{exit(1)if$p&&$h!~(lc."[^a-z]*$p");$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board upward:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # using ABCDE row as examplar, encode lookup data as lowercase
  • # move followed by "uppercase" valid previous positions
  • # generate a lookup string containing data for all five rows
  • # by repeatedly translating ascii+5
  • # to avoid running into the lowercase ascii letter range,
  • # everything above "Y" is just translated to "."
  • map {
  • $h =~ y/a-y7-Y/f-~<-Y./;
  • $h .= q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|
  • } 1..5;
  • # walk the moves
  • map {
  • # after first move, check if actual previous position
  • # of current move is present in the lookup data
  • # and abort if not
  • exit(1) if $p && $h!~(lc."[^a-z]*$p");
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpo06zyg]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpo06zyg]: https://tio.run/##dZDpTttAFIX/z1NMjQsJqm0hQEAGp/US7/sWW12QCQ6OFGzjcaRSSB696ZiqVqnUf3PnfvPpnGmKdn2@P4BdgTtY5m1VYAw2uIB4c4vhUfF91R0hQAbYH@EzpFueWuZrXHypKATv666Gd3VVwC3oN127eV2ARVk/NAg07arqlpB6z5yeYchMIfWBviE@DrLHHIf2D3nzTJf87onLmacLJuOWzO6ayVgO0SXLP77kl1PNur24@qib9uJycv1JMSzn7grxqu0Wk6nmvGxPWPYcgV7UJxydjFdLujk8pMt3u9F6wVKfv@XMj6/HdEONEd3w9M2WY7n7fysj0LeY/A5MSiJA2NF4bxuS4qeurHrzSBfNJNRmThbElgAnsC8LBCsOMmemhYkp6tHcU2U39RXJsP8Ab179rSPA60eC/wgEayAsXTS8uSMpEVEJbhyosp36mTkbCEeR1YBcaH7qGZJFwhIsTGxxIAJXMxM50q1YyhzVE1PbCGdzwVcGQiOjFRqpaAaunCi@I2V6ZHtqPBA/66Zb1RXeM9Uv "Perl 5 – Try It Online"
  • # [Perl 5], 124 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/7-^/<-c/;$h.=q|A8>HL,B79?IKM,C8:<@FJLN,D9;=GMO,E:>HN,|}1..5;map{exit(1)if$p&&$h!~"$_\[^,]*$p";$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # Z[\]^
  • # _`abc
  • # using ABCDE row as examplar, encode lookup data as
  • # comma-terminated list of move followed by valid
  • # previous positions
  • # generate string containing data for all five rows
  • # by repeatedly translating ascii+5
  • map {
  • $h =~ y/7-^/<-c/;
  • $h .= q|A8>HL,B79?IKM,C8:<@FJLN,D9;=GMO,E:>HN,|
  • } 1..5;
  • # walk the moves
  • map {
  • # after first move, do regex match to check if
  • # the actual previous position of current move
  • # is present in the lookup data and abort if not
  • exit(1) if $p && $h !~ "$_\[^,]*$p";
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpo1o19m]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpo1o19m]: https://tio.run/##dZDpbtQwFIX/@ylMMN2URRVUbcfNQPZ9XyYRpaOhZJqR2iTEGQnUTh@dwSkiAiT@@fp@/nSOu6q/P9u/hkNFBliv@qYiBGxJBcn2M4GH1bfNcIgBHeB4hI8Q9SKzXt2T6rphMLxrhxZ@aZsK7sC4GfrtywLc1u1Dh0HXb5phDZk33Nt3BHJzyLBoSX0C5E8EAe8fVt0jqsXn78I5dyNccbcCRjUvfn2SLuamy8rnl@8tx2OVi9nVB912fVa9xKLhBaw2m5s@@7Q75fkzDEbNmO/o9HizRt3BAapfPTNoef3xhv10gjoGo05Ey53AC3fw37YYjAVmv7LSfhhQ@Oh479mKHhWBaoSL1JKdPDE1v4wzV4IzOPYEkpvFpa@ZSe7IVroIDTUoIl2xvd/AX6/@1FHg5Q/BfwSSOxGuJdvhwlf0lKqkIIsN1Sui0tEmwtdVI6YXZlSEtuLSsBRLck@eiDgwnVxNLTdTSt8I5cKzE20hRfpEmHR0E7uQnThQcz3yldJKvdDIJuJH2w2btiF7rvkJ "Perl 5 – Try It Online"
#5: Post edited by user avatar jhnc‭ · 2026-05-27T12:06:10Z (4 months ago)
regex match is inefficient but needs fewer characters than building a hash
  • # [Perl 5], 144 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/a-y7-Y/f-~<-Y./;$h.=q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|}1..5;%h=$h=~/[^a-z]+|./g;map{exit(1)if$p&&$h{lc$_}!~/$p/;$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board upward:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # using ABCDE row as examplar, encoded as lowercase move
  • # followed by "uppercase" valid previous positions,
  • # generate all five rows by repeatedly translating ascii+5
  • # to avoid running into the lowercase ascii letter range,
  • # everything above "Y" is just translated to "."
  • map {
  • $h =~ y/a-y7-Y/f-~<-Y./;
  • $h .= q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|
  • } 1..5;
  • # initialise lookup table by splitting the string
  • %h = $h =~ /[^a-z]+|./g;
  • # walk the moves
  • map {
  • # after first move, look up valid previous positions
  • # of current move and abort if actual previous
  • # position is not listed
  • exit(1) if $p && $h{lc$_} !~ /$p/;
  • $p=$_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpnpqx2u]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpnpqx2u]: https://tio.run/##dZBZb9NAFIXf/SuG4G6APaqgapupA17idbwvscVSualTR0pt43EkSpafThgXYQESb3PmfnPuOdMU7eri8BJ0BelAmbdVQQizJgUg6zsCTopvy@4EMVSA/gg2gG2F0SJfkeJTNULgoe5qcF9XBdgx/aRr188DZl7Wjw1imnZZdQswOuLeviOAm4DRG/aW@kHAv4IQHR7zZsOWwv4J5tzTJZfBBbe/4TIeIrbkha/b/Gqi47vL6/eGZc@vxjcfVBM799dI0Gy3GE90Z7s75/kLdFQKvQ38@CXnvn9@veXhA@q9@9Cn52fLBdscH7PlZjVnb3cv9pBt6IZGoAJS9N/@iOkrjX@lp40RQ9nTs4NtyqqfuormzSJDspJQnzpZEGMRjEHfnBFxHGTOVA8TSzKimacpbuqrsmn/Bv569acdBZ5/lfmPgYgHAhuS6c0cWY2olejGgabYqZ9Z04FwVEUL6IXup54pYxqWYmFiSwMRuLqVKJGBYzlzNE9KbTOczkRfHQidShyaqWQFrpKoviNnRmR7WjwQP@qmW9YVOXDVTw "Perl 5 – Try It Online"
  • # [Perl 5], 130 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/a-y7-Y/f-~<-Y./;$h.=q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|}1..5;map{exit(1)if$p&&$h!~(lc."[^a-z]*$p");$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board upward:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # using ABCDE row as examplar, encode lookup data as lowercase
  • # move followed by "uppercase" valid previous positions
  • # generate a lookup string containing data for all five rows
  • # by repeatedly translating ascii+5
  • # to avoid running into the lowercase ascii letter range,
  • # everything above "Y" is just translated to "."
  • map {
  • $h =~ y/a-y7-Y/f-~<-Y./;
  • $h .= q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|
  • } 1..5;
  • # walk the moves
  • map {
  • # after first move, check if actual previous position
  • # of current move is present in the lookup data
  • # and abort if not
  • exit(1) if $p && $h!~(lc."[^a-z]*$p");
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpo06zyg]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpo06zyg]: https://tio.run/##dZDpTttAFIX/z1NMjQsJqm0hQEAGp/US7/sWW12QCQ6OFGzjcaRSSB696ZiqVqnUf3PnfvPpnGmKdn2@P4BdgTtY5m1VYAw2uIB4c4vhUfF91R0hQAbYH@EzpFueWuZrXHypKATv666Gd3VVwC3oN127eV2ARVk/NAg07arqlpB6z5yeYchMIfWBviE@DrLHHIf2D3nzTJf87onLmacLJuOWzO6ayVgO0SXLP77kl1PNur24@qib9uJycv1JMSzn7grxqu0Wk6nmvGxPWPYcgV7UJxydjFdLujk8pMt3u9F6wVKfv@XMj6/HdEONEd3w9M2WY7n7fysj0LeY/A5MSiJA2NF4bxuS4qeurHrzSBfNJNRmThbElgAnsC8LBCsOMmemhYkp6tHcU2U39RXJsP8Ab179rSPA60eC/wgEayAsXTS8uSMpEVEJbhyosp36mTkbCEeR1YBcaH7qGZJFwhIsTGxxIAJXMxM50q1YyhzVE1PbCGdzwVcGQiOjFRqpaAaunCi@I2V6ZHtqPBA/66Zb1RXeM9Uv "Perl 5 – Try It Online"
#4: Post edited by user avatar jhnc‭ · 2026-05-27T07:13:37Z (4 months ago)
code to generate previous position data is shorter than using raw data
  • # [Perl 5], 189 bytes
  • Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.
  • ```
  • perl -ne'%h=AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/[a-z]+|./g;map{exit(1)if$p&&$h{$_}!~/$p/i;$p=$_}/./g'
  • ```
  • ```
  • perl -ne'
  • # initialise lookup table of valid previous moves
  • # by splitting a bare string
  • %h =
  • AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
  • =~ /[a-z]+|./g;
  • # walk the moves
  • # after first move, lookup valid previous positions for the move
  • # and abort if actual previous position is not listed
  • map {
  • exit(1) if $p && $h{$_} !~ /$p/i;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpmwuwn0]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpmwuwn0]: https://tio.run/##dZFZb9NAFIXf/SuG4G5AalXAS60geYn3fYstQJWTeEvssTNjJymh/emESRERIPE2Z@43R/ec6TJUfzy@Bn2Ge1CmCGYYUwPOAB7mGFxl@6q/YikiwOkIDoBGk1Ge1jj7AkcsKNq@BcsWZuCJOk16NLwMqEXZNh1LdaiCfQ5GF@P3HzAYfwKjd/QD8WPA7RuGYY8X5YQra75aN0K@qqFYNO20hNKi2chL2CElzdbtBqvzGvXaosH6vERbI11UeNiZ82W@6vrt3lpkxWb3aC9LtHeKZufmJdx7RbVuh0e/XNXboGp2YY2idYNnNez6uGk3CUSTZ@ZzOv729e33W6Zgm7Q7nCJe391UOd1dXtLlgX54evXM0B1TsXQ3IYoh5L9lsdQp//2vqKQeliLs9c3R1ATJjW1RdmaByuuRr0ytxAsNDtyDU00UZ4ReYk0VP9J5NZg5smjHriRo5m/gr1d/2hHg5Quo/xhwxpkwVF5zZpYgBcSKs0NPFs3YTfTpmbAkUfbIheLGjiYYZFmC@ZHJnwnPVvRIDFQjFBJLdvjY1PzpjHOlM6EQafhazOueLUaSawmJGpiOHJ6JH23XVy3ExzH8CQ "Perl 5 – Try It Online"
  • # [Perl 5], 144 bytes
  • Reads a string from stdin. Exits 0 if valid tour, 1 if invalid.
  • ```
  • perl -ne'map{$h=~y/a-y7-Y/f-~<-Y./;$h.=q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|}1..5;%h=$h=~/[^a-z]+|./g;map{exit(1)if$p&&$h{lc$_}!~/$p/;$p=$_}/./g'
  • ```
  • ```
  • echo 'ALURYNEHSVKBITWPGDOXQFCJM' | perl -ne'
  • # extend board upward:
  • # 789:;
  • # <=>?@
  • # ABCDE
  • # FGHIJ
  • # KLMNO
  • # PQRST
  • # UVWXY
  • # using ABCDE row as examplar, encoded as lowercase move
  • # followed by "uppercase" valid previous positions,
  • # generate all five rows by repeatedly translating ascii+5
  • # to avoid running into the lowercase ascii letter range,
  • # everything above "Y" is just translated to "."
  • map {
  • $h =~ y/a-y7-Y/f-~<-Y./;
  • $h .= q|a8>HLb79?IKMc8:<@FJLNd9;=GMOe:>HN|
  • } 1..5;
  • # initialise lookup table by splitting the string
  • %h = $h =~ /[^a-z]+|./g;
  • # walk the moves
  • map {
  • # after first move, look up valid previous positions
  • # of current move and abort if actual previous
  • # position is not listed
  • exit(1) if $p && $h{lc$_} !~ /$p/;
  • $p=$_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpnpqx2u]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpnpqx2u]: https://tio.run/##dZBZb9NAFIXf/SuG4G6APaqgapupA17idbwvscVSualTR0pt43EkSpafThgXYQESb3PmfnPuOdMU7eri8BJ0BelAmbdVQQizJgUg6zsCTopvy@4EMVSA/gg2gG2F0SJfkeJTNULgoe5qcF9XBdgx/aRr188DZl7Wjw1imnZZdQswOuLeviOAm4DRG/aW@kHAv4IQHR7zZsOWwv4J5tzTJZfBBbe/4TIeIrbkha/b/Gqi47vL6/eGZc@vxjcfVBM799dI0Gy3GE90Z7s75/kLdFQKvQ38@CXnvn9@veXhA@q9@9Cn52fLBdscH7PlZjVnb3cv9pBt6IZGoAJS9N/@iOkrjX@lp40RQ9nTs4NtyqqfuormzSJDspJQnzpZEGMRjEHfnBFxHGTOVA8TSzKimacpbuqrsmn/Bv569acdBZ5/lfmPgYgHAhuS6c0cWY2olejGgabYqZ9Z04FwVEUL6IXup54pYxqWYmFiSwMRuLqVKJGBYzlzNE9KbTOczkRfHQidShyaqWQFrpKoviNnRmR7WjwQP@qmW9YVOXDVTw "Perl 5 – Try It Online"
#3: Post edited by user avatar jhnc‭ · 2026-05-26T17:32:39Z (4 months ago)
case-insensitive match obviates mapping lookup values to uppercase
  • # [Perl 5], 195 bytes
  • Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.
  • ```
  • perl -ne'%h=map{uc}AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/[a-z]+|./g;map{exit(1)if$p&&$h{$_}!~/$p/;$p=$_}/./g'
  • ```
  • ```
  • perl -ne'
  • # initialise lookup table of valid previous moves
  • # by splitting a bare string
  • %h = map {uc}
  • AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
  • =~ /[a-z]+|./g;
  • # walk the moves
  • # after first move, lookup valid previous positions for the move
  • # and abort if actual previous position is not listed
  • map {
  • exit(1) if $p && $h{$_} !~ /$p/;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpmwm0vl]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpmwm0vl]: https://tio.run/##dZFZb9NAFIXf/SuG4G5AalXAS60geYn3fYstQJXjeEvsseOxk5TQ/nTCuIgIkHibM/e7R/ee26Zd9fH0GvQp6kERdzBFiBhQCtCwROAqPZT9FU1gAcYnOAKym02yuELpFzihQd70DVg1MAVPxFjpu@GlQCRFU7c00XYl7DMwuZi@/4DA9BOYvCMfsB8Fbt9QFH26KGZ13B6H5IkpKrbc1Fy2riCf1828gEJSb8UVbDspTjfNFsnLquuVpEbqsuh2WpyUaNjry1W2bvvdwUjSfLt/NFdFd7Dyem9nBTw4eblphke3WFc7r6z3ftUFmxotKtj2Yd1sI9jNnqnP8fTb17ffb6mcHqcZN72@uykzsr28JIsj@fD06pkiW4om2xkWFAb/jYwmxhTufy2MQ6IJzF7fnHSFE@zQ5EVr4cmsGrjS3IgcX2PAPRjDIhjNdyJjLrmBysrewhJ5M7QFTtF/A391/WmHgZdDEP8xYLQzocmsYi0MTvCwFWP6jsjroR2p8zNhCLzo4A/JDi2F0/CwGHMDnT0TjimpAe/Jms9Fhmixoa648wVjC2dCwlJzlZBVHZMPBNvgItnTLdE/Ez@ati8biE5T@BM "Perl 5 – Try It Online"
  • # [Perl 5], 189 bytes
  • Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.
  • ```
  • perl -ne'%h=AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/[a-z]+|./g;map{exit(1)if$p&&$h{$_}!~/$p/i;$p=$_}/./g'
  • ```
  • ```
  • perl -ne'
  • # initialise lookup table of valid previous moves
  • # by splitting a bare string
  • %h =
  • AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
  • =~ /[a-z]+|./g;
  • # walk the moves
  • # after first move, lookup valid previous positions for the move
  • # and abort if actual previous position is not listed
  • map {
  • exit(1) if $p && $h{$_} !~ /$p/i;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpmwuwn0]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpmwuwn0]: https://tio.run/##dZFZb9NAFIXf/SuG4G5AalXAS60geYn3fYstQJWTeEvssTNjJymh/emESRERIPE2Z@43R/ec6TJUfzy@Bn2Ge1CmCGYYUwPOAB7mGFxl@6q/YikiwOkIDoBGk1Ge1jj7AkcsKNq@BcsWZuCJOk16NLwMqEXZNh1LdaiCfQ5GF@P3HzAYfwKjd/QD8WPA7RuGYY8X5YQra75aN0K@qqFYNO20hNKi2chL2CElzdbtBqvzGvXaosH6vERbI11UeNiZ82W@6vrt3lpkxWb3aC9LtHeKZufmJdx7RbVuh0e/XNXboGp2YY2idYNnNez6uGk3CUSTZ@ZzOv729e33W6Zgm7Q7nCJe391UOd1dXtLlgX54evXM0B1TsXQ3IYoh5L9lsdQp//2vqKQeliLs9c3R1ATJjW1RdmaByuuRr0ytxAsNDtyDU00UZ4ReYk0VP9J5NZg5smjHriRo5m/gr1d/2hHg5Quo/xhwxpkwVF5zZpYgBcSKs0NPFs3YTfTpmbAkUfbIheLGjiYYZFmC@ZHJnwnPVvRIDFQjFBJLdvjY1PzpjHOlM6EQafhazOueLUaSawmJGpiOHJ6JH23XVy3ExzH8CQ "Perl 5 – Try It Online"
#2: Post edited by user avatar jhnc‭ · 2026-05-26T17:26:44Z (4 months ago)
better lookup table splitting regex avoids while loop
  • # [Perl 5], 206 bytes
  • Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.
  • ```
  • perl -ne'$h{$1}=uc$2while AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/(.)([^A-Z]+)/g;map{exit(1)if$p&&$h{$_}!~/$p/;$p=$_}/./g'
  • ```
  • ```
  • perl -ne'
  • # initialise lookup table of valid previous moves
  • # by splitting a bare string
  • $h{$1} = uc $2 while
  • AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
  • =~ /(.)([^A-Z]+)/g;
  • # walk the moves
  • # after first move, lookup valid previous positions for the move
  • # and abort if actual previous position is not listed
  • map {
  • exit(1) if $p && $h{$_} !~ /$p/;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpmvbmtx]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpmvbmtx]: https://tio.run/##dZFpj5pQFIa/8ytuLZ3Rtkqmy5chNmGRfd@EbhNFNoULckGdGOen18I0JW2TfrvvPc95c857qqjOP15fgiZCDUhXNYwQwloUAdSuEbiNTllzS2KdAP0TnAFez0fxKkfRVzgiQVI2JdiUMAIXrK80dftcwMK0LCoSq@oMNjEYvZq@/4DA9BMYvcUfOj8CzF4TBHnF0zN@d5m3If7umGZ5BKg0p7NdwcTbHLJJUS5SyIXFnt/AqhZW0a7cI3Gd140UFkhep/VBWYUZao/qehNvq@Zw0sIo2R8f9U1an4ykOJpxCk9Wku3K9tFOt/nByYqjm9ferkDLHFaNX5T7ANbzJ2I8m4y/fKemn7@9mRAJWayqc7/0@G6SxXh1c9MP@3B58UTgFUHi1bwTxIxI/k2PxPpA7n/t3uVFYh07nlxVieFMX2d5Y@mItOzZwkILLFehwD3oc8MoxbUCbSHYnkyLztLgWd03OUZSfwN/df1p1wHPN8H@Y0ApA6GItGQsNYZzOitKdy2eVX0zkBcDoXEsb3UfgukbEqN0w3aY7an0QFi6IHusIyouE2i8QfuqZC@WlMkNhNBJxZZ8WrZ01uNMjQlERzV4dyB@lFWTlRBdp/An "Perl 5 – Try It Online"
  • # [Perl 5], 195 bytes
  • Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.
  • ```
  • perl -ne'%h=map{uc}AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/[a-z]+|./g;map{exit(1)if$p&&$h{$_}!~/$p/;$p=$_}/./g'
  • ```
  • ```
  • perl -ne'
  • # initialise lookup table of valid previous moves
  • # by splitting a bare string
  • %h = map {uc}
  • AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
  • =~ /[a-z]+|./g;
  • # walk the moves
  • # after first move, lookup valid previous positions for the move
  • # and abort if actual previous position is not listed
  • map {
  • exit(1) if $p && $h{$_} !~ /$p/;
  • $p = $_
  • } /./g
  • # if we get here, assume valid and exit(0)
  • '
  • ```
  • [Try it online!][TIO-mpmwm0vl]
  • [Perl 5]: https://www.perl.org/
  • [TIO-mpmwm0vl]: https://tio.run/##dZFZb9NAFIXf/SuG4G5AalXAS60geYn3fYstQJXjeEvsseOxk5TQ/nTCuIgIkHibM/e7R/ee26Zd9fH0GvQp6kERdzBFiBhQCtCwROAqPZT9FU1gAcYnOAKym02yuELpFzihQd70DVg1MAVPxFjpu@GlQCRFU7c00XYl7DMwuZi@/4DA9BOYvCMfsB8Fbt9QFH26KGZ13B6H5IkpKrbc1Fy2riCf1828gEJSb8UVbDspTjfNFsnLquuVpEbqsuh2WpyUaNjry1W2bvvdwUjSfLt/NFdFd7Dyem9nBTw4eblphke3WFc7r6z3ftUFmxotKtj2Yd1sI9jNnqnP8fTb17ffb6mcHqcZN72@uykzsr28JIsj@fD06pkiW4om2xkWFAb/jYwmxhTufy2MQ6IJzF7fnHSFE@zQ5EVr4cmsGrjS3IgcX2PAPRjDIhjNdyJjLrmBysrewhJ5M7QFTtF/A391/WmHgZdDEP8xYLQzocmsYi0MTvCwFWP6jsjroR2p8zNhCLzo4A/JDi2F0/CwGHMDnT0TjimpAe/Jms9Fhmixoa648wVjC2dCwlJzlZBVHZMPBNvgItnTLdE/Ez@ati8biE5T@BM "Perl 5 – Try It Online"
#1: Initial revision by user avatar jhnc‭ · 2026-05-26T17:11:25Z (4 months ago)
# [Perl 5], 206 bytes

Reads a string from stdin. Exits 0 if valid tour; 1 if invalid.

```
perl -ne'$h{$1}=uc$2while AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr=~/(.)([^A-Z]+)/g;map{exit(1)if$p&&$h{$_}!~/$p/;$p=$_}/./g'
```

```
perl -ne'
    # initialise lookup table of valid previous moves
    # by splitting a bare string
    $h{$1} = uc $2 while
        AhlBikmCfjlnDgmoEhnFcmqGdnprHaekoqsIblrtJcmsKbhrvLacisuwMbdfjptvxNcegqwyOdhrxPgmwQfhnxRgikouyShjlvTimwUlrVkmsWlnptXmoqYnr
            =~ /(.)([^A-Z]+)/g;

    # walk the moves
    # after first move, lookup valid previous positions for the move
    #     and abort if actual previous position is not listed
    map {
        exit(1) if $p && $h{$_} !~ /$p/;
        $p = $_
    } /./g

    # if we get here, assume valid and exit(0)
'
```

[Try it online!][TIO-mpmvbmtx]

[Perl 5]: https://www.perl.org/
[TIO-mpmvbmtx]: https://tio.run/##dZFpj5pQFIa/8ytuLZ3Rtkqmy5chNmGRfd@EbhNFNoULckGdGOen18I0JW2TfrvvPc95c857qqjOP15fgiZCDUhXNYwQwloUAdSuEbiNTllzS2KdAP0TnAFez0fxKkfRVzgiQVI2JdiUMAIXrK80dftcwMK0LCoSq@oMNjEYvZq@/4DA9BMYvcUfOj8CzF4TBHnF0zN@d5m3If7umGZ5BKg0p7NdwcTbHLJJUS5SyIXFnt/AqhZW0a7cI3Gd140UFkhep/VBWYUZao/qehNvq@Zw0sIo2R8f9U1an4ykOJpxCk9Wku3K9tFOt/nByYqjm9ferkDLHFaNX5T7ANbzJ2I8m4y/fKemn7@9mRAJWayqc7/0@G6SxXh1c9MP@3B58UTgFUHi1bwTxIxI/k2PxPpA7n/t3uVFYh07nlxVieFMX2d5Y@mItOzZwkILLFehwD3oc8MoxbUCbSHYnkyLztLgWd03OUZSfwN/df1p1wHPN8H@Y0ApA6GItGQsNYZzOitKdy2eVX0zkBcDoXEsb3UfgukbEqN0w3aY7an0QFi6IHusIyouE2i8QfuqZC@WlMkNhNBJxZZ8WrZ01uNMjQlERzV4dyB@lFWTlRBdp/An "Perl 5 – Try It Online"