
Dlhoročný čitateľ mi minulý týždeň poslal zaujímavý problém. Cieľom je skončiť s textovým reťazcom ako „MWF“ pre pondelok, stredu, piatok. Problém je v tom, že vo všedné dni sa zadávajú skratky typu áno / nie ako „NYNYNYN“ pre „MWF“.
Výzva
Aký vzorec prevedie skratky „N“ a „Y“ na všedné dni, ako je to znázornené na snímke obrazovky vyššie?
Zošit je priložený nižšie. Svoju odpoveď uverejnite v komentároch.
Body navyše za štýl a eleganciu, ale riešenia ťažného koňa sú tiež v poriadku :)
Domnienky
- Všetky vstupy majú 7 znakov a obsahujú iba „Y“ alebo „N“
- Dni sa mapujú od nedele do soboty, SMTWTFS.
Možnosti riešenia - spojlery!
Možnosť č. 1 - zreťazenie hrubou silou s funkciou MID, pre čitateľnosť pridané zalomenia riadkov:
=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","")
Toto by bolo typické riešenie a pekne ilustruje, ako funguje zreťazenie. Poznámka: V riadku vzorcov môžete voľne používať zalomenia riadkov, aby sa vzorce ľahšie čítali.
Možnosť č. 2 - Funkcia TEXTJOIN a MID:
=TEXTJOIN("",TRUE,IF(MID(B5,(1,2,3,4,5,6,7),1)="N","",("S","M","T","W","T","F","S")))
Toto riešenie využíva konštanty poľa na jednoduché zjednodušenie vzorca.
Poznámka: Jon Wittwer zverejnil v komentároch nižšie sofistikovanejšiu verziu tohto vzorca a pomocou ROW a INDIRECT roztočil konštantu poľa.
Možnosť č. 3 - TEXTJOIN, MID a REPT:
=TEXTJOIN("",1,REPT(("S","M","T","W","T","F","S"),MID(B5,(1,2,3,4,5,6,7),1)="Y"))
* Mierne * kompaktnejšia verzia využívajúca REPT, ktorá využíva skutočnosť, že MID vráti TRUE alebo FALSE pre každú hodnotu a TRUE vyhodnotí vo vnútri REPT hodnotu 1 alebo nulu.