-
Star
(122)
You must be signed in to star a gist -
Fork
(3)
You must be signed in to fork a gist
-
-
Save aileftech/dd4f5598b1f3837651fdf16e5abc3ffb to your computer and use it in GitHub Desktop.
| $ grep -P "^[ABCDEFabcdefOoIi]{6,6}$" /usr/share/dict/words | tr 'OoIi' '0011' | tr '[:lower:]' '[:upper:]' | awk '{print "#" $0}' | |
| #ACAD1A | |
| #B0BB1E | |
| #DEBB1E | |
| #AB1DED | |
| #ACAC1A | |
| #ACCEDE | |
| #AC1D1C | |
| #BAB1ED | |
| #BA0BAB | |
| #BEADED | |
| #BEDDED | |
| #BEEFED | |
| #B0BBED | |
| #B0D1CE | |
| #B00BED | |
| #CABBED | |
| #CABB1E | |
| #CADD1E | |
| #C1CADA | |
| #C0DDED | |
| #C0FFEE | |
| #C01FED | |
| #DABBED | |
| #DECADE | |
| #DEC1DE | |
| #DEC0DE | |
| #DEEDED | |
| #DEFACE | |
| #DEF1ED | |
| #DE1CED | |
| #D0FFED | |
| #D00DAD | |
| #EDD1ED | |
| #EFFACE | |
| #FACADE | |
| #F1BBED | |
| #F0BBED | |
| #0FF1CE |
Pretty gosh darn happy with this now c:
Not pure bash, I think that the coreutils's conciseness (tr, fold, xargs) is indispensable and grep is just so much faster (something does feel a little slow, donno if it's the sub-shells, or the arrays, haven't put my finger on it). I think it's concise, and clear... so long as one knows <<<, <(), IFS, and overlooks the entire BG_RGB pipeline (for which one ought to know a relatively obscure feature of printf, xargs, and (new to me) fold). Gotta love shell.
while read -r WORD; do
while read -r HEX; do
IFS=" "
read -r -a BG_RGB <<< "$(fold -w2 <<< $HEX | xargs -I {} printf '%d ' 0x{})"
read -r -a FG_RGB <<< "$(for component in ${BG_RGB[*]}; do printf '%d ' $((255 - $component)); done)"
IFS=";"
printf '\033[48;2;'"${BG_RGB[*]}"'m\033[38;2;'"${FG_RGB[*]}"'m '"$HEX"' \033[0m %s\n'
done < <(tr 'IOS' '105' <<< ${WORD^^})
done < <(grep -Pi "^[A-FIOS]{6,6}$" /usr/share/dict/words)
# time for a in {1..10}; do ... ; done
# real 0m7.699s
# user 0m8.047s
# sys 0m1.301sEdit:
something does feel a little slow
It was xargs, 'bout 50% faster without it (specifically not because of any other change I made to refactor it out, though most tweaks do push it over real 0m4s).
while read -r WORD; do
while read -r HEX; do
IFS=$'\n'
BG_RGB=( $(fold -w2 <<< $HEX | while read -r COMP; do printf '%d\n' 0x$COMP; done) )
FG_RGB=( $(for COMP in ${BG_RGB[*]}; do printf '%d\n' $((255 - $COMP)); done) )
IFS=";"
printf '\033[48;2;'"${BG_RGB[*]}"'m\033[38;2;'"${FG_RGB[*]}"'m '"$HEX"' \033[0m %s\n'
done < <(tr 'IOS' '105' <<< ${WORD^^})
done < <(grep -Pi "^[A-FIOS]{6,6}$" /usr/share/dict/words)
# time for a in {1..10}; do ... ; done
# real 0m3.908s
# user 0m3.711s
# sys 0m0.716sEdit: sed is slightly faster than grep or awk (for matching words, on my machine), and dropping the nested while loop into what is now sed's pipeline saves a ton of time. This is as fast as I think it gets, at least without using awk or sed for more than just what grep can do.
while read -r HEX; do
IFS=$'\n'
BG_RGB=( $(fold -w2 <<< $HEX | while read -r COMP; do printf '%d\n' 0x$COMP; done) )
FG_RGB=( $(for COMP in ${BG_RGB[*]}; do printf '%d\n' $((255 - $COMP)); done) )
IFS=";"
printf '\033[48;2;'"${BG_RGB[*]}"'m\033[38;2;'"${FG_RGB[*]}"'m '"$HEX"' \033[0m %s\n'
done < <(sed -n 's/^[A-FIOSa-fios]\{6\}$/\U&/p' /usr/share/dict/words | tr 'IOS' '105') \
# time for a in {1..10}; do ... ; done
# real 0m2.318s
# user 0m2.227s
# sys 0m0.464sEdit: I gotta go to bed :c
But just as a quick and dirty point of comparison, has an (extra) advantage bc the loop is unrolled (not that it makes a difference):
#!/usr/bin/env -S awk --non-decimal-data -f
{$0=toupper($0)}
/^[A-FIOS]{6,6}$/ {
gsub("I",1);
gsub("O",0);
gsub("S",5);
print "\033[48;2;" \
000+("0x"substr($0,1,2)) ";" \
000+("0x"substr($0,3,2)) ";" \
000+("0x"substr($0,5,2)) "m" \
"\033[38;2;" \
255-("0x"substr($0,1,2)) ";" \
255-("0x"substr($0,3,2)) ";" \
255-("0x"substr($0,5,2)) "m" \
" #" $0 \
" \033[0m"; }
# time for a in {1..10}; do ... ; done
# real 0m0.539s
# user 0m0.532s
# sys 0m0.008sWhere is #BADA55 (or this is clean version)?
@dainiuxt it's on the "enable" list that my script uses
What if you take into account hex codes with 3 characters?
#AAA
#ABC
#ABE
#ACE
#ADA
#ADD
#AD0
#A1D
#A55
#BAD
#BBC
#BED
#BEE
#B1B
#B1D
#B0A
#B0B
#B00
#B5C
#CAB
#CAD
#CB1
#C1D
#C0B
#C0D
#C00
#C05
#DAB
#DAD
#DEB
#DFC
#D1D
#D1E
#D0C
#D0E
#D5C
#EBB
#E5C
#E5E
#FAD
#FED
#FEE
#F1B
#F0B
#F0E
#1B1
#1CE
#1DA
#111
#0AF
#0DD
#0DE
#0ED
#0FF
#5AD
#5EA
#5EC
#5EE
#51C
#50B
#50D
#55E


here is an all awk version, slightly more readable than the sed version
awk '{$0=toupper($0)} /^[A-FOI]{6,6}$/{gsub("I",1); gsub("O",0); print "#" $0}' file