Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
commodore.gen.trCommodoreCommodore YazılımC64 BASIC Kısa Kod Yarışması - irqHack64 Ödüllü
Sayfa: 1 ... 7 8 [9] 10 11 ... 30   Aşağı git
Yazdır
Gönderen Konu: C64 BASIC Kısa Kod Yarışması - irqHack64 Ödüllü  (Okunma Sayısı 237625 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Agony
Uzman
*****
Mesaj Sayısı: 2.543


Amiga gibi yar, Commodore gibi de yadigar olmaz.


Üyelik Bilgileri
« Yanıtla #120 : Mayıs 06, 2017, 14:37:23 ÖS »

Şu başlığı açıldığı günden beri aralıklarla takip ediyorum. Muhabbetler süper. Keşke hepimiz bir arada olsaydık, ne bileyim kafe gibi bir yerde. Muhabbet daha mükemmel olurdu.
Logged

emarti
Uzman
*****
Mesaj Sayısı: 2.592


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #121 : Mayıs 06, 2017, 15:06:16 ÖS »

Eve gidince assembler olarak uzun kod karalayacağım. Uzun kodda birinci benim kaptırmam
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
emarti
Uzman
*****
Mesaj Sayısı: 2.592


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #122 : Mayıs 06, 2017, 20:10:44 ÖS »

Çözümlerim sıra ile

1. BASIC kodum
Kod:
 0 inputa:print(left$("987654321",a))

2. BASIC kodum (alternatif)
Kod:
5999 FOR X=0TO152:READD:POKE49152+X,D:NEXT:SYS49152
6000 DATA 160,192,169,128,32,30,171,160
6001 DATA 0,32,207,255,153,152,192,200
6002 DATA 201,13,208,245,173,152,192,41
6003 DATA 15,141,80,192,160,0,169,0
6004 DATA 153,152,192,200,192,9,208,246
6005 DATA 162,0,32,96,192,173,97,192
6006 DATA 240,248,157,152,192,232,32,96
6007 DATA 192,160,0,185,152,192,205,97
6008 DATA 192,240,243,200,192,9,208,243
6009 DATA 173,97,192,157,152,192,232,224
6010 DATA 9,208,227,169,0,157,152,192
6011 DATA 160,192,169,151,32,30,171,96
6012 DATA 169,0,77,4,220,77,5,220
6013 DATA 77,4,221,109,5,221,77,6
6014 DATA 221,77,7,221,41,15,9,48
6015 DATA 201,57,176,228,141,97,192,96
6016 DATA 66,65,83,65,77,65,75,32
6017 DATA 83,65,89,73,83,73,32,40
6018 DATA 49,45,57,41,32,63,0,13
6019 DATA 0

3. 2. madde BASIC çözümünün assembler hali
Kod:
*=$C000

START
        LDY #>INP
        LDA #<INP
        JSR $AB1E       ;basamak sayisi yazdır

        LDY #$00         ; input
L2      JSR $FFCF
        STA SAYI,Y
        INY
        CMP #$0D
        BNE L2
       
        LDA SAYI
        AND #$0F
        STA BAS+1
       
        LDY #$00        ;sayı data fill $00
L3      LDA #$00
        STA SAYI,Y
        INY
        CPY #$09
        BNE L3

        LDX #$00
ZE      JSR RANDOM
        LDA RANDOM+1
        BEQ ZE          ; ilk rakam 0 olamaz
        STA SAYI,X
        INX
L1      JSR RANDOM
       

AYNISI  LDY #$00        ; aynı rakam olmamalı
        LDA SAYI,Y
        CMP RANDOM+1
        BEQ L1
        INY
        CPY #$09
        BNE AYNISI+2
       
        LDA RANDOM+1
        STA SAYI,X
        INX
BAS     CPX #$09
        BNE L1
        LDA #$00        ;dizi sonu $00
        STA SAYI,X
        LDY #>RET
        LDA #<RET
        JSR $AB1E       ;yazdır
        RTS
RANDOM
        LDA #$00        ; random
        EOR $DC04
        EOR $DC05
        EOR $DD04
        ADC $DD05
        EOR $DD06
        EOR $DD07
        AND #$0F        ; yalnız rakam olmalı
        ORA #$30
        CMP #$39
        BCS RANDOM
        STA RANDOM+1
        RTS

INP     BYTE $42, $41, $53, $41, $4D, $41, $4B, $20, $53
        BYTE $41, $59, $49, $53, $49, $20, $28, $31, $2D
        BYTE $39, $29, $20, $3F, $00
RET     BYTE $0D
SAYI    BYTE $00

Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.787


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #123 : Mayıs 07, 2017, 01:41:09 ÖÖ »

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.

i_r_on her ne kadar senin çözümün algoritma olarak doğru olsa da arada boşlukları geçerli saymak içime sinmiyor. Çıktının tipi string, integer vb önemli değil ama gösterim olarak sayıyı oluşturan rakamların yan yana durması lazım.

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.

Burada da delimawi'ye prensipte katılmakla birlikte soruyu tekrar okuduğumda üretilen sayının ille de sıfır içermesi gerekmiyor. Sıfır içermeyen cevapları geçerli sayacağım.

Bir de @wizofwor merak ettim. Satir numarasindan sonraki bosluk degerlendirmede hesaba katiliyor mu?

Cevapların uzunluğuna CBM prg Studio'da bakıyorum. Satır numarasını ve satır numarasından sonraki boşluğu sayıyor. Ancak şimdiye kadar bu durumdan kaynaklanan foto finiş durumu olmadı. Olsa uyaracaktım.

Konu açılmışken ufak bir not düşeyim. CBM Studio sadece satır toplamlarını veriyor. Karakterleri Sublime Text'de saymak daha pratik ancak Sublime satır sonlarındaki newline karakterlerini de sayıyor ve farklı sonuç buluyor. Programları CBM Studio'da denediğim için CBM Studio'nun yöntemini kullanıyorum.

@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.

Soru "aynı sayıyı üretmemeli" demiyor ama "rastgele bir sayı üretin" diyor.
Logged

emarti
Uzman
*****
Mesaj Sayısı: 2.592


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #124 : Mayıs 07, 2017, 01:52:56 ÖÖ »

@wizofwor seçtiğim rastgele sayıyı üretiyor zaten ...
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.787


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #125 : Mayıs 07, 2017, 01:59:19 ÖÖ »

@wizofwor seçtiğim rastgele sayıyı üretiyor zaten ...


Rastgele:
sf. (ra'stgele) 1. Gelişigüzel: “Bu özü susma ile tanımlamak pek kişisel, rastgele bir yargı kurmak oluyor.” -N. Uygur. 2. zf. (ra'stgele) Seçmeden, iyisini kötüsünü ayırmadan, gelişigüzel, lalettayin: “Asılanları deniz kenarında, rastgele atıldıkları çukurlar içinde kumluğa gömüyorlar.” -N. F. Kısakürek.
http://www.tdk.gov.tr/index.php?option=com_bts&arama=kelime&guid=TDK.GTS.590e5470cce080.17054114
Logged

emarti
Uzman
*****
Mesaj Sayısı: 2.592


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #126 : Mayıs 07, 2017, 02:11:25 ÖÖ »

@wizofwor seçtiğim rastgele sayıyı üretiyor zaten ...


Rastgele:
sf. (ra'stgele) 1. Gelişigüzel: “Bu özü susma ile tanımlamak pek kişisel, rastgele bir yargı kurmak oluyor.” -N. Uygur. 2. zf. (ra'stgele) Seçmeden, iyisini kötüsünü ayırmadan, gelişigüzel, lalettayin: “Asılanları deniz kenarında, rastgele atıldıkları çukurlar içinde kumluğa gömüyorlar.” -N. F. Kısakürek.
http://www.tdk.gov.tr/index.php?option=com_bts&arama=kelime&guid=TDK.GTS.590e5470cce080.17054114


0 inputa:print(left$("987654321",a))

"987654321" gelişigüzel seçilmiş bir dizi. İstersen sıralamaları değiştir. O da rastgele TDK'ya göre. Aynı sayıyı üretmede problem yok ise sorun olmamalı. Gösterilecek sayının kodlayanın yada işlemcinin randomize olarak belirlemesi arasında kurallara ters gelen bir durum göremiyorum.
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #127 : Mayıs 07, 2017, 03:08:54 ÖÖ »

Shift register'lar elimde kaldım valla Levent Kırca'nın banyoda sabunlu kaldığı gibi

Hem etik hem de şimdiye kadarki en kısası sanırım

Kod:
0 inputn
1 fori=1ton
2 c=int(rnd(1)*n):ify(c)then2
5 x=x+i*10^c:y(c)=1:next:printx

ps: tek kusuru var, 1 rakamlı denirse sadece 1 üretiyor Ondan sonrası random sayılır
« Son Düzenleme: Mayıs 07, 2017, 03:14:52 ÖÖ Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #128 : Mayıs 07, 2017, 09:10:04 ÖÖ »

Alıntı
soruyu tekrar okuduğumda üretilen sayının ille de sıfır içermesi gerekmiyor. Sıfır içermeyen cevapları geçerli sayacağım.

@wizofwor, yıtın beni. Kodda ilk hanede kullanılmasın diye yazdığım çözüm pek bir hoşuma gitmişti... Kahkaha

@i_r_on, bu durumda kusur alınmış ve kısaltılmış hali şöyle olsa gerek:

Kod:
0 inputn:fori=1ton
2 c=int(rnd(1)*9):ify(c)then2
5 x=x*10+c+1:y(c)=1:next:printx

Ama hala bu kurallara göre en kısası bu değil bence...



Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
WildLord
Deneyimli
*****
Mesaj Sayısı: 757



Üyelik Bilgileri
« Yanıtla #129 : Mayıs 07, 2017, 11:36:43 ÖÖ »

Upuzun çözümüm

10 input n
15 for i=1 to n
20 x=int(rnd(1)*9):d(i)=x
22 if i=1 and x=0 then goto 20
25 for j=1 to i-1
30 if d(j)=x and i<>j then goto 20
35 next
37 print right$(str$(x),1);
38 next

Yalnız bir şeye takıldım, sayılar stringe çevrilirken neden 2 karakter oluyor acaba? Space + number gibi.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #130 : Mayıs 07, 2017, 16:06:22 ÖS »

@Wildlord : Sayı negatif olursa tüm sayılar için o boşluğu tutmuşlar. Malum C64 basic'te yazdırırken formatlayayım gibi bir lüks yok. Muhtemelen sayılar alt alta yazdırıldığında ilk haneleri hizalansın diye böyle tercih etmişlerdir.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
WildLord
Deneyimli
*****
Mesaj Sayısı: 757



Üyelik Bilgileri
« Yanıtla #131 : Mayıs 07, 2017, 16:09:39 ÖS »

Anladım... O zaman basitçe boşluğu aslında + gibi düşüneyim
Logged
blackturk
Uzman
*****
Mesaj Sayısı: 1.283



Üyelik Bilgileri
« Yanıtla #132 : Mayıs 07, 2017, 17:26:45 ÖS »


0 input n
1 r=int(rnd(1)*9)+1
2 if2^randxthen1
3 print r;
4 x=x+2^r
5 n=n-1:ifnthen1
Kısaltılabilir.Ama Farklı bir çözüm olsun yazıyorum.
Logged

A1200 | APOLLO 1240 32 MB | CNET PCMCIA | SYSINFO SPEED TEST 30 MIPS
SM1,SEGA MEGA CD,SM2,SMS II,Sega Saturn Mod ve AR 4MB,PSX Mod ve Mpeg ,PSX2 ,SNES ,ATARI 800XL,SPECTRUM 128K +2,YAMAHA CX5M MSX,ATARI 520 STFM,1040 STF,C64,C128,1541 II,1571,RAM 1764 ,A500,A500+,A600,A590,IDE68k,2X1084S,1084P
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #133 : Mayıs 08, 2017, 02:53:22 ÖÖ »

itinayla syntax gereksiz biçimde karıştırılır.

Kod:
0 inputa:fori=1toa
1 d%=rnd(1)*9:one(d%)goto1
2 n=n*10+d%+1:e(d%)=1:next:printn
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #134 : Mayıs 08, 2017, 03:33:28 ÖÖ »

Ben bu konuya ve bu soruya fena takıldım. Haftasonu çoluk çocuk geziyoruz, aklımda aynı rakamı içermeyen sayılar dönüp dolaşıyor.
Neyse, son çözümünden "zarif" bir çözüme ulaşabildim sanırım, artık daha da kısalmıyor. İlgilenen arkadaşlar için çözümü ve bu "garip" sonuca nasıl ulaştığımı adım adım yazmak istiyorum.

"zarif" dedim, çünkü son çözümde random number generatorunu istediğimiz koşullara uygun bir rakam gelene kadar defalarca çalıştırıyorduk. İstediğimiz rakam gelmediği sürece kod çalışacağından, algoritmanın çalışma süresi her seferinde farklı oluyordu. Ben çözümde tam istenilen basamak adedi kadar çalışacak bir döngü kurmının daha uygun olacağını düşündüm.

Başlangıç kodum bu:

Kod:
0 fori=0to8:d(i)=i+1:next:inputn
1 forb=1ton:s=int(rnd(1)*(9-b))
2 t=t*10+d(s):d(s)=d(9-b):next:printt

Algoritma aynı kalacağından, bu kod üzerinden nasıl çalıştığını kısaca yazıyorum.
İlk satırda d dizisi içerisine 1,2,3,4,5,6,7,8,9 şeklinde, sonuca giderken kullanabileceğimiz rakamları yerleştiriyorum.
İkinci satırda tam istenilen basamak sayısı kadar çalışacak loop'u kuruyorum.
Her döngüde s değişkeni içerisine rasgele bir değer seçiliyor. Ancak örneğin ilk seferinde 0-8 arası bir değer seçilirken, bir sonraki döngüde 0-7 arası seçiliyor. Çünkü her seferinde seçilebilecek rakam sayısı azalıyor.
Elimizdeki toplam değerini x10 yapıp, bu döngüde seçtiğimiz rakamı ekliyoruz. Dikkat edin, seçtiğimiz rakam, random sonucu elde ettiğimiz değer değil, bu değerin gösterdiği dizi içindeki değer. d(s)
Son olarak artık bu rakam kullanılmış olduğundan, bunu diziden çıkartmamız gerek. Trick şu, dizide bu kullandığımız değer yerine artık bir sonraki döngüde kullanamayacağımız bir değer olan, dizinin sonundaki değeri yazıyorum. Çünkü bir sonraki döngüde rasgele seçilebilir değer bir eksilmiş olacak. Şu an dizinin sonundaki rakamı bir daha kullanamayacak bunu yapmaz isek...

Bir örnek:

Kod:
Döngü Rasgele Değer Dizi      Toplam
                    123456789 0
1     2             12945678  3
2     5             1294587   36
3     0             729458    361
4     0             82945     3617

Şimdi bu kod çalışıyor ama nasıl kısalır? Hedefim tek basic satırına indirgemek. 80 karakterden kısa olmalı...

En çok canımı sıkan kısım baştaki dizi initialize etme kodu.

Kod:
fori=0to8:d(i)=i+1:next

Bundan nasıl kurtulurum? Aklıma şu geliyor. Diziyi başta doldurmasam, yani her eleman 0 olsa, daha sonra dizideki herhangi bir elemanın gerçek değerine erişmek istediğimde, formülü şöyle yazabilirim. Gerçek d(n)=d(n)+n+1 Bu durumda init koduna gerek kalmıyor. Kahkaha Her d(n) gördüğümüz yeri d(n)+n+1 yapıyoruz ve init kodundan kurtuluyoruz, hala çalışıyor, güzel...

Kod:
0 inputn
1 forb=1ton:s=int(rnd(1)*(9-b))
2 t=t*10+d(s)+s+1:d(s)=d(9-b)+9-b-s:next:printt

Şimdi burada dikkatimi çeken, 9-b ifadesi birden çok yerde kullanılıyor. Bunu başta bir değişkene atarsak, biraz daha kısalacak...

Kod:
0 inputn
1 forb=1ton:a=9-b:s=int(rnd(1)*a)
2 t=t*10+d(s)+s+1:d(s)=d(a)+a-s:next:printt

Hala bir satıra sığacak gibi değil, bu 9-b den tamamen kurtulmak lazım. for döngüsünün içine yedirilebilir, ancak 9-b de, b nin işareti - olduğundan for döngüsünü ters çalıştırmak lazım ve step-1 ilavesi gerekecek. Bunun da astarı yüzünden pahalı oluyor. Bu durumda şunu yapıyorum, en azından bu ek değişkenden kurtulmak için aşağıdaki hale sokuyorum. Bir byte kısaldı... Kahkaha

Kod:
0 inputn
1 fora=-8ton-9:s=int(rnd(1)*-a)
2 t=t*10+d(s)+s+1:d(s)=d(-a)-a-s:next:printt

Bildiğim tüm standart optimizasyonları yapıyorum.

Kod:
0inputn:fora=-8ton-9:s=int(rnd(1)*-a):t=t*10+d(s)+s+1:d(s)=d(-a)-a-s:next:printt

Ama olmuyor tam 80 karakter, 1 karakter daha kısaltabilirsem tek basic satırına sığacak... Ah print yerine ? yazabiliyor olsaydık keşke. :/

Bir kaç sayfa önce i_r_on'a söylendiğim rakamlar arasındaki boşluk meselesi kafamda gelip gidiyor. Ve evet t=t*10+ ... hikayesinden bu şekilde kurtulup kısaltabilirim. Ama bir şekilde aralardaki boşlukları yok etmem lazım...

Kod:
0inputn:fora=-8ton-9:s=int(rnd(1)*-a):printd(s)+s+1;:d(s)=d(-a)-a-s:next

Tabi ya, o boşlukları interpretter sayıyı formatlamaya çalıştığı için koyuyordu. Normalde ; ile string yazdırsak yan yana yazacak...
E o zaman, rakamı neden string gibi yazdırmıyorum? Çünkü bir de str$ eklemek lazım ve boşluklar. Ama zaten yazacağımız bir rakam, sayı değil ki. Tek hane. Doğrudan ASCII kodunu basalım gitsin. 0'ın ASCII kodu 48, yani sadece+48 ilave edeceğiz değere.

Kod:
0inputn:fora=-8ton-9:s=int(rnd(1)*-a):printchr$(d(s)+s+49);:d(s)=d(-a)-a-s:next

Evetttt, tam 79 karakter, bir satıra sığdı ve çalışıyor gibi. Kahkaha

İyi geceler.
« Son Düzenleme: Mayıs 08, 2017, 03:38:34 ÖÖ Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
Sayfa: 1 ... 7 8 [9] 10 11 ... 30   Yukarı git
Yazdır
Gitmek istediğiniz yer: