Forum: D Programlama Dili RSS
Codeforces programlama yarışmaları
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Codeforces programlama yarışmaları
Merhaba Arkadaşlar,

Son zamanlarda http://codeforces.com/ 'da organize edilen programlama yarışmalarına D ile katılıyorum.
D bu yarışmalarda gerçekten büyük bir avantaj. Hem pyhton kadar güçlü , hemde modulleri kuvvetli, hemde system dili olduğundan dolayı bir hayli hızlı. 2 saat süren yarışmalarda insan doyasıya kod yazıyor ve kendimce çok eğleniyorum.

6 gün sonra yine bir yarışma olacak ve online olarak katılmak isteyen arkadaşların sadece siteye kayıt olması yetiyor. Sizlerle paylaşmak istedim.

Çözümlerimizi yarışma sonlandıktan sonra  forumumuzda paylaşıp tartışabiliriz. Daha aktifleşmiş oluruz aslında. Nedersiniz?


Saygılar Hepinize
Erdem
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok güzel şeyler... :) Ama ben şu sıralar hiç zaman bulamıyorum. Belki bir kaç sene sonra. :-/

Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Paslanmış bir D 'ci olarak artık 5 sorudan sadece 1 soru çözmeyi başarabildim 2 saatte. Gerçekten çok kötüyüm.

Problem şu http://codeforces.com/contest/689/problem/A linkte bulunabilir. Eğer ilginizi çekerse açıklayabilirim. Bu kod yarışmaları "Range" leri kullanmak için birebir gerçekten.

Acaba çözümüm hakkında yorumunuz olurmu veya sizin daha pratik bir algoritma aklınıza geliyormu zira 2 saat aldı aşağıdaki kodu yazmak(D yi unuttuğumdan dolayı ayrıca). 


import std.stdio, std.array, std.algorithm : sort, copy;
import std.conv;
import std.string;
import std.algorithm;
import std.range;

int colFinder( int number )
{
    if ( number == 0 )
        return 1;
    return (number + 2) % 3;
}

int rowFinder( int number )
{
    if ( number == 0 )
        return 3;
    else
        return (number-1) / 3 ;
}

int main(string[] argv)
{
    auto numberOfNums = to!int(stdin.readln().chomp());
    auto numList = to!dstring(stdin.readln().chomp()).map!( a => to!int(a) - 48 ).uniq().array();

    if ( numList.length <= 1 )
    {
        writeln("NO");
        return 0;
    }

    auto minVal = numList.reduce!(min);
    auto maxCol = numList.filter!(a => a != minVal ).map!( a => colFinder(a) ).reduce!(max);
    auto maxRow = numList.filter!(a => a != minVal).map!( a =>  rowFinder(a) ).reduce!(max);
    auto minCol = numList.filter!(a => a != minVal ).map!( a => colFinder(a) ).reduce!(min);
    auto minRow  = numList.filter!(a => a != minVal).map!( a =>  rowFinder(a) ).reduce!(min);

    auto minValRow = rowFinder(minVal);
    auto minValCol = colFinder(minVal);


    int stepLeft, stepRight, stepTop, stepBot = 0;

    if ( minCol < minValCol )
        stepLeft = minCol - minValCol;
    if ( minRow < minValRow )
        stepTop = minRow - minValRow;   
    if ( maxCol > minValCol )
        stepBot = maxCol - minValCol;
    if ( maxRow > minValRow )
        stepRight = maxRow - minValRow;

    auto finalList = iota(0, 10, 1).filter!( a => a != minVal &&  colFinder(a) + stepLeft >= 0
                     && colFinder(a) + stepRight <= 2
                     && rowFinder(a) + stepTop >= 0
                     && ((colFinder(a) == 1 && rowFinder(a) + stepBot <= 3)  || (colFinder(a) != 1 && rowFinder(a) + stepBot <= 2)) );

    if ( finalList.empty )
        writeln("YES");
    else
         writeln("NO");
    return 0;
}

Saygılarımla
Erdemdem
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben şöyle düşündüm: Numaralardan oluşan dizgi klavye üstünde bir şekil çiziyor. Karmaşıklığından bağımsız olarak, bu şeklin serbestisi, yani klavye üzerinde hareket edebilmesi, onu oluşturan numaraların serbestilerinin bileşiminden oluşur. Örneğin, 4'ü içeren hiçbir şekil sola hareket edemez, 6'yı içeren bir şekil sağa hareket edemez, vs.

Sonuçta, hic serbestisi olmayan şekillerden tek vardır.
import std.stdio;
import std.string;
import std.algorithm;
import std.exception;
import std.conv;
 
struct Serbesti {
    int üst;    // Yukarıya hareket serbestisi
    int sağ;    // Sağa hareket serbestisi
    int alt;    // Aşağıya hareket serbestisi
    int sol;    // Sola hareket serbestisi
 
    // Bu serbesti ile diğer serbestiyi birleştirir
    Serbesti birlikte(Serbesti diğer) const {
        return Serbesti(min(this.üst, diğer.üst),
                        min(this.sağ, diğer.sağ),
                        min(this.alt, diğer.alt),
                        min(this.sol, diğer.sol));
    }
 
    // Hiç serbestisi yoksa 'false' döndürür
    bool hareketEdebilir_mi() const {
        return üst || sağ || alt || sol;
    }
}
 
// Numaraların hareket serbestileri
const Serbesti[int] serbestiler;
 
shared static this() {
    serbestiler = [
        '0' : Serbesti(3, 0, 0, 0),    // 0, yalnızca 3 adım yukarıya hareket edebilir
        '1' : Serbesti(0, 2, 2, 0),    // 1, sağa ve aşağıya 2 adım hareket edebilir
        '2' : Serbesti(0, 1, 3, 1),    // vs.
        '3' : Serbesti(0, 0, 2, 2),
        '4' : Serbesti(1, 2, 1, 0),
        '5' : Serbesti(1, 1, 2, 1),
        '6' : Serbesti(1, 0, 1, 2),
        '7' : Serbesti(2, 2, 0, 0),
        '8' : Serbesti(2, 1, 1, 1),
        '9' : Serbesti(2, 0, 0, 2),
    ];
}
 
 
void main() {
    const adet = stdin.readln.strip.to!size_t;
    enforce(adet > 0, "En az bir numara lütfen");
 
    const numaralar = stdin.readln.strip;
    enforce(numaralar.length == adet, "Numara adedi tutarsız");
 
    const ortakSerbesti =
        numaralar[1..$].fold!((ortak, numara) => ortak.birlikte(serbestiler[numara]))(Serbesti(numaralar[0]));
 
    writeln(ortakSerbesti.hareketEdebilir_mi
            ? "NO"
            : "YES");
}
Ali
kerdemdemir #5
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben bu soruların Foruma renk katacağını düşünüyorum. Hatta bunun gibi anlaşılması kolay soruları başlık bile yapabiliriz diye düşünüyorum. Sizin algoritmanız benimkinden çok farklı ve daha güzel.

İlginç bir şekilde 6. test de bir hata geliyor:

Time: 15 ms, memory: 0 KB
Verdict: WRONG_ANSWER
Input
3
159
Participant's output
NO
Jury's answer
YES
Checker comment
wrong answer expected YES, found NO


Ben kodu okuduğumda 1-5-9 sonuçunda 0,0,0,0 çıkması gerektiğini düşünüyorum ve algoritmanınızın çalışması gerektiğini düşünüyorum. Acaba hata nerde olabilir. Ben bulamadım

Saygılar Sevgiler
Erdemdem
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hata, fold'un başlangıç değeri olarak Serbesti(numaralar[0]) yazılmış olmasında. numaralar[0], '1' karakterinin ASCII kodu oluyor, D'nin yapı ilkleme söz dizimi diğer serbesti değerlerini 0 yapıyor ve elimize ilk karakter için Serbesti(49, 0, 0, 0) değeri kalıyor.

Doğrusu, fold'a serbestiler[numaralar[0]] vermek olurdu:
    const ortakSerbesti =
        numaralar[1..$]
        .fold!((ortak, numara) => ortak.birlikte(serbestiler[numara]))
        (serbestiler[numaralar[0]]);    // <-- burada 
Talihsiz bir hata. :)

Şimdi düşününce bu kodun daha basit olabileceğini de görüyorum:
    const ortakSerbesti = numaralar
                          .map!(n => serbestiler[n])
                          .fold!((ortak, serbesti) => ortak.birlikte(serbesti));
Yani, önce numaralardan serbestilere geçiyoruz ve onları birlikte ile birleştiriyoruz.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-03-23, 11:22:01 (UTC -07:00)