Emeğine sağlık Ali hocam...
Belki bunu karekod veya başka bir grafiksel kodlamaya uyarlayabiliriz. Sanırım ülkemizde QR Code denilen karekod uygulaması çok yaygın.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
November 18, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Emeğine sağlık Ali hocam... Belki bunu karekod veya başka bir grafiksel kodlamaya uyarlayabiliriz. Sanırım ülkemizde QR Code denilen karekod uygulaması çok yaygın. -- |
November 17, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Forumlarda hep "çalışma olarak hangi programı yazmamı önerirsiniz" gibisinden konular açılır. Aşağıdaki yazıya şu adreste rastladım: http://codingdojo.org/cgi-bin/wiki.pl?KataBankOCR O sitede bunun gibi başka çalışma konuları da var. Yukarıdakini aşağıdaki gibi çevirdim. İlginç bir problem. Ali Bu çalışma (kata) Emmanuel Gaillot ve Christophe Thibaut tarafından XP2006 sırasında sunulmuştur. Problem Kullanıcı isteği (User Story) 1 Bir bankada çalışıyorsunuz. Bu bankada şubelerden gelen mektupları ve faksları okuyabilen akıllı bir alet kullanılıyor. Bu alet kağıt belgeleri okuduktan sonra içinde aşağıdaki düzendeki verilerin bulunduğu bir dosya üretiyor: ' | | |||| |_ ||||| ' Her veri 27 karakterlik dört satırdan oluşuyor. Verinin ilk 3 satırı, alt çizgi ve düşey çizgi karakterleri ile belirtilmiş olan hesap numarasını içeriyor; dördüncü satır 27 adet boşluk karakterinden oluşuyor. Hesap numaraları 0-9 rakamlarını içeren 9 haneden oluşuyor. Normal bir dosyada 500 kadar hesap numarası bulunuyor. İlk işiniz hesap numaralarını o düzendeki dosyadan okumak. Kullanıcı isteği 2 Birinci işi hallettikten kısa bir süre sonra bu aletin hatalı okuyabildiğini farkediyorsunuz. Şimdiki işiniz, okunan hesap numaralarının geçerli olup olmadıklarını denetlemek. Geçerli hesap numaraları aşağıdaki hesaba (checksum) göre belirlenebiliyor: ' geçerlilik hesabı: (Çevirenin notu: Yukarıdaki 'mod' % işleci anlamında.) O hesabı gerçekleştirerek okunan hesap numaralarının geçerli olup olmadıklarını belirleyin. Kullanıcı isteği 3 Patronunuz programın sonuçlarını aşağıdaki düzendeki bir dosyaya yazmanızı istiyor: ' Yani her satırda tek hesap numarası var. Okunamayan karakterler soru işareti ile belirtiliyorlar ve satırın sonuna "illegible" (okunamayan) anlamında ILL yazılıyor. Numara geçersiz olduğunda da "error" anlamında ERR yazılıyor. Kullanıcı isteği 4 Numara ERR veya ILL olarak geldiğinde bunun genellikle tek alt çizgi veya tek düşey çizgi okunamadığı zaman olduğu farkediliyor. Örnek: ' ||||| || ||_ | | ||_ ' Eğer tek | okunamadıysa 9 aslında 8 olabilir. Veya 0'lardan birisi 8 olabilir. Veya 1, 7 olabilir. 5 okunan aslında 9 veya 6 olabilir. Şimdiki işiniz, ERR veya ILL olarak gelen numaraların yalnızca tek alt çizgi veya düzey çizgi eklendiğinde veya çıkartıldığında geçerli olup olmadıklarına bakmak. Bu işlem sonucunda geçerli olabilen eğer tek numara varsa o numarayı doğru kabul edin. Eğer birden fazla geçerli numara olabiliyorsa numarayı "ambiguous" (belirsiz) anlamında AMB olarak işaretleyin. Eğer tek çizgi ekleyerek veya çıkartarak hiç geçerli numara bulunamıyorsa durumu ILL olarak belirtin. İpuçları 3'e 3'lük hücrelerin okunaklı olmaları için kod içinde 3 satır olarak yazılmaları önerilebilir. Hücreler programda öyle ifade edilmiyor olsalar bile kod içinde şunu görmek:
şundan çok daha okunaklı olacaktır:
(Çevirenin notu: D'de yukarıdaki gibi kullanımlarda + işlecinin karşılığı ~ işlecidir.) (Çevirenin notu: Yazının başında XP2006 yazıldığı halde aşağıda XP2005 geçiyor.) Christophe ve Emmanuel bu çalışmayı XP2005'te sundukları zaman döngü (iteration) değil, özyineleme (recursion) üzerine kurulu olan bir çözüm üzerinde çalışmışlardı. Çoğu insana döngüler özyinelemeden daha anlaşılır gelir. Bu çalışmayı iki yöntemle de deneyin. Dikkat edilmesi gereken noktalar:
Test verileri Aşağıdaki örnekleri kopyalarken satır sonlarına rastlayan boşluk karakterlerinin de kopyalandıklarından emin olun. kullanıcı isteği 1 ' | || || || || || || || || | => 000000000 | | | | | | | | | => 111111111 | | | | | | | | | => 222222222 _| _| _| _| _| _| _| _| _| => 333333333 |||||||||||||||||_| => 444444444 |_ |_ |_ |_ |_ |_ |_ |_ |_ => 555555555 |_ |_ |_ |_ |_ |_ |_ |_ |_ => 666666666 | | | | | | | | | => 777777777 |||||||||||||||||| => 888888888 |||||||||||||||||_| => 999999999 | | |||| |_ ||||| => 123456789 kullanıcı isteği 3 ' | || || || || || || ||_ | => 000000051 ||||| || ||_ | | | _ => 49006771? ILL | | ||| _ | ||||| => 1234?678? ILL kullanıcı isteği 4 ' | | | | | | | | | => 711111111 | | | | | | | | | => 777777177 || || || || || || || || | => 200800000 _| _| _| _| _| _| _| _| _| => 333393333 |||||||||||||||||| => 888888888 AMB ['888886888', '888888880', '888888988'] |_ |_ |_ |_ |_ |_ |_ |_ |_ => 555555555 AMB ['555655555', '559555555'] |_ |_ |_ |_ |_ |_ |_ |_ |_ => 666666666 AMB ['666566666', '686666666'] |||||||||||||||||_| => 999999999 AMB ['899999999', '993999999', '999959999'] ||||| || ||_ | | ||_ => 490067715 AMB ['490067115', '490067719', '490867715'] | | |||| | ||||| => 123456789 | || || || || || || ||_ | => 000000051 ||||| |||| | | | _ => 490867715 -- |
November 17, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Hmmm... Forum programı sanırım boşlukları yutuyor. Boşluk yerine # karakterini kullanarak aşağıdaki gibi göstereceğim: Ali -- |
November 18, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Gerçekten ilginç bir problem. Paylaşım için teşekkürler.
'** Bu 9 kareden oluşan hücrelerde boşlukları noktayla gösterince bunun gibi bir şekil ortaya çıkıyor. Benim ilk aklıma gelen çözüm örneğin boşlukları 0, dikey çizgileri 1, yatay çizgileri 2 olarak okutabiliriz diye düşündüm. **'
'** -- |
November 18, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to erdem | Sizce dikey ve yatay diye iki tanımlama yapmak şart mı? Çünkü ternary ifadeler bizi zorlayabilir. Oysa basit bir 32 bitlik integer ile nokta ve boşluk (1 & 0) şeklinde binary ile ifade edebiliriz. Nasıl olsa bunlar 7-segment olduğu için dikey/yatay ayrımı gerektiğinde (örn. kullanıcı arabiriminde) dönüştürebiliriz. Ne dersiniz? Böylece bir tane uint[5] dizi içinde verileri işleyebiliriz... -- |
November 18, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | O ipucunu farketmemişim. Zaten her satırda aralarındaki boşluklar ile beraber 36 karakter varmış. Bu da long türü kullanma gerekliliğini getirir. Peki cevabını vereceğim başka bir soru sorsak ve her karakteri byte ile ifade etmiş olsaydık yapabilir miydik? Örneğin şunu: '001 Açıkça belli oluyor ki 3 kere 3, 9 olduğuna göre ve 1 byte da 8 bit ifade edilebileceği için olmaz...:) Ama hepsinde 1 ortak nokta var ki o da tüm rakamların sol üst köşelerinin boşluk olması. Bu da bize her rakam byte ile ifade edilebilirliğini gösteriyor. Döngüler de ise 0'dan değil belki de 1'den başlatırız, olur biter. Ne dersiniz? Bu durumda yukarıdaki örneğin char karşılığı ne olur biliyor musunuz! Kırkdokuz yani 1 (0b0100_1001) -- |
November 18, 2012 Program fikri: Banka hesap numarası okuma | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Rakamları iki boyutlu düzlemden okumak baştan zor gibi geliyor ama verdikleri ipucu bunun aslında çok basit bir işlem olabileceğini gösteriyor. Evet, yine iki boyutlu bir girişten okunuyor ama okunduktan sonra her rakam üç satırının art arda yazılmışı olarak gösterilebiliyor. İpucundaki 4'te olduğu gibi:
Ali -- |