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 Enter
felç, <C-?>
karşılık gelir Control + ?
ve <Esc>
karşı Escape
belli. Bunların her biri 1 bayt için sayılır (bkz. Meta ). Çözeltideki satır sonları okunabilirlik içindir. Sadece <CR>
gerçek Enter
vuruş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
, 1
ve 3
bu 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
, 1
ve 3
.
Kullanımı önemlidir 0
, 1
ve 3
doldurulabilir 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
, 1
ve 3
(tüm basamaklar) ile değiştirilmeli
- Eğer
n = 1
, daha sonra 1
değiştirilmelidir
diğer basamağı ile,*
- eğer
n = 2
öyleyse 0
, 1
ve 3
(tüm basamaklar) ile değiştirilmeli*
- Eğer
n = 3
, daha sonra 3
değiştirilmelidir
diğer basamağı ile,*
- eğer
n = 4
öyleyse 0
, 1
ve 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 n
bu 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>a
a
Komut 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 = 2
hiç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