Arka fon
Buradaki çoğu insan birkaç tamsayılı temel sistemlere aşina olmalıdır: ondalık, ikili, onaltılık, sekizli. Örneğin onaltılık sistemde, bir abc.de 16 sayısı temsil eder
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Bununla birlikte, biri irrasyonel sayılar gibi tamsayılı olmayan tabanları da kullanabilir. Bu tür temel altın oranı kullanan bir kez φ = (+ √5 1) / 2 ≈ 1.618 ... . Bunlar tamsayı bazlarına benzer şekilde tanımlanmıştır. Bir numara Yani abc.de cp (burada bir karşı e basamak tamsayı vardır) temsil edecek
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Prensipte, herhangi bir basamağın negatif olabileceğine dikkat edin (buna alışkın olmasak da) - bir basamağı olan negatif basamağı temsil edeceğiz ~
. Biz rakamlarından kendimizi kısıtlamak Bu sorunun amacına uygun ~9
üzere 9
, bu yüzden açık bir şekilde (aralarında yaklaşık işaretli) bir dize olarak bir numara yazabilirsiniz. Yani
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
olarak yazılmış olur ~290.~43
. Böyle bir numaraya phinary numarası diyoruz .
Bir phinary sayısı her zaman temsil edilebilir standart form temsil sadece basamak kullanan araçlar, 1
ve 0
içeren olmadan 11
herhangi bir yerde ve isteğe bağlı bir eksi işareti ile tüm sayısı negatif olduğunu gösterir. (İlginçtir ki, her tamsayı standart biçimde benzersiz bir sonlu gösterime sahiptir.)
Standart biçimde olmayan temsiller, aşağıdaki gözlemler kullanılarak her zaman standart forma dönüştürülebilir:
- 011 φ = 100 φ (çünkü φ 2 = φ + 1)
- 0200 φ = 1001 φ (çünkü φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (çünkü φ - 1 / φ = 1)
Ek olarak:
- En önemli basamak ise
~1
(sayının geri kalanı standart formdaysa ), sayı negatiftir ve hepsini değiştirerek1
ve~1
eksi işareti hazırlayarak ve yukarıdaki üç kuralı tekrar uygulayarak standart forma dönüştürebiliriz. standart formu elde edin.
İşte böyle bir normalizasyon örneği: ( her basamak konumunu hizalı tutmak için pozitif basamaklar için ek boşluklar kullanıyorum):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
Verim .-0.0101φ
Daha fazla okumak için Wikipedia'nın konuyla ilgili çok bilgilendirici bir makalesi var.
Meydan okuma
Bu nedenle, ya da başka türlü, (yukarıda açıklandığı gibi) bir phinary sayısını temsil eden bir dize verildiğinde, sıfır ya da son sıfır olmadan, standart biçimini veren bir program ya da işlev yazın. Girdi, mutlaka kritik noktayı içermez, ancak her zaman solundaki basamağı içerecektir (yani hayır .123
). Çıktı her zaman phinary noktasını ve solundaki en az bir rakam içermelidir.
STDIN, ARGV veya function argümanı ile giriş yapabilir ve sonucu geri döndürebilir veya STDOUT'a yazdırabilirsiniz.
Prensipte doğru ve kesin (geçerli) girdiler için kesin olduğu sürece yukarıdaki prosedürden farklı bir algoritma kullanabilirsiniz - yani, uygulamanızı potansiyel olarak kırabilecek tek sınırlamalar, yerleşiklerin boyutu gibi teknik sınırlamalar olmalıdır. veri türleri veya kullanılabilir RAM Örneğin, girişi kayan nokta sayısı olarak değerlendirmek ve daha sonra yavaşça rakamları seçmek yasaktır; zira kayan nokta hatalarının yanlış sonuçlara yol açabileceği girdiler bulunabilir.
Bu kod golf, en kısa cevap (bayt cinsinden) kazanır.
Test Kılıfları
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001