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ı -
, 0
ve +
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 111
s'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ı 1
s 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 111
s 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ı 3
s ile değiştiririz 1
:
-333331: │ s/31/3+/; y/3/1/
# => -11111+:
Akıl sağlığı kontrol süresi: 11111
Dokuzlar yerinde 5 (unary ) +
, üçler yerinde 1 ( ) ve o yerde 0 ( :
) var: 9✕5 + 3✕1 + 1✕0 = 48. Harika! Yine 111
s'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 3
s 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!