July 22, 2017

Güzel bir tek satırlı fonksiyon yazma şansım oldu.

auto sayilar = stdin.readln.strip.array.map!(a => to!dchar(a)).split("0").map!( a => to!dstring(a.length)).join().dup.array;

Bu 10111011 gibi bir şey verilirse 0 larla ayırıp her ayrışık gruptaki 1 lerin sayısında bir rakam elde ediyor. Bu örnekte 132 oluyor. http://codeforces.com/contest/825/problem/A

Eğer şöyle bir istek olsaydı ne yapardım diye düşündüm

101110110 -> 1320 dönmesin fakat 132 dönsün yanı eğer sondaki eleman sıfır ise sondaki elemanı at.

Bunu benim güzel zincirimi bozmadan yapabilirmiydim acaba ?

auto sayilar = stdin.readln.strip.array.map!(a => to!dchar(a)).split("0").map!( a => to!dstring(a.length)).join().dup.array.dropBackOneIf!( a => a == '0').array

Gibi dropBackOneIf'e denk gelen bir fonksiyon varmıdır std'de

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 22, 2017

Öyle bir algoritma Phobos'ta yok. Senin kodunu biraz temizledim:

   auto sayilar = stdin.readln.strip.split('0').map!(a => cast(char)('0' + a.length));

Olabildiği kadar .dup ve .array çağrılarından kaçınmak gerek; bellek ayırırlar.
Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]