התו הכפול הראשון - תרגיל Shell

06/08/2024

ראיתי את התרגיל הזה במקום אחר עם שפת תכנות אמיתית וחשבתי שיהיה נחמד לנסות אותו ב Shell. האתגר שלנו היום הוא למצוא את התו הראשון שמופיע יותר מפעם אחת במחרוזת.

תוכן עניינים

  1. פיתרון

1. פיתרון

יש מיליון דרכים לפתור אתגרים כאלה, אני בחרתי לנסות עם כמה שפחות דברים מתוחכמים ולכן אני נשאר עם sed, cat, sort, uniq, tr, grep ו cut.

אני מתחיל עם הדפסת המחרוזת, למשל:

echo helloo

יש פה שני תווים כפולים, גם l וגם o, ה l הוא הראשון שמופיע פעמיים. בשביל שיהיה נוח לעבוד על המידע נפרק אותו קודם כל לשורות:

$ echo helloo | sed 's/./&\n/g'
h
e
l
l
o
o

נוסיף לפני כל שורה את המספר שלה, וכך נוכל לזכור מי הופיע מתי:

$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' '
1       h
2       e
3       l
4       l
5       o
6       o
7

עכשיו נסדר אותם לפי התו ונספור כמה פעמים כל תו מופיע:

$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1
   1 7
   1 2  e
   1 1  h
   2 3  l
   2 5  o

נציג רק את השורות שמכילות תו שהופיע יותר מפעם אחת:

$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1 | egrep -v '^\s+1'
   2 3  l
   2 5  o

נסדר אותן לפי סדר ההופעה המקורי שלהן:

$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1| egrep -v '^\s+1'| sort -k 2
   2 3  l
   2 5  o

ולבסוף נציג את רק את השורה הראשונה, וגם בה רק את התו עצמו:

$ echo helloo | sed 's/./&\n/g' | cat -n | tr -d ' ' | sort -k 2| uniq -c -f 1| egrep -v '^\s+1'| sort -k 2 | head -1 | tr -d ' ' | cut -f 2

יש לכם רעיונות נוספים (ובלי טבלת Hash כדי שיהיה מעניין)? אל תתביישו לשתף בתגובות.