
En mangeårig læser sendte mig et interessant problem i den forløbne uge. Målet er at ende med en tekststreng som "MWF" til mandag, onsdag, fredag. Problemet er, at hverdage indtastes som ja / nej-forkortelser som "NYNYNYN" for "MWF".
Udfordring
Hvilken formel oversætter "N" og "Y" til forkortelser på hverdage som vist på skærmbilledet ovenfor?
Arbejdsmappen er vedhæftet nedenfor. Send dit svar i kommentarerne.
Ekstra point for stil og elegance, men arbejdshestløsninger er også fine :)
Antagelser
- Alle input er på 7 tegn og indeholder kun "Y" eller "N"
- Dage er kortlagt søndag til lørdag, SMTWTFS.
Løsningsmuligheder - spoilere!
Mulighed nr. 1 - brute force-sammenkædning med MID-funktionen, linjeskift tilføjet for læsbarhed:
=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","")
Dette ville være en typisk løsning og illustrerer pænt, hvordan sammenkædning fungerer. Bemærk: du er fri til at bruge linjeskift inde i formellinjen for at gøre formler lettere at læse.
Mulighed nr. 2 - TEXTJOIN og MID-funktion:
=TEXTJOIN("",TRUE,IF(MID(B5,(1,2,3,4,5,6,7),1)="N","",("S","M","T","W","T","F","S")))
Denne løsning bruger arraykonstanter til simpelthen formlen betydeligt.
Bemærk: Jon Wittwer indsendte en mere sofistikeret version af denne formel i kommentarerne nedenfor og spandt op arraykonstanten ved hjælp af ROW og INDIRECT.
Mulighed nr. 3 - TEXTJOIN, MID og REPT:
=TEXTJOIN("",1,REPT(("S","M","T","W","T","F","S"),MID(B5,(1,2,3,4,5,6,7),1)="Y"))
En * lidt * mere kompakt version, der bruger REPT, idet man drager fordel af, at MID returnerer SAND eller FALSK for hver værdi, og SAND vurderes til 1 eller nul inden for REPT.