On Thursday, 15 February 2024 at 13:31:16 UTC, Salih Dincer wrote:
>Elbette neden 7 ile topladığımı merak edenler olabilir. Çünkü 2 nibble arasında ASCII kod tablosundaki fark o kadar. Belki a ve b değişkenleri gereksizdi veya hız açısından faydası da olabilirdi.
Tekrar Merhaba,
Hani 7 kat gök, 7 kat derinliğinde yeraltı derler ya; sahurun bereketi olsa gerek, neredeyse bütün dillerde meşhur olan map şablonunun yeteneklerini sınarken yine 7'ler ile karşılaştım:
Evet, içinde yine 7 var, hem rakam hem de harf olarak ve çok çok leziz bir varyasyon kodladım...
Belki de yedinci kodlamam ve amiyane olmayan teknik terimiyle işte implement ettiklerim:
import std.algorithm : map;
import std.conv, std.range : join;
import std.stdio;
struct HexString
{
int chr;
auto nibbleSplit()
{
auto MSB = chr >> 4;
auto LSB = chr & 15;
return [ MSB, LSB ];
}
}
alias split = map!(e => e.nibbleSplit);
alias topla = map!q{a + '0'};
alias toHex = map!(c => c += c > '7' ? 7 : 0);
void main()
{
auto str = "Merhaba\n\tDünya!";
str.map!HexString.split.join
.topla.toHex
.map!(chr => chr.to!char)
.writeln;
} /* ÇIKTISI:
4D65726?6162610A0@44FC6E7@6121
*/
Olanak olarak to ve join'i saymazsak (çünkü bunlar veride çok bir şey yapmıyor ve sadece yapısını değiştiriyor), sadece map kullandım. Hem de 4 farklı kullanım şekliyle. Nibble bitleri ayırabilmek için kendi türümde kendi split işlevini yapmak zorundaydım. Bir şey dışında pekala güzel, hızlı ve okunaklı oldu:
Neden görünmez karakterler (whitespace) işin içine girerse mekanizmada kaçağa neden oluyor? Dikkat, çıktıdaki @ işareti olmamalı!
Sevgiler, saygılar...