Thread overview
Hatamı bulacak yiğit aranıyor(Kodlama yarışması)
Apr 19, 2019
kerdemdemir
Apr 19, 2019
kerdemdemir
April 19, 2019

Evet sütünü teker teker dolaşıp , o sütündaki elemanlardan birisi diğerleri ile xor landığında sonuçu 0 olmuyorsa bunu yazdırmamız isteniyor.

http://codeforces.com/contest/1151/problem/B

Örneğin
1 3 5 1
1 3 5 2
1 3 5 1

İlk üç sütünda aynı elemanlar var fakat sonuncu sütünda diğer satırlardan farklı bir eleman var("2"). Bu eleman için xor sonuçu her satırda 0'dan farklı olacaktır.

http://codeforces.com/contest/1151/submission/53016420

import std.stdio;
import std.math;
import std.algorithm;
import std.array;
import std.string;
import std.conv;
import std.range;
import std.file;
import std.datetime;




int dizgedeTekElemanVarmı( int[] dizge )
{
	int[int] tablo;
	for ( int i = 0; i < dizge.length; i++ )
	{
		tablo[dizge[i]]++;
	}

	for ( int i = 0; i < dizge.length; i++ )
	{
		if (tablo[dizge[i]] == 1)
			return i+1;
	}
	return -1;
}

void main() {

	int[] satırSütünSayısı = stdin.readln.strip.split.map!(a=> a.to!int()).array;

       // Bu if check'i sonradan ekledim sadece tek satırlı durumları ele alıyor biraz büyük oldu çirkin gözüktü atlanabilir
	if ( satırSütünSayısı[0] == 1 )
	{
		int[] dizgi = stdin.readln.strip.split.map!(a=> a.to!int()).array;
		for ( int i = 0; i < dizgi.length; i++ )
		{
			if (dizgi[i] != 0)
			{
				writeln("TAK");
				return writeln(i+1);
			}
		}
		return writeln("NIE");

	}

   int[][] satırlar = stdin
       .byLine()
       .take(satırSütünSayısı[0])
       .map!(line => line
             .split
             .map!(a => to!int(a))
             .array()).array;

       // Burası gerçekden iş yapan kısım
	for ( long i = 0; i < satırSütünSayısı[1]; i++ )
	{
		int sıra = dizgedeTekElemanVarmı( satırlar.transposed[cast(int)i].array );
		if ( sıra != -1 )
		{
			writeln("TAK");
			writeln(sıra, " ", i+1);
			return;
		}
	}
	writeln("NIE");
	//writeln();
}

Her nedense 9. testde patlıyor ve çatlıyorum.
Internet arayüzü datayı tam göstermiyor satıra sığmadığı için

819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 819 81... ---> ne yazıkki patladığım yeri göremiyorum :(

Acaba hatamı bulabilecek birisi varmıdır ?

Erdemdem

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

April 19, 2019

Aldığım hata bellek veya zaman hatası değil ne yazık ki(veya çok şükür ki çünkü onlar daha zor oluyor) . Onların hata mesajları ayrı oluyor.

Aslında bütün durumları göze alarak(brute force(abi büyüksün)) çözmediğimi düşünüyorum kendimce

int dizgedeTekElemanVarmı( int[] dizge )
{
   int[int] tablo;
   for ( int i = 0; i < dizge.length; i++ )
   {
       tablo[dizge[i]]++;
   }

   for ( int i = 0; i < dizge.length; i++ )
   {
       if (tablo[dizge[i]] == 1)
           return i+1;
   }
   return -1;
}

Elemanları tabloya koyuyorum ve tabloda o sütunda kaç tane olduğu bilgisini güncelliyorum. Ve sonunda 1 tane olan varsa dönüyorum. Böylece bir sutün'u O(N)*2 kere dolaşmış oluyorum. Sort etseydim eğer durum çok kötü olurdu.

Ama belkide daha iyi bir algoritma vardır :blush: .

Erdemdem

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

April 19, 2019

Henüz yeterince bakamadım ama bütün durumları göze almak (brute force) fazla uzun zaman alıyor, değil mi? Yoksa D'deki cartesianProduct'tan yararlanınca tek satırda halledilebilir gibi geliyor.

Ali

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