Bazı Metni Elmaslaştırma


20

2Yalnızca alfabetik karakterlerden oluşan uzun veya daha uzun bir giriş dizesi [A-Z]veya [a-z](tümü büyük harf veya tümü küçük harfse seçiminiz) verildiğinde , çift elmas deseni oluşturan sürekli bir karakter dizesi çıktılayın.

Giriş dizesi, orta hatta başlar ve giriş dizesinin sonuna ulaşılana kadar diyagonalde aşağı-sağa doğru uzanır. Ardından, desen, giriş dizesinin eksi 1 uzunluğu kadar merkez çizgisinin çok yukarısına gelene kadar diyagonalde yukarı ve sağ devam eder. Aşağı ve sağ orta çizgiye, ardından aşağı ve sola, sonra yukarı-sola (merkez karakterin "arkasına" gider) ve son olarak aşağı ve sola başlangıç ​​karakterine geri döner.

Bu biraz garip ve bazı örneklerle daha iyi gösterilebilir:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Bakın nasıl YOUgeri başlangıcına döngüler kadar vb merkez çizgisinde başlar ve aşağıdaki aşağı-and-hakkını, daha sonra yukarı-sağa,. Özellikle Yyukarı-ve-sol kısımdaki "arkasında" Ove dolayısıyla gösterilmemiştir.

Bazı örnekler:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Girişin en az iki harf uzunluğunda olması garanti edilir (yani, asla ""giriş olarak almazsınız ).
  • STDOUT'a yazdırabilir veya işlev sonucu olarak geri gönderebilirsiniz.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Karakterler uygun şekilde hizalandığı sürece herhangi bir miktarda yabancı boşluk kabul edilebilir (örn., Dikdörtgen olarak doldurmaktan çekinmeyin).
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Bunun önemli olduğundan emin değilim, ama neden ikinci (sol üst) geçiş ilk (yukarı sağ) geçişin arkasına geçiyor? Bu mektubu atlamak veya yeniden çizmek için daha az sezgisel bir anlam ve biraz can sıkıcı olur.
BradC

2
@BradC Meydan okumaya geldiğimde masamda bir Möbius şeridi ile oynuyordum ve şerit biraz "arkasına" gidiyor bu yüzden. Başka bir sebep yok.
AdmBorkBork

Görselleştirmemize yardımcı olmak için ok karakterlerini kullanarak yolun "çizimini" dahil etmek için bir fikir olabilir.
Shaggy

@Shaggy Bir çizim eklendi.
AdmBorkBork

Güzel bir, bu bir ilk bakışta daha zor ..
booshlinux

Yanıtlar:


10

Kömür , 17 bayt

GH<↗↘>↖↙LθθGH<Lθθ

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

GH

Bir yol boyunca çizin.

<↗↘>↖↙

Yönleri çizin ↘↗↗↘↙↖↖↙ ( <ve >bu iki çift için kısayollardır, ancak diğer çiftlerde kısayol yoktur.)

Lθ

Her bir yol parçası, girişler ile aynı uzunlukta, uçlar dahil olmak üzere aynı uzunluğa sahiptir.

θ

Girişi yol boyunca yazılacak metin olarak kullanın.

GH<Lθθ

Orta karakterin doğru olması için yolun ilk iki parçasını yeniden yazdırın.


3
Bu meydan okuma Kömür için uyarlanmış görünüyor
Jonah

@Jonah Ne yazık ki, metin yolu komutu yol kapalıysa son karakteri çizmez, bu nedenle burada ters çizim hilesini kullanamazsınız. (Olsaydı, yine de aynı bayt sayısı olurdu, çünkü ipi döndürmek 6 bayttır.)
Neil

9

05AB1E , 12 bayt

gIR7._•Íη•Λ

Çevrimiçi deneyin!

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

Bunu mu demek istediniz 1, 3, 3, 1, 7, 5, 5, 7?
Neil

Oh, haklısın. Sayıları biraz karıştırdım
Dorian

6

JavaScript (ES6),  157 155  154 bayt

Bir karakter matrisi döndürür.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

Çevrimiçi deneyin!

Nasıl?

nwxh

  • w=4n-3
  • h=2n-1

(0,n-1)

Elmas şeklinde atlanması gereken merkez karakterinin 0 tabanlı dizini:

p=6n-6

n=4

resim açıklamasını buraya girin

Yorumlananlar

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

Çözümünüzden ilham alan 136 baytlık bir çözümüm var, ancak şimdiye kadar ayrı bir cevap olarak nitelendirilmenin yeterince farklı olabileceğini düşünüyorum.
Neil

@Neil Muhtemelen yeni bir cevap olarak göndermelisiniz.
Arnauld

3

JavaScript (ES6), 136 bayt

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

İki boyutlu bir dizi döndürür. Merkezi hücrenin otomatik olarak üzerine yazılması için dizeyi sonuna doğru geriye doğru çalışan hedef koordinatları doğrudan hesaplayan diziye çizerek çalışır. Açıklama:

(s

Giriş dizesi.

,l=s.length-1

"Sıçrama" arasındaki mesafe, ayrıca son satır indeksinin yarısı ve uzunluktan bir tane daha az.

,z=l*4

Son sütun dizini, ayrıca çizilecek metnin uzunluğunun yarısı.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Uzay dizisi.

,g=x=>x--

Son hücreden ilk hücreye kadar geri sayın.

  ?g(x

Kalan hücreleri işlemek için özyinelemeli çağrı.

    ,a[a[y=(x+l)%z]?y:z-y]

Bu hücrenin satırını hesaplayın.

      [x>z?z+z-x:x]=s[x%-~l])

Bu hücrenin sütununu ve oraya ait karakteri hesaplayın.

  :a

Diziyi döndürerek bitirin.

)=>g(z+z)

Metnin sonunda başlayın.




1

C (çınlama) , 201 196 188 bayt

x,y,i,v,m,n;f(s,z){char*a=s,o[i=(y=z*2-1)*(x=y+y)];for(v=x*2-2;i;n=m=1)o[--i]=i%x?32:10;for(i=x*--z;v--;i+=x*m+n)o[i]==32?o[i]=*a:0,a=*++a?a:s,n=i%x>x-3?-1:n,m=i/x?i/x<y-1?m:-1:1;puts(o);}

Çevrimiçi deneyin!

-13 @ceilingcat önerileri


0

Python 2 , 137 bayt

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

Çevrimiçi deneyin!

Dizeyi girdi olarak alan tam bir program elmaslı sürümü yazdırır.

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.