Inscriptio Labyrinthica


22

Asturias Kralı Silo'nun mezar yerinde SILO PRINCEPS FECIT ( Kral Silo bunu yaptı ) yazan bir yazı var .

SILO PRINCEPS FECIT

İlk harf en ortada bulunur ve buradan bir dış köşeye yayılan çapraz olmayan herhangi bir yöne girerek okur. Son mektubun dört köşesinde bulunur. Bu zorlukta, bunları yapma sürecini genelleştireceksiniz.

Giriş

Bir dize ( veya eşdeğeri ) ve bir tam sayı. Girdi hakkında aşağıdaki varsayımları yapabilirsiniz:

  • Dize tek bir uzunluğa sahip olacaktır.
  • Tam sayı, dizenin uzunluğunun iki katından 1 ile 1 arasında bir tek sayı olacaktır.

Çıktı

Yükseklik veya genişlik için tamsayı kullanarak string için kullanılan bir inscriptio labyrinthica (yükseklik örnekleri için modellere bakınız). Çıktı, boşluksuz her harf, sistem / dil için varsayılan olarak satır sonu olmalıdır.

Test durumları

1 veya (uzunluk * 2 - 1) girişinin yatay veya dikey palindrom ile sonuçlanacağına dikkat edin.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

puanlama

Bu , bayt cinsinden kazanılan cevapların çok kısa olması Standart boşluklar yasaktır.



Giriş boşluk içerebilir mi? Eğer öyleyse, nasıl ele alınmalı?
Nitrodon

1
Bir karakter listesi olarak girdi alabilir miyiz?
Robin Ryder

1
@Charlie açıkça tüm Perl6 cevaplarımı kaçırdığını :-) Ben de İspanya'nın beşinci kralı esinlendiğinden beri sizden bir cevap bekliyorum (peki, Asturies, ama Asturies, España, taierra conquistao haha)
user0721090601

1
Boy yerine genişlik alabilir miyiz?
attinat

Yanıtlar:


6

J , 27 bayt

([{~]+/&(|@i:)#@[-1+])-:@<:

Çevrimiçi deneyin!

Bir örnek, üst düzey yaklaşımı netleştirecektir.

Düşünmek 'ABCDE' f 3

Aradığımız şeyin basitçe "çapraz toplama" tablosunun 1 0 1ve 3 2 1 0 1 2 3şöyle göründüğünü fark ettik :

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

Bu durumda, orijinal dize gelenler dizinleri çekin: [{~.

Kodun geri kalanı sadece sıkıcı aritmetik ve i:argümanları oluşturmak için kullanımı 1 0 1ve 3 2 1 0 1 2 3.


6

Jöle , 12 bayt

Uṡṛ‘HɗŒBŒḄZY

Çevrimiçi deneyin!

Dizeyi sol, yüksekliği ise sağ argümanı olarak alan çift yönlü bir bağlantı. Satır kesmeleri olan bir dize döndürür. Bir dizge listesi çıktı için kabul edilebilirse, son Ykaydetme baytını kaldırabilirim . İlginç bir şekilde orijinal “SILO PRINCEPS FECIT” TIO'da baktığımda ASCII 3D elmas sanatı gibi görünüyor.

açıklama

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines

2
Sadece görmek için denemeye tıkladım ve evet, gerçekten de, 3D. Garip ama havalı.
user0721090601

6

R , 93 91 87 bayt

Giuseppe sayesinde -2 bayt. OP'nin izin verdiği gibi, yükseklik yerine genişliği girerek -4 byte.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

Çevrimiçi deneyin!

Girdiyi karakter vektörü olarak alır. Anahtar bölüm s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(i,j)1+|ih|+|jw|abs(-w:w)abs(-h:h)abs(-h:h)[h,h1,h2,,2,1,0,1,2,,h1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(R 1 indeksli olduğundan o zaman 1 eklemeliyiz.) Ortadaki 0, girişin ilk harfinin gitmesi gereken yerdir.

Gerisi biçimleniyor.


5

Kömür , 25 19 bayt

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Yazıtın dörtte birini çizin.

‖O←↑

Yazıtı tamamlamayı reddet.


1
Etkileyici! Sitede yeniyim, aşağıdakiler aptalca sorular ise, şimdiden özür dilerim. 1. Bunlar kesinlikle 19 karakter, fakat aynı zamanda 19 bayt mı? ve 2. Bu metni hangi kodlamada 19 bayt alır?
damix911

Evet, UTF-8 ile kodlanmış bu 19 karakter alacaktır , fakat aslında 51 byte. UTF-16 ile bu hala 39 bayt alıyor .
ruohola

1
@ damix911 Kömürün, wiki'de bulunabilecek kendi kodlaması vardır. Kod sayfasının dışındaki karakterlerin 3 bayta mal olduğunu düşünüyorum. Deverbosifier, doğru uzunluğu hesaplamaya çalışır, ancak can sıkıcı olan gerçek kodlamaya transkripsiyon yapmaz.
Neil,

1
@Neil Okey, okunaklı görünüyor!
ruohola

3

Japt -R , 19 16 bayt

z
ò@VÔtXUaVÊ)êÃê

Dene

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines

2

Wolfram Dili (Mathematica) , 57 54 bayt

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

Çevrimiçi deneyin!

Genişliği girdi olarak alır.


1
@ lrtosiast, sonra gişlev ilk çağrıldığında ilk değerlendirilmez. Çevrimiçi deneyin!
attinat

İlginç, @@ veya @@@ kullandığınızda niçin işe yaradığı hakkında bir fikriniz var mı?
lirtosiast

@ lirtosiast Bu , zamanın tanımlandığı Print/@f[...]-> Print/@Transpose[g[...]]-> olduğunu düşünür . Transpose[Print@g[...]]g
Attinat

2

Japt -R , 10 bayt

Ôã°Vz)mê ê

Yükseklik yerine genişlik alır.

Dene

Sözde kod (U, dize, V, tamsayıdır):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize

Güzel! Yana doğru inşa etmeyi denemek için asla başıma gelmedim.
Shaggy


2

Python 3, 104 bayt

Uzun zamandır golf oynamıyorum ... Bunun daha kısa olabileceğine eminim.

ayrıntılar

Bu kod iki argüman alan (string ve height) bir fonksiyonu tanımlar ve sonucu standart çıktıda verir.

İpin içindeki indeks, gridin ortasından Manhattan mesafesidir. Genişliğinin bir ızgara için wve yüksekliği h, hücrenin için mesafeye (x, y)ISabs(x - (w - 1) / 2) + abs(v - (h - 1) / 2) .

Şebekenin eni, köşelerin Manhattan mesafesi (diyelim (0, 0)), dize uzunluğundan bir olmalıdır. (0, 0)Yukarıdakilerin yerine geçerek ve basitleştirerek, genişliğin basit olduğunu bulduk 2 * len(s) - h.

kod

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

Çevrimiçi deneyin!



1

Pyth , 19 bayt

L+_btbjyyM.:Q-lQ/E2

Çevrimiçi deneyin!

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print



1

C # (.NET Core) , 146 bayt

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

Çevrimiçi deneyin!

En uzun cevap çok uzun. :-) Manhattan'ın meydanın merkezine olan uzaklığını kullanıyor. Yine de daha kısa bir yol olmalı.


1

Tcl , 188 170 162 bayt

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

Çevrimiçi deneyin!

TCL'de bu problemi golf oynamak için bir milyon kötü yol var gibi görünüyor. Bu onların en kötüsü değil.

Lambda'ya dönüştürülerek minimum 18 bayt kurtarıldı (satır listesinin dönüş değeri kabul edilebilirse 13 kat daha tasarruf edebilirsiniz)

Lmap yineleyici ekstra bir sabit olarak görev yaptığından beri 8 tane daha kaydetti


1

Tuval , 18 bayt

±X↕┌L╵┌-Y{x;1y1@]┼

Burada dene!

Canvas alt dizgiler yapmaz, bu yüzden bir sanat objesi gibi davranmam ve bu şekilde alt bölüm almam gerekiyor. Bunun bana 2 bayta mal olduğunu hissediyorum, ama hey, ne yapabilirsiniz.

Görünüşe göre bu aslında düşündüğüm gibi çalışmıyor: Tuvalin palindromize fonksiyonları bazı karakterleri yansıtıyor (örneğin V dikey olarak yansıtılıyor) ve tam olarak etkisizleştiremiyorum ... ah, sanırım


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.