Bu, Noel kutlamaları arasında, üzerinde ve dışında çalışmak için eğlenceli bir mücadele oldu. Gönderdiğiniz için teşekkür ederiz! Golf oynamak ilginçti, çünkü şartnamede birçok koşul gerektiren özel durumlar ve istisnalar vardı. Bu zamana ve ondalık dönüştürmek gerek yoktu Ayrıca, süre, ben yaptım her sayıda basamak en çok sayıda ve her yerde basamak büyük değerini belirlemek için bir çeşit “max” fonksiyonu gerekir.
Bunun ilk sürümü 4844 bayttı , sadece size ne kadar golf oynadığımı anlamanız için.
Program girdiyi virgülle ayrılmış bir tamsayı listesi olarak bekliyor . Boşluk veya yeni satır yok. Bunları kullanmak tanımsız davranışlar üretecektir.
' '' '' ''' "" ' ''' "" ' ''' "" ' '' ' ' '' '' '''' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" ' ''' "" ' ''' "" ' '' " ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '"" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" '" "" "" "" " ' '' ' ' '''' ' ' '''' ' ' '''' '' '' ' ' '''' '''" " ' '''" "' "" ' ''' "" ' ''' "" ' '' ' ' '' '' ' ' '' '' '''' '''' '' '' '' "' '' ''"" "' '' ' ' '' '' '''' '' '' ''" ' '' ' ' '''' "' '' '' ''"' '' '' '' '' ' '' ' ' '' '' ' ' '''' '' '' ' ' '''' ' ' '''' '''' '' '' '' '' " ' '' ''' "" "" "" ' ''' "" ' '' "' '' '' '' ' ' '''' ' ' '''' ' ' '''' "' ''"'""" "" "" "" ' '' '' ''' "" "" "" ' ''' "" " ' '''" "" "" "" ' ''' "" " ' '' ' '' '' ' ' '' '' '''' ' ' '''' ''' "" "" "" "" ' '' '' '' ' ' '''' "' ''" ' '' '' ''' "" ' ''' "" ' '' ' ' '' '' '' '''' '' '' ''' "" ' ''' "" '""" ' '' '' ''' "" "" "" ' '' ' ' '' '' '' '''' '' '' ''' "" "' ''"' '' '' "" ' '' ' ' '' '' '' '''' ''' "" "" "" ' ''' "" ' '' "' '' '' "' '' '' ''" ' '' '' '' ' ' '' ' ' '' '' '''' '''' '' '' '' "' '' '' '' "' ''"' ''"" " ' '' '' '''" "" ' ''' "" "" "" "' '' ' ' '' '''' '' '' ' ' ''''"' '' ' '' ' ' '' '' '' '''' ''' "" "" " ' '' '' '' '''" "" "" "' '' '' ''"' '' " ' '''" "" "" "" ' '' '' '' "' '' "' '' '' '' ''" ' '' '' '' ''"' ''"" "" "' '' '' ''"' '' ' ' '' ' ' '' '' '' '' ' ' '''' '' '' '''' '''' '' ' '' '' '' ''' "" " ' '' '''" "" " ' '' '' '''" "' '' ' ' '''' ' ' ''''"' "" ' ''' "" ' ''' "" "' '' ''" ' '' '' '' ' ' '' '' '''' "' '' ' ' ''''"" "" "" ' ''' "" " ' '' '''" "" " ' '' '' ' ' '' '' '''' ' ' '''' ' ' '''' " ' '''" " ' '' ' ' '' '' '''' ' ' '''' ' ' '''' '''" "" "" "" ' '' '' ''' "" ' '' ' ' '''' '' '' ''' "" ' '' "' '' "' '' ''" ' '' '' ''"' '' '' "" ' '''" "" ' '' '' '' ''' "" "" "" " ' '''" "" ' '' '' '' '' "' '' '' ''" "' '' '' '' ' ' '' '' '''' ' ' '''' ' ' '''' ' ' ''''" ' '' "' '' '' '' '' ' '' '' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ''' "" "" "" "" " ' '' ''"" "" ' '' '' '' ''' "" "" "" "' '' '' ''" ' '' "' '' '' '' ''"' '' '' '' " ' '''" " ' '''" "" ' '' '' ''' "" ' ''' "" ' ''' "" "'" ' '' '' '' '' "' "" ' '' '' '' ' ' '' '' '' ' ' '''' '''' '' '' '' ''' "" ' ''' "" """"" ' '' '' '' ' ' '''' ''' "" "" ' '' '' ''' "" "" "" " ' '''" "" ' '' ''" "" "" ' '' '' '' '' ' ' '''' '' '' ''' "" "' ''" ' '' '' '' '' ' ' '''' "' "" "" "" "' '' '' ''" ' '' "' '' "' '' '' '' '' ' ' '''' ' ' '''' ''""" " ' '' '' '' ' ' '''' '''" "" ' '' '' '' ''' "" " ' '''" "" "" "" ' ''" "" "" ' ''' "" " ' '' '' '' '''" "" "" "" "' ''" ' '' '' '' "' '' '' '' '' ' '' "' '' '' '' '' "' '' '' ''" ' '' '' ''"' '' "' '' '' '' ''" ' ''' '' '' '' "' '' "' '' '' '' ' ' '''' ' ' '''' ' ' ''''" ' '' ' ' ''''"' " "" "" "" ' ''' "" ' ''' "" ' ''' "" " ' '' '' '' ' ' '' '' '' '''' '''" "" "" "" ' ''' "" ' ''' "" ' ''' "" " ' '' '''" "" "" "" "" ' '' '' '' ''"' ''' "" "" " ' '' '' '' ' ' '' '' '''' ' ' '''' '''" "" "" "" " ' '' '' '' " ' '''" " ' '' ' ' '' '' '''' '' '' '''" " ' '' ' ' '' '' '' '''' '' '' '' ' '' '' '' ' ' '''' ''' "" "' '' '' '' ''"' '' '' '' ' ' '''' ' ' ''''" ' '''" "" "" "" ' ''' "" ' '' "' '' ' ' '' '' '' '' ' ' '''' '' '' ''''" " ' '' ' ' '' '' '' '''' '''" "" "" " ' '' '' '' ' ' '''' '''" "" "" "" "' "" "" "" " ' '' '' '' ' ' '''' '''" "" ' '' '' "' '' '' ''" ' '' '' ''' ''' "" ' '' ' ' '''' '' '' ''' "" ' ''' "" "' '' ' ' '' '''' ''"' '' '' " ' '' '' '''" "" "" "" ' ''' "" " ' '' '' '' '''" "" "" "" ' '' '' '' "'" "' '' ' ' '' '' '''' '' '' ' ' '''' ' ' '' ' ' '' '' '' '''' '' '' ''''" ' '''" "" ' '' "' '' '' ' ' '' '' '' ' ' '' '' '''' ' ' '''' '''' "' ''" "" "" ' ''' "" ' '' ' ' '' '' '''' '' '' ''' "" ' '' ' ' '''' '' '' ''' "" "" "" " ' '''" "" ' '' '' '' '' ' ' '''' '' '' ''' "" " ' '' '' '''" """" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" ' ''' "" ' ''" ' '' "' '' "' ''" ' '' '' '' ''"' '' '' "' '' '' '' ' ' '' '' ''''" ' '' " ' ''' "" "" "" " ' '''" "" ' '' '' '' ' ' '''' ' ' '''' "' '' "' ''"'""" "" "" "" ' '' '' '' ' ' '''' ' ' '''' ''' " ' '' '' '' ' ' '' '' '' '''' "" ' '' "' '' '' '' '' ' ' '' '' '' '''' '' '' '' ' ' '' '' '' '''' '' ''" "' '' '' ''"' '' " ' '' '' '' '' ' ' '' '' '' ' ' '''' ' ' '''' '''''"" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' '' " ' '' ' ' '' '' '''' '' '' ''' "" " ' '' '' '' '''" "" "" " ' '''" " ' '''" "" ' '' '' "' '' '' '' "' ''" "" " ' '''" " ' '' ' ' '' '' '' '''' '' '' '''" " ' '''" "" ' '' '' '''"" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" ' '' "' ''"
açıklama
Belirli bir girişi nasıl işlediğini göstererek programın nasıl çalıştığını anlatacağım 202,100,1
.
Başlangıçta, daha sonra ihtiyaç duyacağımız birkaç değer oluşturuyoruz - çoğunlukla çıktı alacağımız karakterlerin ASCII kodları.
Gördüğünüz gibi '8'
ve '.'
zaten hazırsınız. '|'
Ancak, aslında 14 değil, 14'tür. 124'ü almak için # 1 yuvasına geçici değeri iki kez eklemek için bir süre döngüsü kullanıyoruz (bu süre 14 + 55 × 2'dir, çünkü süre döngüsü 56−1 için = 55 iterasyon). Bu, bazı baytları kurtarır, çünkü 124 gibi büyük tamsayı değişmezleri gerçekten uzundur. Aşağıdaki diyagramda, programın kullandığı her değişkenin konumunu gösteriyorum.
Daha sonra, tüm karakterleri girmek ve bunları # 12 hücresinden başlayarak kasette depolamak istiyoruz ( p bunun için çalışan göstericidir). Aynı zamanda, en uzun sayının ne kadar olduğunu bilmek istiyoruz (kaç basamak). Bunu başarmak için, # −1 hücresinden başlayarak sola doğru giden bir toplamı tutarız ( çalışma işaretçisi olarak q kullanırız ). İlk giriş numarasından ( 202
) sonra, şerit şu şekilde görünür:
Sayıların 4 ile kapalı olduğunu fark edeceksiniz. Peki, ilk girdiğimizde, ASCII değerleridir, bu nedenle 48 ile "kapalı" olurlar ve virgül 44'dür. Her karakter için, 46 '.'
içine r ve daha sonra (45 çıkarır) bir süre döngü ile çıkarma ve sonra biz biz koşullu kullanabilmesi virgül (bizim ayırıcı), 0'dır böylece onu tanımak için emin 1. ekleyin.
Ayrıca, # 11 hücresini 0'da bıraktığımızı fark edeceksiniz. İlk sayının sınırlarını tanımamız gerekiyor.
Bir sonraki karakter virgül olacaktır, bu nedenle # 15'te 0 saklıyoruz, ama elbette bu sefer q ilerlemiyoruz . Bunun yerine, q'yı 0'a geri ayarladık ve yerleştirdiğimiz 1'lerin “üzerine yazmaya” başladık.
Kalan tüm karakterler işlendikten sonra, şunu elde ederiz:
Gördüğünüz gibi, q ile yazılan 1'ler şimdi (unary) en uzun sayının uzunluğunu gösterir.
Şimdi q'yi en sola hareket ettirmek için bir while döngüsü kullanıyoruz ve sonra r2 olarak adlandıracağım başka bir işaretçiyi yerleştiriyoruz . R2'nin amacı daha sonra netleşecektir.
Bu noktada, bunun boyunca kullanacağım terminolojiyi açıklayayım.
- Tarafından sayısı , bir virgül ile ayrılmış giriş numaralarının bir ortalama. Örneğimizde, 202, 100 ve 1'dir.
- By rakam , ben numaralarının belirli birinde tek bir rakamı anlamına gelir. İlk rakamın 3 rakamı var.
- By yerde ben “Mevcut yerde rakam” demek ve mevcut yer olanları yer ise, ben vb So olanlar yer, onlarca yer, yüzlerce yerde, Yani o rakam ki, 2 0, ve 1 sipariş.
Şimdi düzenli programlamaya geri dönelim. Programın geri kalanının tamamı, # 0 hücresine ulaşana kadar q ileri hareket eden büyük bir döngüdür . Yol boyunca hücrelerin her biri, en sağda olanlar yer olan bir yeri temsil eder ve q en belirgin şekilde başlayacaktır. Örneğimizde, burası yüzlerce yer.
Hücre q puanlarını artırarak devam ediyoruz (yani, * q ).
Şimdi yüzlerce yer için “aşama 2 ”'deyiz. Bu aşamada, yüzlerce yerdeki tüm basamaklar arasında en büyük hanenin ne olduğunu bulacağız. Bunun için aynı unary sayma hilesini kullanıyoruz, ancak bu sefer işaretçi r olarak adlandırılır ve işaretçi r2 bir sonraki sayıya geçtiğimizde sıfırlamak zorunda olduğumuz başlangıç konumunu işaretler.
İlk numaradan başlayalım. Biz ayarlayarak başlar p 11 (tüm sayıların sabit kodlanmış başlangıç pozisyonu) için. Daha sonra sayının sonunu bulmak için bir while döngüsü kullanıyoruz ve konumu işaretlemek için p2'yi oraya ayarlıyoruz . Aynı zamanda, q2'yi 0'a ayarladık :
Q2'nin varları gösterdiği gerçeğinden rahatsız olmayın . Orada boş bir hücre dolgusu yok, çünkü # 0 hücresini yalnızca sıfır olduğu için tespit edebiliyoruz.
Daha sonra, * p sıfır olana kadar p ve q2 'yi azaltarak mevcut sayıdan geçiyoruz . Her yerde, * q2 değeri bize ne yapmamız gerektiğini söyler. 1 “hiçbir şey yapma” anlamına gelir, bu yüzden devam ediyoruz. Sonunda # 2 numaralı hücrede 2 ile karşılaşıyoruz. Her seferinde * q2 1'e eşit değildir, q2 her zaman q'ya eşittir .
Daha önce de belirtildiği gibi, 2. aşama “bu yerdeki en büyük basamağı belirlemek” dir. Belirlediğimiz Yani r için r2 , eksiltme için bir while döngüsü kullanmak * p ve hareket r leftwards ve hareket etmek döngü sırasında başka kullanmak sonra 1'ler bandı dolgu ve r sağ ve artım için arka * p değeri tekrar geri yükleyin. Her while döngüsünün, kullandığımız değerden daha az yinelemeyle çalıştığını unutmayın; Bu nedenle, yazılan 1 sayısı rakamdan daha fazla 3 (4 yerine) olacak ve * p olarak geri kaydedilen son değer 2 olacak. Böylece, bu etkili bir şekilde * p'yi 2'ye düşürmüştür .
Ondan sonra p'yi p2 değerine ayarladık ve sonra hepsini tekrar yaptık. İkinci kez, q2'yi 0'a ayarlayın , p'yi sağa hareket ettirerek sayının sonunu bulun ve ardından p ve q2'yi birlikte azaltarak bu sayının rakamlarını izleyin . Bir kez daha 2 numaralı hücrede 2 ile karşılaşacağız ve 1 r'den * kalanını yazacağız .
Üçüncü sayı söz konusu olduğunda, yüzlerce yeri olmadığı için hiçbir şey yapmayız (böylece q2 asla q'ya ulaşmaz ), ancak bu tamamdır, çünkü bu maksimum rakam değerinin hesaplanmasını etkilemez.
Ayrıca burada etiketlenmemiş bir okla işaretlediğim hücreyi * (r - 4) 1 olarak ayarladık ( zaten 1 olsa bile). Nedenini henüz söylemeyeceğim, ama belki de çoktan tahmin etmişsindir?
Bir sonraki * q artışı bizi “o anki yerdeki tüm rakamlardan maksimum basamağı çıkarmak” olan 3. aşamaya götürür. Daha önce olduğu gibi, p'yi 11 ve q2'yi 0'a sıfırlıyoruz ve ardından önceki aşamada yaptığımız gibi tüm sayıları geçiyoruz; bu süre dışında, 2 yerine * q = 3, q2 q ile her karşılaştığında ve p yüzlerce yerde olduğunda, * p'yi * r2 (5) ' in kalan bloğunda 1s olduğu kadar * p azaltmak için bir süre döngüsü kullanırız. Örneğimizde) r kullanarakçalışan bir işaretçi olarak. Aslında bunu bir kez daha azalttık, böylece en büyük rakam −2'de biter, daha sonra netleşecek bir neden için:
Tüm sayıları işledikten sonra, şimdi aşama 3'ün sonundayız. Burada iki tekil şey gerçekleştiriyoruz.
- İlk olarak, aynı zamanda büyüklüğü çıkarma r dan -bloku (artı 1) * q , fakat r2 olan solda yaprakları bu işaretçi. * q bu şekilde negatif olur. Bizim durumumuzda, r- bloğunun beş 1'i vardır, yani * q −3 olur.
- İkinci olarak, bir değişken set üzerinden şimdi çıkış safhaya giriyoruz belirtmek için sıfır olmayan bir değere. (Teknik olarak, * q değerinin negatif olması zaten çıktı aşamasını gösterir, ancak bunun kontrol edilmesi çok zordur, dolayısıyla ekstra değişken.)
Artık, biz numaralar geçiyor tutmak olduğunu anlamak (olmayan 1 değeri ile gösterilen cari yer bulmak * q Her numara içinde) ve değerine bağlı olarak bir şeyler yapmak * q . Biz görüyoruz * q , ardından 3 (buradaki tüm rakam maksimum haneli değerini çıkarmak) ilk 2 (= hesapla maksimum rakam değeri) artırılır ve bunun olumsuz yapmak için gelen sonra çıkarma. Oradan, 1'e ulaşana kadar artmaya devam eder, böylece “hiçbir şey yapmaz” anlamına gelen değeri geri kazanır. Bu noktada, bir sonraki yere geçiyoruz.
Şimdi, * q negatif olduğunda, çıkıyoruz. * q tam olarak doğru değerdedir, böylece 1'e ulaşmadan önce doğru sayıda satır satırı çıktısını alacağız; en büyük rakam 2 ise, 3 satır çıkmamız gerekir. Her bir q * değerinde ne olduğunu görelim :
- * q = −2:
- İlk sayı için, * p −2'dir, bu bir
'.'
(nokta) veya bir ':'
(iki nokta) çıkmamız gerektiğini belirtir . Hangisine q ile bakarak karar veriyoruz : if1 ise, o sırada biziz, yani a ':'
( '8'
+2 olarak hesapladığımız ), yoksa a '.'
.
- İkinci sayı için, * p −3'tür. −2 olmayan herhangi bir şey bir
'|'
(boru) çıktığı ve ardından değeri artırdığımız anlamına gelir . Bu şekilde doğru yerde −2 değerine ulaşacak ve daha sonra bu rakamın geri kalanı için '.'
s / ':'
s çıktısı alacağız .
- Her durumda, sayıyı işlemeden önce pd değişkenini 0 olarak ayarladık ve bir karakter yazdırdığımızı belirtmek için pd'yi (= “yazdırıldı”) sıfır olmayan bir değere ayarlayın.
- Üçüncü sayı için, üçüncü sayı yüzlerce yere sahip olmadığından işlem gerçekleşmez. Bu durumda, pd hala biz hala çıkış bir gerek olduğunu belirten numarayı işledikten sonra 0 olacaktır
'|'
(ama sadece dışarı aksi takdirde evre 2 veya 3'te hala, çünkü, bir sıfır olmayan).
- Tüm numaraları işledikten sonra eğer dışarı sıfırdan, çıktı bir satır olduğunu. Not ihtiyacımız olduğunu dışarı sahneye 2 veya 3 çıkış içinde satırsonu yok ki değişkeni.
- * q = −1: Her ikisi de ilk iki sayı için * p −2olması dışında, öncekiyle aynıdır, bu nedenle her ikisi de a çıkışını verir
'.'
(ve üçüncü çıkış'|'
eskisi gibi olur).
- * q = 0: Ne zaman * q 0, bu vasıta “Biz olanları yerdesiniz eğer bir satır aksi takdirde çıkışı hiçbir şey
'|'
s bakılmaksızın * p ”. Bu sayede rakamlar arasındaki dolguyu yakalarız.
Şimdi q , bir sonraki yere, onlarca yere ve orada * q olana ilerlemek için artarız . Aşama 2'nin başında, kaset şöyle görünür:
Ardından 2. Aşama'yı önceki gibi yaparız. Unutmayınız ki, bu yerdeki her haneden 2'yi çıkarır ve ayrıca * r2'den kalan tek bir sayıyı azami haneyi belirten bırakır . Önceki tekli sayıyı yalnız bırakırız ve sadece bandı sola doğru uzatırız; sadece “temizlemek” için gereksiz ekstra kod maliyeti olacaktır. İşimiz bittiğinde ve * q artışını yaptığımızda , Aşama 3'ün başlangıcında bant şimdi:
Aslında, bu bir yalan. Daha önce hatırlıyorum ki * (r - 4) ' ü 1'e ayarladık ve nedenini söylemedim. Şimdi size nedenini söyleyeceğim. Bu anlam, büyük basamaklı aslında 0 olduğu bu uçak durumlar için var hepsi bu yerde basamak 0. Ayar vardır - * (4 r) 1 1 ile tekli sayı uzanır için, yukarıda etiketsiz okla gösterilen, ama sadece bu özel durumda. Bu yolla en büyük basamak 1miş gibi davranıyoruz, bu da bir ekstra satır çıkacağımız anlamına geliyor.
Aşama 3'ten sonra (geçerli yerdeki tüm basamaklardan maksimum basamağı çıkar), * q negatif yapan ek adım dahil , kaset bu şekilde görünür. En son rakam * p bloğunda −2 ile temsil edildi , ama bu sefer hepsi −3 çünkü hepsi aslında sıfırlar ama maksimum rakam 1miş gibi yapıyoruz.
Şimdi, q'nun 1'e doğru ilerledikçe ne olduğunu görelim :
- Zaman * q = -1, * p değerleri tüm -3, araçlardır biz çıkış
'|'
ler ve bunları artırmak.
- Ne zaman * q = 0, biz çıkış
'|'
nedeniyle her zaman yaptığımız şey bu en zaman * q = 0 bakılmaksızın * p .
Böylece iki sıra boru alıyoruz.
Sonunda, * q'yu birisinin yerine götürürüz. Bu ilginç bir hal alır çünkü ':'
asıl rakam 1'den başka bir şeyse, ancak 1 ise s çıkmamız gerekir '8'
. Programın nasıl ilerlediğini görelim. İlk olarak, 2. Aşama'yı başlatmak için * q artışını yaparız :
Aşama 2’den sonra (“maksimum hane değerini hesapla”), bundan ayrıldık:
Aşama 3'ten sonra (“geçerli yerdeki tüm basamaklardan maksimum basamak değerini çıkar”) kaset şöyle görünür:
Şimdi sırayla * q'nın her yinelemesinden geçelim :
- * q = −2:
- İlk sayı: zaten −2 değerinde, bu nedenle a çıkışı
':'
( '.'
çünkü q = −1 değil).
- İkinci sayı: −4'te, bu nedenle çıktı a
'|'
ve artır.
- Üçüncü sayı: −3'te, yani çıktı a
'|'
. Bununla birlikte, bu kez, artış yerine, özel bir durum tetiklenir. Sadece son yeri çıkarıyorsak ( q = −1) ve bunun için ikinci satırdayız ( * q = −2) ve rakam aslında 1 ( * p = =3) , o zaman bunun yerine -2 için artan nedeniyle, ayarlayın -1. Başka bir deyişle, i1'i bir sonraki yinelemede '8'
bunun yerine çıktı almamız gerektiğini belirtmek için özel bir değer olarak kullanırız ':'
.
- * q = −1:
- İlk sayı: zaten −2'de, bu yüzden çıktı a
':'
.
- İkinci sayı: −3'te, yani çıkış a
'|'
. Özel durum tetiklenmez çünkü * q artık −2 değildir. Bu nedenle, artış.
- Üçüncü sayı: −1'de, yani çıkış
'8'
.
- * q = 0: Normalde,
'|'
burada s 'nindoldurma sırasını çıkartacağız, ama o sırada bulunduğumuz özel durumda ( q = −1), bunu atlıyoruz.
Bundan sonra, q 0'a yükseltilir ve döngü biterken büyük olur.
Artık bir girdinin nasıl 202,100,1
çalıştığını biliyorsunuz . Ancak, hala ele almadığımız özel bir dava daha var. Son yeri işlerken, * p −3 olduğunda , i1 olarak 1
(we2'ye çıkarmak yerine) için −1 olarak ayarladığımızı, böylece bir sonraki yinelemenin '8'
yerine geçeceğini hatırlarsınız . Bu sadece işe yarar, çünkü * p'nin −3 olduğu bir tekrarlamaya sahibiz ve onu arttırmaya ya da a1'e ayarlamaya karar veririz. Biz yok eğer böyle bir yineleme sahip tüm olanları yerinde basamak Böyle bir durumda 0 veya 1. tüm * p olur 1'ler için değerler başlar -2 °; −1’e koymaya karar verme imkanı yoktur.−3'ten artırmak yerine . Bu nedenle, Aşama 3'ün içinde bir başka özel muhafaza koşulu vardır (“geçerli yerdeki her bir rakamdan maksimum rakamı çıkar”). Her basamaktan maksimum basamak değerini çıkardıktan sonra (bu noktada maksimum basamak −1’de), sadece bir kez daha azalttığımızı iddia ettim, ancak gerçekte şu şekilde devam eden bir koşul var:
Baktığımız rakam bu yerdeki maksimum rakama eşitse ( * p = −1) ve burası olan yer ( q = −1) ve maksimum rakam 1 ( * (r +) 5) = 0, yani en soldaki unary blok sadece 5 hücre uzunluğundadır), ancak o zaman çıktının tek yinelemesinin bir çıktı vermesi gerektiğini belirtmek için p1'de * p bırakırız '8'
. Diğer tüm durumlarda bir kez daha azaltırız.
Bitti. Mutlu Yıllar!
Düzenleme 1 (3183 → 3001): Yeni Yılınız Kutlu Olsun golf! P2 ve r2 değişkenlerinden tamamen kurtulmayı başardım ! p , sayıların başlangıcını ve sonunu bulmaya devam etmek için ileri geri koşar, ancak kodda daha kısa görünmektedir. Q2'den de kurtulmaya çalıştım , ancak kodu bu şekilde kısaltamam.
Ayrıca bir süre döngüsünün son değerini tekrar kullanmak gibi tipik Okunamayan golf oyunlarını uygulayabileceğim birkaç yer daha buldum. Size bir örnek vermek yerine
while *(++p) { 1 } // just increment p until *p is 0; the 1 is a noop
if (pd) { x } else { y } // where pd is a variable
'""""
(İlk önce, sonra ikinci) ve '"""
(sabit 1) 'i benzer şekilde yazarak kurtarabilirim
if (while *(++p) { pd }) { x } else { y }
Tabii ki, bu, sadece while döngüsünün en az bir yineleme için çalışacağını bildiğimde işe yarar, ancak eğer öyleyse, dönüş değeri pd olur, böylece bunu if için koşul olarak kullanabilirim.