אתגר פורום תכנות: גיטרה קוד ורוקנרול

trew

מהמשתמשים המובילים!
עיצוב גרפי
מוזיקה ונגינה
הדמיות בתלת מימד
D I G I T A L
אודות האתגר

האתגר הבא מבוסס על סיפור אמיתי
בחרתי בשפת הסקריפט Bash כי היא פשוט נמצאת בכל מקום, לינוקס, ווינדוס, מק, אנדרואיד וכו'
מי שמתעסק בפיתוח כמעט תמיד יגיע בסופו של דבר להשתמש בבאש, אז קליל אמרנו וכנראה גם בסיסי.

האתגר מרכיב בעיקר שימוש בכלים בסיסיים, אין כאן טכניקה מסובכת או טריקים מתחת לשרוול.
האתגר מחולק ל3 רמות כך שכל שגם מתחילים בבאש יוכלו לגשת אליו.


כללי השתתפות

האתגר ירוץ למשך השבועיים הקרובים, עד לתאריך 8.11.2020.
פתרונות בלבד ניתן לשלוח באשכול הזה תחת שימוש בתגית ספויילר ולאיזה רמה באתגר הפתרון מיועד.

שאלות פטפוטים דיבורים ושאר ירקות באשכול הבא


נענים לאתגר

קובץ זיפ שבתחתית הפוסט מכיל רשימת קבצי PDF דמה של אקורדים לגיטרה בשמות עבריים (קבצי ה PDF האמיתיים כאן)
שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד בין המילים ובכלל יש עוד כל מיני הפתעות.


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

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

1603618192713.png




לאתגר זה יש מספר רמות

1.
ליצור רשימת תיקיות על פי שמות הקבצים, כל קובץ נכנס לתוך תיקייה שנושאת את שמו.

2. לפרסר כל שם קובץ ולבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ.
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או כל קומבינציה מוזרה אחרת.

3. אותו הדבר כמו סעיף 2, רק בנוסף להצליח להתגבר גם על קבצים ששם הזמר נמצא בסוף שם הקובץ (כפי שמופיע בתמונה לעיל).

הערות:
  • אין רשימת זמרים שעל פיהם אפשרי יהיה ליצור תיקיות, התוכן אמור להגיע על סמך המידע שבקבצים.
  • בשלב השלישי של האתגר ישנה אפשרות לדעת את שמות הזמרים גם אם הם בסוף שם הקובץ (תחשבו על זה)
  • גם אחרי שתעבדו מאוד קשה עדין יהיו קבצים שלא יהיה אפשרי לפלטר בקוד, ככה שהכל טוב.
  • רוצים להראות שהקוד שלכם הכי אלוף שאפשר תוכיחו את זה עם פקודת tree כמה תיקיות וכמה קבצים ארגנתם.

ב ה צ ל ח ה
 

קבצים מצורפים

  • challenge_1.zip
    KB 54.1 · צפיות: 46
נערך לאחרונה ב:

trew

מהמשתמשים המובילים!
עיצוב גרפי
מוזיקה ונגינה
הדמיות בתלת מימד
D I G I T A L
פתרון משימה ראשונה ושניה
בפוסט הנוכחי שניהם נחשבים כמשימה ראשונה



פתרון האתגר סדר בחדר

משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.

לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.

האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.

וזה בדיוק מה שעושה הקוד הבא
Bash:
1  for file in *;
2  do
3      sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4      dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5      mkdir -p "$dest"
6      cp "$file" "$dest"
7  done
שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים

1. מעבירה את שם הקובץ הבא לפקודת sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf

2. פקודת sed מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים ;) הוא חוצץ בין שני הביטויים)
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי _ , - ברווח.
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
קוד:
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf

3. בחירה של 2 המילים הראשונות, איך זה קורה?
פקודת cut מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח,
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.

אז כרגע בסופו של תהליך שורה 3 נראית כך
קוד:
dest="test/שמחה פרידמן"

מפה זה די פשוט וקל
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.

התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.


עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
 

trew

מהמשתמשים המובילים!
עיצוב גרפי
מוזיקה ונגינה
הדמיות בתלת מימד
D I G I T A L
פתרון האתגר סדר בחדר
משימה שלישית


החלק השלישי של המשימה הוא
להצליח להתגבר על קבצים ששם הזמר נמצא בסוף שם הקובץ.

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

מה יהיה אם פשוט נעבור על שמות התיקיות שיצרנו ונחפש את המחרוזות שלהם בכל הקבצים? בצורה הזאת לא משנה היכן יהיה קיים שם הזמר, אם לפני כן היה קובץ אחד ששם הזמר היה בתחילתו, נוכל לאתר את כל הקבצים ששם הזמר נמצא בסופם.

הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך
Bash:
7 for dir in test/*;
8  do
9      dirname="${dir/ /*}"
10     find test/* -type f -path "*${dirname##*/}*" -exec mv {} "$dir" \;
11  done
12  rmdir test/*

אחרי שהסברנו מה הרעיון שהקוד בא לממש, נעבר לראות איך זה קורה בפועל
שורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)

קוד:
test/שמחה פרידמן

שורה 9: מחליפה את הרווח בכוכבית, למה אתם שואלים? כי regex זה חשוב.
ובעצם יוצא שכך נראה כרגע משתנה dirname
קוד:
test/שמחה*פרידמן

שורה 10: מבצעת 2 פעולות
1. לוקחת את שם הזמר בדוגמה שלנו הוא שמחה*פרידמן ומחפשת קבצים שנושאים את שם שלו תחת הנתיב test
הנתיבים שאנו מקבלים נראים כך

קוד:
test/שמחה פרידמן/שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf

החיפוש נעזר בregex, זוכרים את ה * ממקודם? אז כאן היא באה לידי שימוש ו find מקבל את המחרוזת ה regex הבאה *שמחה*פרידמן* ומחפש אותה בנתיב של הקבצים כמו זה שראינו שלעיל, זה מביא לידי כך שלא משנה אלו תווים יש לפני ואלו תווים יש אחרי או אפילו באמצע המחרוזת, שם הזמר תמיד יהיה מזוהה.

2. שמות הקבצים שיצאו תואמים לשם התיקייה של הזמר מועברים לאותה תיקייה.
זה גורם לכך שכל תיקיית זמר מאורגנת מחדש ומקבלת קבצים חדשים, ולכך שיש כרגע תיקיות ריקות בעץ הקבצים שלנו לאחר ששלפנו משם את הקבצים שהיו תואמים את החיפוש.

שורה 12: הפקודה האחרונה בסופו של דבר עוברת על כל התיקיות הריקות ומוחקת אותם.


זהו עד כאן משימה שניה של האתגר

התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
 
נערך לאחרונה ב:

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קיט פ'

קכט פְּלָאוֹת עֵדְוֹתֶיךָ עַל כֵּן נְצָרָתַם נַפְשִׁי:קל פֵּתַח דְּבָרֶיךָ יָאִיר מֵבִין פְּתָיִים:קלא פִּי פָעַרְתִּי וָאֶשְׁאָפָה כִּי לְמִצְוֹתֶיךָ יָאָבְתִּי:קלב פְּנֵה אֵלַי וְחָנֵּנִי כְּמִשְׁפָּט לְאֹהֲבֵי שְׁמֶךָ:קלג פְּעָמַי הָכֵן בְּאִמְרָתֶךָ וְאַל תַּשְׁלֶט בִּי כָל אָוֶן:קלד פְּדֵנִי מֵעֹשֶׁק אָדָם וְאֶשְׁמְרָה פִּקּוּדֶיךָ:קלה פָּנֶיךָ הָאֵר בְּעַבְדֶּךָ וְלַמְּדֵנִי אֶת חֻקֶּיךָ:קלו פַּלְגֵי מַיִם יָרְדוּ עֵינָי עַל לֹא שָׁמְרוּ תוֹרָתֶךָ:
נקרא  22  פעמים

לוח מודעות

למעלה