Arama butonu
Bu konudaki kullanıcılar: 1 misafir
28
Cevap
1048
Tıklama
0
Öne Çıkarma
Cevap: Şu Algoritmanın Neresi Hatalı? (2. sayfa)
T
7 yıl
Yarbay

Yukarda Perl örneğinin yorumsuz sade hali :



quote:



@masa = 0 .. 999;



until (@masa == 1) {

push @masa, shift @masa;

shift @masa;

}



print "Endeksi @masa olan kişi hayatta kaldı";




until blogundaki "queue" yapısı, circular linked list olmadan işi çözüyor. Perl 'i herkesin incelemesini tavsiye ederim cunku buradaki push ve shift gibi değişik fonksiyonları var. Bu fonksiyonları sonradan dile eklemişler. Programlarda en cok kullanlan yapıları fonksiyona dönüştürüyorlar. shift dizinin en başındaki elemanı cekip diziyi 1 eleman kısaltıyor, push ise dizinin sonuna eleman ekleyerek diziyi 1 eleman büyütüyor. Josephus problemi temel olarak bu 2 satır ile çözülebiliyor: İlk kişi sağ kaldığı için listenin en sonuna ekleniyor , yanındaki kişi de öldüğü için listeden çekiliyor. Bu sekilde problemi çözdükten sonra Java ile ArrayList üzerine aynı işlemi simule ederek yazmak cok daha rahat ve zevkli olur.



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @Glitch
A
7 yıl
Binbaşı
Konu Sahibi

quote:

Orijinalden alıntı: Glitch

Problemin adı Josephus Circle matematik veya programlama ile çözülebilir.Adım adım çözen bir program yazmıştım ama java ile.İstersen koyayım.
Koyabilirsen harika olur.


Bu mesaja 1 cevap geldi.
G
7 yıl
Teğmen

@revivo72 circular linked list kullanmak zorunda olduğum için var.Pratik olmayabilir doğrudur.
@AI Engineer netbeans kullanıyorsan onun projesini atabilirim daha rahat olur.
Senin problemin için 1000 balon ve 2 aralık vermen lazım.Ölen numarayı yazmıyor,ama her ölümden sonra durumu basıyor ödev gereği.Ekle istersen.

public class Circle { 

Balon bas;
Balon son;
int sayi; // kaç balon olduğunu tutacak

public void sonaEkle(quizz4.Balon b){
//sona balon ekle
if(bosMu()){
bas=b;
son=b;

} else {
son.sonraki=b;
son=b;
b.sonraki=bas;

}
sayi++;
}
public boolean bosMu(){
return bas==null;
}
public void patlat(Balon b){
if(sayi==2){
//2 balon varken patlatma
bas=b.sonraki;
son=b.sonraki;
bas.sonraki=null;
} else {
//2den fazla balon var
if(b==bas){
//patlayan balon bas
son.sonraki=b.sonraki;
son=b.sonraki;
bas=son.sonraki;
}
else if(b==son){
//patlayan balon son
Balon it1 = bas;
while(it1.sonraki!=b){
it1=it1.sonraki;
}
it1.sonraki=bas;
son=it1;
}
else {
//patlayan balon ortada
Balon it1 =bas;
while(it1.sonraki!=b){
it1=it1.sonraki;
}
it1.sonraki=b.sonraki;
}

}
sayi--;
}
public void yazdir(){
Balon iterator=bas;
if(sayi==1){
System.out.print(""+bas.sira+" ");
}else{
do{
System.out.print(""+iterator.sira+" ");
iterator=iterator.sonraki;
}while(iterator!=bas);
System.out.print(" ");
}}}


bu inner class da olabilir.

public class Balon { 

int sira; //ilk sırasını tutar
Balon sonraki;
public Balon(int sira){
this.sira=sira;
sonraki=null;
}
public Balon(){
this.sira=-1;
sonraki=null;
}

public String toString(Balon b){
return ""+b.sira;
}}


bu da çalıştırmak için main method;

public class Quizz4 { 

public static void main(String[] args) {

Scanner s=new Scanner(System.in);
int kacBalon;
int kacAralık;
Circle circ=new Circle();
System.out.println("Balon sayısını giriniz: ");
kacBalon = s.nextInt();
if(kacBalon<2){
System.out.println("2'den fazla balon olmalı...");
System.exit(0);
}
System.out.println("Kaç balon atlanarak patlatma işlemi gerçekleştirilecek: ");
kacAralık=s.nextInt();
if(kacAralık<1){
System.out.println("Balon patlatma işlemi en az 1 balon atlayarak yapılır...");
System.exit(0);
}


for(int i=0;i<kacBalon;i++){
circ.sonaEkle(new Balon(i+1));
}
System.out.print("Balonların ilk hâli: ");
circ.yazdir();
System.out.println("");
Balon iterator=circ.bas;
int j=1;
while(circ.sayi!=1){
for(int i=0;i<kacAralık-1;i++){
iterator=iterator.sonraki;
}
Balon iterator2=iterator;
iterator=iterator.sonraki;
circ.patlat(iterator2);
System.out.printf(""+j+". Patlatma :");
j++;
circ.yazdir();
System.out.println("");

}
System.out.println("--> Sona kalan balon: "+circ.bas.sira+" numara");
System.out.printf("
");
}}





< Bu mesaj bu kişi tarafından değiştirildi Glitch -- 25 Temmuz 2018; 8:31:14 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @revivo72 , @AI Engineer
S
7 yıl
Yüzbaşı

fecaat. hiç java bilmiyorsunuz

bu java syntax'lı bir C programı olmuş, hem de kötü bir C programı.



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Glitch
G
7 yıl
Teğmen

Bu javayla yazdigim 4. programdi zaten isminden anlasildigi gibi :) Buyrun yazin arkadasa program.



< Bu ileti mobil sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @seyfi84
S
7 yıl
Yüzbaşı

Java ile aklıma ilk gelen çözüm aşağıda. SAYI masada kaç kişi olduğu. step kaçıncı kişiyi öldüreceği. pek test etmedim, varsa hatası söyleyin.

 
public class Prog {
private static int SAYI = 1000, step = 1;

public static void main(String[] args) {
int i,j;
List<Integer> arr = new ArrayList<>(SAYI);
for (i=0; i<SAYI; ++i) arr.add(i+1);
for (i=0+step, j=SAYI; j>1; --j, i=(i+step)%arr.size())
arr.remove(i);

System.out.println("Kalan: "+arr.get(i));
}
}






< Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 26 Temmuz 2018; 14:16:33 >

< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
A
7 yıl
Binbaşı
Konu Sahibi

Kod hata verdi.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @seyfi84
S
7 yıl
Yüzbaşı

en başta import satırı yok, oraya mı takıldın? hiç java bilmiyorsun galiba...



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @AI Engineer
G
7 yıl
Teğmen

Arkadasa bi java sertifikasi yollayin ordan.



< Bu ileti mobil sürüm kullanılarak atıldı >

İ
7 yıl
Yüzbaşı

Programdaki hata: len(visitors) > 1 diyorsun, ancak listedeki 1,3,5..999 a kadar olan kısım duruyor. i ise 501 oluyor. Daha doğrusu artmaya devam ediyor. 501. indeks te eleman olmadığından hata veriyor.

Probleme getirdiğim çözüm(Matematiksel olarak düşünmekten ziyade örüntüsel ilerledim, Python 3):

#Dizide yerine göre tekleri yerine göre çitfleri çıkarıyorum. Çitfleri çıkardığım durum ise son kişinin eline bıçağın geçmesi durumu(Çift, tek derken liste sırasına göre, sayıya göre değil).

visitors = list(range(1,1001))

static = 1

while(len(visitors) != 1 ):
if(static):
i = 1
else:
static = 1
while( i < len(visitors) ):
del visitors[i]
if len(visitors) is 2 or (i == (len(visitors)-1)):
i = 0
static = 0
break
i = i + 1


print(visitors[0])





< Bu mesaj bu kişi tarafından değiştirildi imammmm -- 28 Temmuz 2018; 0:10:28 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.