brainfuck , 474 176 154 151 149 137 bayt
Bir giriş dizesi Alır sekiz 0
ve 1
ilk dahil 0
ondalık noktası için.
(yazıdaki tablonun ikinci sütununda olduğu gibi)
0'dan 9'a kadar olan rakamları çıktılar.
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
Çevrimiçi deneyin!
Algoritma
Belirli bir segmentin durumunu gözlemleyerek, bir dizi olası haneyi daha küçük alt kümelere bölebiliriz. Kodumda kullanılan statik ikili arama ağacı. Sol alt ağaç segment AÇIK durumuna, sağ alt segment KAPALI durumuna karşılık gelir.
0,1,2,3,4,5,6,7,8,9
|
/-------[A]-------------------------\
0,2,3,5,6,7,8,9 1,4
| |
/-------------[B]----------------\ /----[G]----\
0,2,3,7,8,9 5,6 4 1
| |
/--------[E]--------\ /----[E]----\
0,2,8 3,7,9 6 5
| |
/----[F]----\ /----[F]----\
0,8 2 9 3,7
| |
/----[G]----\ /----[G]----\
8 0 3 7
Golf için yararlı bazı gözlemler
- C ve D bitleri gereksizdir ve yok sayılabilir.
- Baştaki sıfır (ondalık nokta için bit) (ab) değer 48 olarak kullanılabilir, bu hem girdi ayrıştırmak hem de çıktı hazırlamak için önemlidir.
- Yaprak ulaşıldığında ve rakam basıldığında, diğer tüm koşulları atlamamız yeterlidir. Veri işaretçisini sıfırlar alanına yeterince geri hareket ettirerek yapılabilir, böylece geri gelemez.
- Uyumluluk için sağda sıfır kullanmak daha iyidir, çünkü bazı BF uygulamaları negatif veri işaretleyicilerini desteklemez.
- Bu nedenle, çıktı değerini en sağdaki hücrede saklamak daha iyidir, böylece sıfırın sağındaki alana kolayca erişebiliriz.
- Bu nedenle bitleri soldan sağa kontrol etmek daha iyidir: A, B, E, F, G, böylece çıkış hücresine daha kolay ulaşabiliriz.
- Farklı rakamlar çıkış kodunu paylaşabilir. Örneğin, 5 ve 6 aynı alt ağaçtadır. Her
+++++
iki değer için ve sonra +
sadece altı için yapabiliriz.
+
Önceden çıkış değerine 2 eklersek komut sayısını azaltabiliriz . Bu durumda 0
, 1
sadece ve sadece azaltmak ve diğer basamaklar için avantaj elde etmek gerekir .