|
i_r_on
|
 |
« Yanıtla #105 : Mayıs 06, 2017, 00:17:19 ÖÖ » |
|
Senin program rakamları satır satır veriyor. Tek bir sayı olarak yan yana yazması lazım.
Arada bir boşlukla olur herhalde? 1 inputn 2 x=int(n*rnd(1)+1):ifa(x)<>0goto2 3 i=i+1:a(x)=i:printx;:ifi<ngoto2
|
|
|
|
|
Logged
|
Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001> twitter | blog
|
|
|
|
emarti
|
 |
« Yanıtla #106 : Mayıs 06, 2017, 00:25:44 ÖÖ » |
|
rnd() yok ama bütün kurallara uyuyor şartta değil zaten. 0 inputa:print(left$("987654321",a))
|
|
|
|
|
Logged
|
|
|
|
|
i_r_on
|
 |
« Yanıtla #107 : Mayıs 06, 2017, 00:36:44 ÖÖ » |
|
1 inputn 2 x=int(9*rnd(1)+1):ifa(x)goto2 3 i=i+1:a(x)=i:printx;:ifi<ngoto2
Şöyle düzeltip kısaltayım biraz. (N'e kadar sayı basamak üretiyordu)
|
|
|
|
|
Logged
|
Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001> twitter | blog
|
|
|
|
eins
|
 |
« Yanıtla #108 : Mayıs 06, 2017, 01:29:01 ÖÖ » |
|
Kendi çözümümün biraz daha kısası. Bu arada i_r_on'un çözümüne iki ayrı itirazım var.  0 inputn 3 a=int(rnd(1)*10):c=2^a:ifcandtthen3 4 t=t+c:b=b*10+a:ifb<10^(n-1)then3 5 printb
|
|
|
|
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
eins
|
 |
« Yanıtla #109 : Mayıs 06, 2017, 01:44:19 ÖÖ » |
|
Bu arada çözümü kısaca açıklamak gerekirse,
3 nolu satırda 0 ila 9 arası random bir integer deger belirleniyor.
Bu arada o ana kadar kullanılmış olan degerlerler t degiskeninde ikilik düzende işaretleniyor. Yani 0 rakamı kullanılmış ise t değişkeninin 0.biti 1 oluyor, 1 rakamı kullanılmış ise t değişkeninin 1.biti 1 oluyor gibi... t değişkeni başlangıçta 0 yani hiç bir rakam kullanılmamış.
3 nolu satırdaki c=2^a formülü, random integer'in t değişkeninin hangi bitini set edeceğini hesaplıyor. Yani yukarıdaki gibi eğer random rakam 0 ise sonuç 1, random rakam 1 ise 2, random rakam 2 ise 4 oluyor gibi...
Aynı satırdaki if kontrolü ilgili rakamın daha önce kullanılıp kullanılmadığını kontrol ediyor. Eğer ilgili bit zaten set olmuş ise o rakam kullanılmış, yeni bir rakam seçmek üzere 3 nolu satıra geri dönüş.
4 nolu satırda artık daha önce seçilmemiş bir rakam seçtiğimize eminiz. Öncelikle t değişkenine bu rakamı kullandığımızı işaretliyoruz. burada or kullanmak daha doğru ama zaten c değerinin 2^x olduğunu bildiğimiz ve x değerini bir daha seçmeyeceğimizi bildiğimiz için güvenle toplama yapabiliriz. Daha kısa.
Aynı satırdaki b değeri ise ekrana yazacağımız sonuç değeri. Elimizdeki rakamı ekliyoruz. Ama şu şekilde. Örneğin b değerinde 123 olmuş olsun. Şimdi 4 rakamını ilave edeceğiz. Önce *10 yapıyoruz, 123 oluyor 1230 ve sonra 4 ü ekleyince, 1234 oluyor gibi...
Son olarak burada bir trick var. for next kullanmadım çünkü eğer ilk rakam "tesadüfen" 0 seçilmiş ise fazladan bir tur daha atmak istiyorum. Bunu for next ile yapsaydım ekstra bir kontrol gerekiyordu. buradaki trick şu:
Örneğin 3 haneli bir sayı istenmiş ise, ilk hane 0 olamayacağına göre, sonuç en az 100 olmalı. Bunu nasıl formülüze ederiz? 10^(n-1) ile... Evet işte toplam sayı bu değerden az ise döngü dönmeye devam ediyor. Yani 3 basamak için 3 yada 4 kere dönecek...
|
|
|
|
« Son Düzenleme: Mayıs 06, 2017, 02:07:55 ÖÖ Gönderen: delimawi »
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
eins
|
 |
« Yanıtla #110 : Mayıs 06, 2017, 01:49:52 ÖÖ » |
|
0 inputn 3 a=int(rnd(1)*10):c=2^a:ifcandtthen3 4 t=t+c:b=b*10+a:ifb<10^n/10then3 5 printb
10^n/10 nedense 10^(n-1) den 1 byte daha kısa... 
|
|
|
|
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
i_r_on
|
 |
« Yanıtla #111 : Mayıs 06, 2017, 01:54:52 ÖÖ » |
|
Kendi çözümümün biraz daha kısası. Bu arada i_r_on'un çözümüne iki ayrı itirazım var.  0 inputn 3 a=int(rnd(1)*10):c=2^a:ifcandtthen3 4 t=t+c:b=b*10+a:ifb<10^(n-1)then3 5 printb
Niye itirazın var yahu? 
|
|
|
|
|
Logged
|
Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001> twitter | blog
|
|
|
|
eins
|
 |
« Yanıtla #112 : Mayıs 06, 2017, 02:04:55 ÖÖ » |
|
1. , yada ; kullanmak bence etik değil. Eğer olabiliyorsa sonuç doğrudan yan yana (aralarda boşluk olamadan) yazılmalı. Zira sonuç olarak istenen bir sayı.
2. Formülünde etik olmayan başka bir durum daha var. Yanlış değerlendirmiyorsam senin sonuçlarının hiçbir rakamında 0 olmaz. Sen direkt 0 ı elemişsin. Bence ilk basamak haricinde içerikte 0 olabilmeli.
|
|
|
|
« Son Düzenleme: Mayıs 06, 2017, 02:32:38 ÖÖ Gönderen: delimawi »
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
eins
|
 |
« Yanıtla #113 : Mayıs 06, 2017, 02:25:17 ÖÖ » |
|
Son optimizasyonumda işlem önceliklerinden dolayı aşağıdaki gibi bir update yaptım. 0 inputn 3 a=int(rnd(1)*10):c=2^a:ifcandtthen3 4 t=t+c:b=b*10+a:ifb*10<10^n-1then3 5 printb
|
|
|
|
« Son Düzenleme: Mayıs 06, 2017, 02:51:28 ÖÖ Gönderen: delimawi »
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
i_r_on
|
 |
« Yanıtla #114 : Mayıs 06, 2017, 02:39:15 ÖÖ » |
|
1. , yada ; kullanmak bence etik değil. Eğer olabiliyorsa sonuç doğrudan yan yana (aralarda boşluk olamadan) yazılmalı bence. Zira sonuç olarak istenen bir sayı.
Bu sayının sunumu ile alakalı bence, daha önceki sorularda da mesela kabul edilen cevaplarda sayı kodda string olarak işlem görüp string olarak output ediliyordu. Soru 20 haneli ve her sayı en fazla 2 kez geçsin diye sorulsaydı mecbur hepimiz string yapacaktık. Benim kodda da microsoft işaret için bodoslama yer ayırmayaydı öyle gözükmeyecekti. 2. Formülünde etik olmayan başka bir durum daha var. Yanlış değerlendirmiyorsam senin sonuçlarının hiçbir rakamında 0 olmaz. Sen direkt 0 ı elemişsin. Bence ilk basamak haricinde içerikte 0 olabilmeli.
Bence bu da yorum, zira wizofwor rastgeleliğin ne ölçekte olacağı ile ilgili bir kısıt koymamış. C64 basic'te adam akıllı bir rastgele elde etmek için zaten seed'i 1 vermemek lazım bodoslama.
|
|
|
|
|
Logged
|
Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001> twitter | blog
|
|
|
|
eins
|
 |
« Yanıtla #115 : Mayıs 06, 2017, 03:00:51 ÖÖ » |
|
Ben gene de etik bulmuyorum ama bu durumda aşağıdaki sanırım bir kaç byte daha kısa: 0 inputn:fori=1ton 1 a=int(rnd(1)*9):ifb(a)then1 2 b(a)=1:printa+1;:next
Bu arada senden arakladığım a(x) yöntemi 2^x binary işaretlemeden 6 byte daha kısa oldu...  Gene benim 0 lı sonuçları içeren "etik" çözümüm: 0 inputn 3 a=int(rnd(1)*10):ifc(a)then3 4 c(a)=1:b=b*10+a:ifb*10<10^n-1then3 5 printb
|
|
|
|
« Son Düzenleme: Mayıs 06, 2017, 03:10:05 ÖÖ Gönderen: delimawi »
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
i_r_on
|
 |
« Yanıtla #116 : Mayıs 06, 2017, 03:21:17 ÖÖ » |
|
Ben gene de etik bulmuyorum ama bu durumda aşağıdaki sanırım bir kaç byte daha kısa: Bu arada senden arakladığım a(x) yöntemi 2^x binary işaretlemeden 6 byte daha kısa oldu...  Gene benim 0 lı sonuçları içeren "etik" çözümüm: Ohoo, hem araklama diyoruz hem de etikten bahsediyoruz. Olmadı  Bu tip durumlarda orjinal çözüme tam puan, türevine yarısı verilmeli bence. Böyle daha etik olur :p
|
|
|
|
|
Logged
|
Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001> twitter | blog
|
|
|
|
eins
|
 |
« Yanıtla #117 : Mayıs 06, 2017, 03:28:14 ÖÖ » |
|
Zaten tirnak icinde etik yazmistim ama sonucta ikimizin de kartusa ihtoyaci yok. Nasil yapsak...  Bir de @wizofwor merak ettim. Satir numarasindan sonraki bosluk degerlendirmede hesaba katiliyor mu?
|
|
|
|
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|
emarti
|
 |
« Yanıtla #118 : Mayıs 06, 2017, 09:28:13 ÖÖ » |
|
@wizofwor bence soru için kısıtlama yada kuralları daha net belirtmeli. Mesela ben de RND ile çözmeye çalışırken farkettim ki ne kasıyoruz çünkü her basamaktaki rakam farklı olmalı demiş. Ayrıca program her çalıştığında aynı sayıyı üretmemeli diye bir kısıtlama da yok sadece başında 0 olmamalı. Ayrıca her rakam kullanılmalı yada sayı üretiminde olası olmalı diye kural da yok. Kalıplaşmış bir diziden LEFT$ ile bu olayı çözmek bana daha mantıklı geldi. Hatta 0<n<10 olduğundan n 9 farklı değer olabilir ben de dizide 0 kullanmak istemedim. Çözümü bu kodda buldum. 0 inputa:print(left$("987654321",a))
|
|
|
|
|
Logged
|
|
|
|
|
eins
|
 |
« Yanıtla #119 : Mayıs 06, 2017, 14:29:04 ÖS » |
|
1 Byte optimizasyon. Yahu bu fikri nereden buldun @wizofwor, takıldı aklıma iş yapamıyorum...  0 inputn 3 a=int(rnd(1)*10):ifc(a)then3 4 c(a)=1:b=b*10+a:ifb<10^(n-1)then3 5 printb
|
|
|
|
|
Logged
|
Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
|
|
|
|