GNU sed, 236 bayt
/^0/bV
:
s/\b9/;8/
s/\b8/;7/
s/\b7/;6/
s/\b6/;5/
s/\b5/;4/
s/\b4/;3/
s/\b3/;2/
s/\b2/;1/
s/\b1/;0/
s/\b0//
/[^;-]/s/;/&&&&&&&&&&/g
t
y/;/1/
:V
s/111/3/g
s/3\b/3:/
s/311/33!/
s/31/3+/
y/3/1/
tV
s/1/+/
y/1:/!0/
/-/{s/-//
y/+!/!+/
}
y/!/-/
Çevrimiçi deneyin!
açıklama
Kodun ilk yarısı (ilk satırdan az), ondalık basamağı tek kelimeye çevirir ve doğrudan “ Sed'de golf için ipuçları ” dan gelir . Sonra, her seferinde bir el ile bir örnek çalışarak göstereceğim, her seferinde dengeli üçlü bir triti çevirir.
Son çıkış önce, üçlü sayı -, 0ve +ile temsil edilir !, :ve +sırasıyla.
İlginç bir sonuç için, başlangıçtan sonra -48( -bozulmamış) birliğe dönüşen ile başlıyoruz . İlk (en sağdaki) paragrafı hesaplamak için, geri kalan 48 ÷ 3 değerini hesaplamamız gerekir. Bunu 111s'yi s ile değiştirerek yapabiliriz 3:
-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333
48 ÷ 3 ' 1ün geri kalanı yok, bu yüzden kalmadı ve ilk adımımızın :(0 için) olduğunu biliyoruz , o yüzden değiştiriyoruz:
-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:
Şimdi "kendi yerlerimiz" var, bu yüzden kalanların 3üçlü yeri temsil ettiğini biliyoruz . Matematiği çalışır halde tutmak için, onları 3'e bölmeliyiz, yani onları 1s ile değiştirin :
-3333333333333333: │ y/3/1/
# => -1111111111111111:
Matematiğimizi iki kez kontrol edelim: 1111111111111111Üçlü yerde 16 (unary ), ve yerde sıfır ( :) aldık . Bu 3✕16 + 1✕0 = 48'dir. Şimdiye kadar çok iyi.
Şimdi tekrar başlıyoruz. S'yi 111s ile değiştirin 3:
-1111111111111111: │ s/111/3/g
# => -333331:
Bu sefer kalanımız şudur 1, bu yüzden +üçlüleri yerleştirip kalanları 3s ile değiştiririz 1:
-333331: │ s/31/3+/; y/3/1/
# => -11111+:
Akıl sağlığı kontrol süresi: 11111Dokuzlar yerinde 5 (unary ) +, üçler yerinde 1 ( ) ve o yerde 0 ( :) var: 9✕5 + 3✕1 + 1✕0 = 48. Harika! Yine 111s'yi s ile değiştiriyoruz 3:
-11111+: │ s/111/3/g
# => -311+:
Bu sefer kalanımız 2 (11 ). Bu iki triti ( +!) alıyor, bu da bizim elimizde taşıdığımız anlamına geliyor. Ondalık aritmetikte olduğu gibi, en sağdaki basamağı alıyoruz ve gerisini sola sütuna ekliyoruz. Bizim sistemimizde bu !, dokuzuncu yere koyduğumuz ve soluna üç tane daha eklediğimiz, daha sonra 27'lerdeki yeri temsil etmek için tüm s'leri 3s ile değiştirelim 1:
-311+: │ s/311/33!/; y/3/1/
# => -11!+:
Artık 3 tane kalmadı, bu yüzden kalan herhangi bir basamak hanesini karşılık gelen değerleriyle değiştirebiliriz. İki ( 11) +!:
-11!+: │ s/11/+!/
# => -+!!+:
Gerçek kodda bu iki adımda yapılır s/1/+/vey/1:/!0/ baytları kurtarmak için. İkinci adım aynı zamanda :s'yi s ile değiştirir 0, yani aslında bunu yapar:
-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0
Şimdi negatif bir sayımız olup olmadığını kontrol ediyoruz. Yapıyoruz, bu yüzden işaretten kurtulmalı ve her basamağı ters çevirmeliyiz:
-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0
Sonunda !s ile değiştiririz- :
!++!0 │ y/!/-/
# => -++-0
Bu kadar!