Skip to content

Instantly share code, notes, and snippets.

@roktas
Last active September 15, 2015 10:10
Show Gist options
  • Save roktas/90e3e89ab215651a8c2a to your computer and use it in GitHub Desktop.
Save roktas/90e3e89ab215651a8c2a to your computer and use it in GitHub Desktop.
NYP 2015 final sorusu

Kullanıcıya görüntülenen iletilerin İngilizce olduğu olağan bir Ruby yazılımı düşünün. Örneğin böyle bir yazılımda kullanıcıya görüntülenen bir hoşgeldin iletisi aşağıdakine benzer bir şekilde gerçeklenir:

puts "Welcome!"
=> Welcome!

Türk kullanıcılar gözönüne alınarak yazılımın aynı iletileri Türkçe olarak görüntülemesi için tr adında bir çeviri modülü geliştirileceğini varsayalım. Bu modül kullanıldığında yazılımdaki İngilizce ileti görüntüleyen tüm satırlarda aşağıda örneklenen türde bir değişiklik gerekecektir.

require 'tr'

t = Tr.new
...
puts t.message("Welcome!")
=> Merhaba!

Görüldüğü gibi tr modülü message adında bir metod sunarak çeviri yapmakta ve programın ilk satırlarında Tr.new çağrısıyla önce çeviriler yüklenmektedir. Çevirilerin modülle aynı dizinde bulunan tr.txt adında bir dosyada, her satırda bir İngilizce ileti ve == ayırıcısından sonra çeviri iletisi gelecek şekilde kaydedildiğini varsayıyoruz.

Welcome!==Merhaba!
...

Eğer bir ileti henüz çevrilmemişse çeviri dosyasında yine de tanımlı olmalı fakat çeviri iletisi boş geçilmelidir. Örneğin Untranslated message içerikli bir iletinin henüz çevrilmemişse çeviri dosyasında şu şekilde kayıtlı olduğunu varsayın.

Untranslated message==

message metodu çevrilmeyen bir iletiyle karşılaştığında doğrudan iletinin İngilizce halini görüntüleyecektir. Örnek:

puts t.message("Untranslated message")
=> Untranslated message

a. Bu bilgilere göre tr modülünü gerçekleyin.

b. Çeviri istastiğini görüntülemek amacıyla modüle report adında bir sınıf metodu ekleyin. report metodu şu örneğe uygun şekilde çalışmalıdır.

	require 'tr'
	Tr.report
	=> Toplam ileti sayısı: 10
	=> Çevrilmeyen ileti sayısı: 5
	=> Çeviri oranı: %50

Gerçeklemenizde aşağıdaki ipuçlarını dikkate alın.

  • Modül içinde Tr isimli bir sınıf olmalı ve gerekli tüm nesne metodları bu sınıfta gerçeklenmelidir.

  • Bir dizgiyi ayırıcı bir karakter etrafında ikiye ayırmak için split metodunu kullanabilirsiniz. Örnek:

      "foo:bar".split /:/
      => ["foo", "bar"]
    
  • Bir modülün kayıtlı olduğu dizini öğrenmesi için aşağıdakine benzer bir satırları modül dosyasında bulundurmanız yeterlidir.

      dir = File.dirname(__FILE__) # bu dosya hangi dizinde?
    
# Her sınıfa aynı zamanda birer modül (module) gibi de bakabilirsiniz. Olağan
# "module" ile "class" arasındaki en önemli fark "module"lerin (new yoluyla)
# nesne oluşturmak için doğrudan bir mekanizma sunmamasıdır.
class Tr
# Bu sınıf yüklendiğinde Türkçe çeviri dosyasını da yükle.
#
# Bu işlem initialize'da da yapiılabilir. Fakat sınıf içinde yapılmasının
# yararı sözlüğün nesne oluşturduğumuz her seferde tekrar tekrar yapılmıyor
# olması (performans farkı).
# Boş sözlük açarak başla.
SÖZLÜK = {}
# Şimdi çeviri dosyasını yükleyecek ve ayrıştıracağız.
ÇEVİRİLER = File.join File.dirname(__FILE__), 'tr.txt'
# Satır satır çeviri dosyasında dolaşıyoruz
File.readlines(ÇEVİRİLER).each do |satır|
# İngilizce ve türkçe iletileri ayır. Bakın burada chomp metodu satır
# sonundaki "\n" satır sonu karakterini siliyor. Bu yapılmazsa Türkçe
# çevirilerin sonunda ekstra bir satır sonu olur.
ingilizce, türkçe = satır.chomp.split(/==/)
# Sözlüğe kaydet
SÖZLÜK[ingilizce] = türkçe
end
# Çeviriyi yapan ana metod
def message(ingilizce)
# Verilen İngilizce iletinin Türkçe karşılığını sözlükte bul. Sözlükte
# yoksa nil dönülür, bu durumda verilen ingilizce iletiyi olduğu gibi geri
# dön.
SÖZLÜK[ingilizce] || ingilizce
end
# Raporlama
def self.report
# Sözlük boyutu (toplam anahtar, değer çifti sayısı) toplam çeviri sayısını
# verir değil mi?
toplam = SÖZLÜK.size
# Şimdi çevrilmeyen iletilerin sayısını bulacağız. Sözlükte dolaşırken
# karşımıza anahtar (ingilizce) ve değer (türkçe) ögeleri çıkacak. Değer
# alanında (türkçe) nil görmüşsek bu ögeyi dönüyoruz. Bu şekilde sözlük'ten
# bir dizi elde etmiş olacağız, öyle ki bu dizinin boyutu çevrilmeyen ileti
# sayısını vermiş olacak. Burada görülen select metodunu anlamak için
# lütfen standart Ruby kitaplığını inceleyin. Çok temel bir konudur bu.
çevrilmeyen = SÖZLÜK.select { |ingilizce, türkçe| türkçe.nil? }.size
# Yüzde cinsinden oran
oran = 100 * (toplam - çevrilmeyen)/toplam
# Ve rapor...
puts "Toplam ileti sayısı: #{toplam}"
puts "Çevrilmeyen ileti sayısı: #{çevrilmeyen}"
puts "Çeviri oranı: #{oran}"
end
end
This is a pencil==Bu bir kalem
Ali throw the ball==Ali topu at
Ayşe hold the ball==
# Modülü test etmekte kullanılan "müşteri kodu"
# Normalde modüller Ruby $LOAD_PATH'te tanımlı dizinlerden basitçe 'require'
# diyerek yüklenir. Modül bu dosya ile aynı dizinde ama bu dizin $LOAD_PATH'te
# tanımlı olmadığından require hata verir. Test kodumuzun çalışması için başka
# bir yöntem kullanıyoruz: require yerine require_relative.
# Modülü bulunduğumuz dizinden yükle
require_relative 'tr'
# Çevirmeni oluştur
tr = Tr.new
# Örnek kullanım
puts tr.message 'This is a pencil'
puts tr.message 'Ali throw the ball'
puts tr.message 'Ayşe hold the ball'
puts
# Çeviri raporu
Tr.report
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment