
Минулого тижня багаторічний читач надіслав мені цікаву проблему. Мета - закінчити текстовим рядком на зразок "MWF" для понеділка, середи, п'ятниці. Проблема полягає в тому, що будні вводяться як так / ні скорочення, як "NYNYNYN" для "MWF".
Виклик
Яка формула переведе "N" і "Y" у абревіатури робочого дня, як показано на скріншоті вище?
Книга додається нижче. Опублікуйте свою відповідь у коментарях.
Додаткові бали для стилю та елегантності, але рішення з робочим конем теж прекрасні :)
Припущення
- Усі входи мають 7 символів і містять лише "Y" або "N"
- Дні відображаються з неділі по суботу, SMTWTFS.
Варіанти рішення - спойлери!
Варіант №1 - об’єднання грубої сили за допомогою функції MID, додані розриви рядків для читабельності:
=IF(MID(B5,1,1)="Y","S","")& IF(MID(B5,2,1)="Y","M","")& IF(MID(B5,3,1)="Y","T","")& IF(MID(B5,4,1)="Y","W","")& IF(MID(B5,5,1)="Y","T","")& IF(MID(B5,6,1)="Y","F","")& IF(MID(B5,7,1)="Y","S","")
Це було б типовим рішенням і чудово ілюструє, як працює конкатенація. Примітка: ви можете використовувати розриви рядків всередині рядка формул, щоб полегшити читання формул.
Варіант №2 - функція TEXTJOIN та MID:
=TEXTJOIN("",TRUE,IF(MID(B5,(1,2,3,4,5,6,7),1)="N","",("S","M","T","W","T","F","S")))
Це рішення використовує константи масиву, щоб просто формулу значно.
Примітка: Джон Вітвер опублікував більш досконалу версію цієї формули в коментарях нижче, обертаючи константу масиву, використовуючи ROW та INDIRECT.
Варіант №3 - TEXTJOIN, MID і REPT:
=TEXTJOIN("",1,REPT(("S","M","T","W","T","F","S"),MID(B5,(1,2,3,4,5,6,7),1)="Y"))
* Трохи * більш компактна версія з використанням REPT, використовуючи той факт, що MID повертає TRUE або FALSE для кожного значення, а TRUE буде оцінюватися як 1 або нуль всередині REPT.