VI, 108 bayt
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>
<CR>olduğu Enterfelç, <C-?>karşılık gelir Control + ?ve <Esc>karşı Escapebelli. Bunların her biri 1 bayt için sayılır (bkz. Meta ). Çözeltideki satır sonları okunabilirlik içindir. Sadece <CR>gerçek Entervuruşları temsil eder .
Giriş
Giriş dosyası temsil eden sadece 1 karakter içermelidir n.
Başlatmak
VI şöyle başlatılmalıdır:
vi -u NONE input
açıklamalar
Çözümde 3 bölüm var. Açıklamak en kolay olduğu için ilk önce 2. bölümü (2. satır) anlatacağım.
Güneş çizim
Güneşi çekme emri:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Güneş ile çizilmelidir , *, 0, 1ve 3bu gibi:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Bir simetri, bu bölümün bayt boyutunu azaltmaya yardımcı olabilirdi, ama o kadar önemli değil. Tam satır açıklar, ancak model *****kolayca son hattı üretmek için kullanılır, ve desen **1110333**içeren 3 diğer çizgilerini oluşturmak için bir referans olarak alınmıştır 0, 1ve 3.
Kullanımı önemlidir 0, 1ve 3doldurulabilir güneş parçaları (sonraki açıklamalara bakın) için. Bu güneşin çekilmesi 55 byte alır ve muhtemelen bazı numaralarla oynanabilir.
Güneşe göre doldurma n
Güneşi doğru şekilde doldurmak için izlenmesi gereken talimatlar:
- eğer
n = 0öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmeli
- Eğer
n = 1, daha sonra 1değiştirilmelidir diğer basamağı ile,*
- eğer
n = 2öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmeli*
- Eğer
n = 3, daha sonra 3değiştirilmelidir diğer basamağı ile,*
- eğer
n = 4öyleyse 0, 1ve 3(tüm basamaklar) ile değiştirilmelidir (gibi n = 0)
Bundan, gerekli ikamelerin:
- bazı basamakları değiştir
( ilk seçenek )
- diğer tüm basamakları yerine koy
*( ikinci ikame )
"Bazı rakamların" "rakam yok" anlamına gelebileceğini unutmayın ( n = 2örneğin). Ve "tüm diğer basamaklar", tüm basamaklar zaten ilk ikame ile değiştirilmişse ( n = 0örneğin) "basamaksız" olarak da gösterilebilir .
İkinci ikame kolaylıkla yazılabilir 11 bayt :
:%s/\d/*/g<CR>
İlk ikame bağlıdır nbu yüzden ilk biz basamak değiştirilmesi için neler olduğunu hesaplamak zorunda. Değiştirilen karakterler kayıt defterinde saklanırsa a, ikame komutu 11 baytta da yazılır :
:%s/<C-r>a/ /g<CR>
<C-r>aaKomut yazıldığında kayıt içeriği ile değiştirilir .
Değerini hesaplamak için aönceki talimatları izleyerek algoritma şu şekildedir (sözde kodda):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"dize kullanılır, çünkü ne zaman n = 2hiçbir basamak boşluk bırakmaz. İlk ikame hiç bir şey yapmazsa, güneş olmayan herhangi bir ip burada kullanılabilir.
Bu 31 bayt ile yazılabilir :
D # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
:let@a= # define register "a content
@"%2 # if (n % 2 != 0)
? # then
@" # n
: # else
@"%4 # if (n % 4 != 0)
? # then
"X" # "X"
: # else
"\\d" # "\\d"
<CR> # calculate "a
Çözüm
Tüm bu parçaları doğru sıraya koyun ve çözüme kavuşun:
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR> # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR> # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR> # replace the remaining digits with stars