Güçlü Sarmal Boyunca Gayretli “Hızlı Kahverengi Tilki”


12

Giriş

Verilen kurallara göre ünlü pangramın giden spiralini çıkarmak için bir program yazın.

Meydan okuma

Bir pangram kez en az belirli bir alfabenin her harfini kullanarak bir cümledir. En ünlü pangramlardan biri, Windows yazı tipi görüntüleyicisinde, yani " Hızlı kahverengi tilki tembel köpeğin üstünden atlar ". Zor olan, bu metne dayalı bir spiral çıkarmaktır.

Göreviniz şu tam metni çıktılar:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

İşte nasıl üretilir,

  • "Hızlı kahverengi tilki tembel köpeğin üstünden atlar" pangramını seven gayretli bir tilki vardı. Bir gün dışarı doğru bir sarmalın ortasındaydı ve içine atlamaya ve boyamaya karar verdi.
  • Başından sonuna kadar pangramdan geçmek istiyor ve eğer bir harf alfabedeki n'inci harfse, n kez boyamak istiyor.
  • Ancak tilki köşelerde dönüş yapmakta çok iyi değildi, bu yüzden her köşeye ulaştığında durup bir sonraki harfe geçmesi gerekiyordu.
  • O da olmadığını vurgulamak pangram üç kez tekrarlamak karar Hızlı kahverengi tilki.
  • İşiniz, tilki tüm bu harfleri boyadıktan sonra spiralin nasıl görüneceğini göstermektir.

(Hikaye anlatmayan sade versiyon)

  • Ünlü pangram "Hızlı kahverengi tilki tembel köpeğin üstünden atlar" üç kez tekrarlanır, boşluklar kaldırılır ve tüm harfler küçük harflerle oluşturulur.

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Spiral merkezden başlar ve "t" harfiyle başlar, sağa giderek başlar ve saat yönünde dışarı doğru gider. Geçerli karakter alfabedeki n. Harfse, her zaman bir sonraki karaktere geçer

    • spiral bir köşeye ulaşır veya
    • geçerli harfler tam olarak n kez yazdırılır.

Daha iyi açıklamak için, ilk üç kelime olan "thequickbrown" ile ilgili spiralin nasıl üretildiğini açıklayacağım.

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Tilki "t" den başlar, sağa gider, 1. köşeye ulaşır, "t" ile boyar ve sonra "h" ye geçer ve aşağı iner, 2. köşeye ulaşır, "e" ye geçer ve sola gider, 3. köşe, "q" a geçer ve yukarı çıkar, 4. köşeye ulaşır, "u" a geçer ve sağa gider, köşeye ulaşır ve "i" ye geçer, aşağıya iner, köşeye ulaşır ve "c" ye geçer, gider sol, başarılı bir şekilde bir sonraki köşeye ulaşmadan önce 3 "c" yi boyar , "k" ye geçer ve sola gider, hemen bir köşeye ulaşır, "b" ye geçer ve yukarı gider, ulaşmadan önce 2 "b" ler boyar sonraki köşe, "r" ye geçerve yukarı doğru gider, köşeye ulaşır ve "o" ya geçer, sağa gider, sonra "w", aşağı, "n", sola gider.

gözlük

  • Dizenin herhangi bir standart biçimini içeren isteğe bağlı bir girdi alabilirsiniz

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Çıktınız bir dize olarak biçimlendirilmeli ve yeni satırlar doğru yerleştirilmiş olarak dosyalar veya STDERR yerine STDOUT'a gitmelidir. Boş satırlara yön vermek ve onları takip etmek önemli değildir. Her satırda başlık ve sondaki boşluklara izin verilir, ancak tutarlı olmaları gerekir. Dolayısıyla, verilen metnin bir satırından önce 5 boşluk eklerseniz, her satırdan önce tam olarak 5 boşluk eklemeniz gerekir, böylece spiral aynı görünür.

  • Bu , en düşük bayt sayısı kazanır.

  • Her zamanki gibi, burada varsayılan boşluklar uygulanır.


Gerekli olmamakla birlikte açıklamalar kabul edilir.

Başlık, caird coinheringaahing tarafından yorum başına bir pangram haline getirmek için düzenlenmiştir.

Tembel köpek hikayede görünmek için çok tembel.

Çıktı mektubu koordinatların basit işlevleri ile hesaplanamadığı bir dize meydan okuma oluşturmayı hedefliyorum.


2
Başlığın pangram olmaması bir utanç
caird coinheringaahing

@cairdcoinheringaahing Güzel nokta, bir tane bulmaya çalışacağım. Herhangi bir öneri?
Weijun Zhou

4
@cairdcoinheringaahing Güncellendi
Weijun Zhou

Küçük nokta: ilk 'the' içindeki 'h' iki kez tekrarlanmamalı, 't' değil mi?
mudkip201

@ mudkip201 Bir sonraki karaktere geçmeden önce köşe orijinal harfle boyanır. Belki açıklığa kavuşturmalıyım.
Weijun Zhou

Yanıtlar:


5

Stax , 35 34 33 32 bayt

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Çevrimiçi çalıştırın ve hata ayıklayın

Stax yaklaşık 6 aydır üzerinde çalıştığım bir dildir. Bu onunla ilk golf oynuyor. İşe başlayalım.

Stax normal olarak yazdırılabilir ASCII karakter kümesinde yazılır. Bu 34 bayt gönderme, CP437 karakter kümesinin bir varyantına paketlenmiştir . Karşılık gelen ascii temsili

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax, yığın tabanlı bir dildir, ancak "ana" ve "giriş" olmak üzere iki veri yığınına sahiptir. Çoğu işlem ana yığını kullanır, ancak girdi girdi yığınında başlar. Stax komutları çoğunlukla bir veya iki karakterli ascii dizileridir. Çoğu aşırı yüklenmiştir, yani davranışları yığınlardaki ilk birkaç değer tarafından belirlenir.

Yüksek düzeyde, bu program dizeleri art arda son satıra ekleyerek bir ızgara oluşturur. Son sıra dolduğunda, ızgarayı saat yönünde döndürür. Sonunda, ızgarayı yatay olarak yansıtır. Daha ayrıntılı olarak, program bu şekilde çalışır.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row

Vay be, gerçekten bir golf dili için golf ilk halka görünüşünü görmek şaşırdım. Desteğiniz için çok teşekkür ederiz! Ayın Dili ile ilgileniyor musunuz? Bunu kullanan daha fazla kullanıcı görmeyi umuyorum ve yakında aday listesinde görünecek!
Weijun Zhou

@WeijunZhou: Yani bu ? Şimdiye kadar bir şey olduğunu bilmiyordum. Bir aday göstermeye aldırmam. Daha yerleşik diller için daha uygun olabilir gibi görünüyor, ama itiraz etmiyorum.
özyinelemeli

Evet. Dediğin gibi, daha iyi kurulduğunda bunu aday gösterebilirim. Umarım uzun olmaz.
Weijun Zhou

"Her satırdaki başlık alanı tutarlı olduğu sürece önemli olmadığından" isterseniz başka bir bayt kaydedebilirsiniz.
Weijun Zhou

1
Stax kullanarak yeni bir sunum yaptım . İsterseniz bu konuda tavsiye verebilirsiniz. Düzenleme: Ne tesadüf. Gönderiminizden öğrenmeye çalışacağım.
Weijun Zhou

11

Kömür , 66 40 36 bayt

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Düzenleme: Metni girdi olarak alarak 16 bayt kaydetti. Açıklama:

≔²η

Herhangi bir tnedenle 2 s ile başlayın .

FS«

Pangramdaki tüm harflerin üzerinden geçin.

F¬η«

Henüz köşeye gelmedik mi?

Bir satır aşağı gidin (veya sonraki yön ne olursa olsun).

Yazdırma yönünü saat yönünde 90 ° döndürün.

⊞υη≔⊕÷Lυ²η

Bir sonraki tarafın uzunluğunu hesaplayın.

¶»

İmleç konumunu sabitlemeyi bitirin. (Kömür kenarın köşeden hemen önce bitmesini tercih ederdi, böylece köşenin kendisinde döndün.)

F⊕⌕βι

Geçerli harfin alfabedeki konumu kadar döngü.

¿η«

Eğer köşeye ulaşmazsak,

≦⊖ηι

Sayımı azaltın ve geçerli harfi yazdırın.


Teşekkür ederim. Büyük iş ve iyi açıkladı. Küçük bir yazım hatası: orada kez -> üç kez.
Weijun Zhou

Bu 43 baytlık sürüm spesifikasyona göre de kabul edilebilir. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou

1
@ WeijunZhou Teşekkürler, daha önce soruda bu maddeyi fark etmedim.
Neil

2

Yakut , 217 212 209 208 bayt

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Çevrimiçi deneyin!

İşaretçileri yönetmek için oldukça fazla zaman harcar, bu nedenle daha fazla golf için yer olabilir.

-5 bayt: Girmeden önce pangramı üçe katlayın . Weijun Zhou'ya teşekkürler .

-3 bayt: Son dizeyi sıfırdan oluşturmak yerine, giriş dizesini pedleyin ve son bacağı kesin.

-1 bayt: Kullanılabilirlik &&değeri olan üçlü bir işleç yerine kullanın .

Açıklama:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}

1
Güzel teslim ve açıkça açıkladı. rVe llambdas kullanımı için teşekkür ederiz . Mevcut cevaplara dayanarak, son bacağım bir sorun oluşturucu gibi görünüyor, ancak örnek çıktısını oluşturmak için C snippet'imi yazdığım zaman değildi ...
Weijun Zhou

1
Tamamen kaydedebilir ve operatöre s*=3atlayabilirsiniz . tio.run/…0?:
Weijun Zhou

1
@ WeijunZhou Ahh, bahşiş için teşekkürler. Buna ihtiyacım var 0, ya da Ruby bir c+=1sonraki satırdan yukarı çekecek ve sadece çoğu zaman yürütecek . Ve güzel bir meydan okuma!
benj2240

Haklısın. Yeterince dikkatli görünmüyordum. Takdirin için teşekkürler. Hoşuna gittiğine sevindim.
Weijun Zhou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.