Diamondize Some Text

20

Podany ciąg wejściowy o długości 2lub większej, składający się wyłącznie ze znaków alfabetu [A-Z]lub[a-z] (do wyboru, jeśli wszystkie są wielkie lub wszystkie małe litery), wypisz ciąg ciąg znaków tworzących podwójny wzór rombu.

Łańcuch wejściowy zaczyna się w środkowej linii i rozciąga się w dół i w prawo po przekątnej, aż do osiągnięcia końca łańcucha wejściowego. Następnie wzór będzie kontynuowany w górę i w prawo po przekątnej, aż znajdziesz się tak daleko powyżej linii środkowej, jak długość ciągu wejściowego minus 1. Kontynuuj w dół i w prawo z powrotem do linii środkowej, a następnie w dół i- w lewo, potem w górę i w lewo (idąc „za” środkową postacią), a na koniec w dół i w lewo do postaci początkowej.

To trochę nieporadne i lepiej to pokazują przykłady:

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

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

Zobacz, jak YOUzaczyna się od linii środkowej i podąża w dół i w prawo, a następnie w górę i w prawo itd., Dopóki nie zapętli się z powrotem na początek. Zwróć uwagę zwłaszcza Yna to, że górna i lewa część znajduje się „za” Oi dlatego nie jest pokazana.

Kilka dalszych przykładów:

"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

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dane wejściowe mają co najmniej dwie litery (tzn. Nigdy nie otrzymasz ""jako danych wejściowych).
  • Możesz wydrukować go do STDOUT lub zwrócić jako wynik funkcji.
  • Dopuszczalny jest pełny program lub funkcja.
  • Dopuszczalna jest dowolna ilość obcych białych znaków, pod warunkiem, że znaki odpowiednio ustawią się w linii (np. Nie krępuj się padać jak prostokąt).
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
Nie jestem pewien, czy to ma znaczenie, ale dlaczego drugie (górne lewe) przejście wyprzedza pierwsze (górne prawe) przejście? Mniej intuicyjny i nieco denerwujący jest pominięcie lub ponowne narysowanie tej litery.
BradC
2
@BradC Bawiłem się paskiem Möbiusa przy biurku, kiedy wpadłem na wyzwanie, a ten pasek trochę „odchodzi”, więc dlatego. Nie ma innego powodu.
AdmBorkBork
Pomysł może obejmować „rysowanie” ścieżki za pomocą znaków strzałek, aby pomóc nam ją wizualizować.
Kudłaty
@Shaggy Dodano rysunek.
AdmBorkBork
Fajny, ten jest trudniejszy niż na pierwszy rzut oka.
booshlinux

Odpowiedzi:

10

Węgiel drzewny , 17 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

GH

Narysuj ścieżkę.

<↗↘>↖↙

Narysuj w kierunkach ↘↗↗↘↙↖↖↙ ( <i >są skrótami dla tych dwóch par, ale pozostałe pary nie mają skrótów).

Lθ

Każdy segment ścieżki ma tę samą długość, łącznie z końcami, długości wejścia.

θ

Użyj danych wejściowych jako tekstu, który zostanie napisany wzdłuż ścieżki.

GH<Lθθ

Wydrukuj ponownie pierwsze dwie części ścieżki, aby środkowy znak był poprawny.

Neil
źródło
3
To wyzwanie wydaje się dostosowane do gry Charcoal
Jonah
@Jonah Niestety, polecenie ścieżki tekstowej nie rysuje ostatniego znaku, jeśli ścieżka jest zamknięta, więc nie możesz tutaj użyć sztuczki rysowania wstecznego. (Chociaż gdyby tak się stało, i tak byłaby to ta sama liczba bajtów, ponieważ obrócenie łańcucha kosztuje 6 bajtów.)
Neil
9

05AB1E , 12 bajtów

gIR7._•Íη•Λ

Wypróbuj online!

           Λ    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. 
dorycki
źródło
Miałeś na myśli 1, 3, 3, 1, 7, 5, 5, 7?
Neil
Masz rację. Pomieszałem trochę liczby
Dorian
6

JavaScript (ES6),  157 155  154 bajtów

Zwraca macierz znaków.

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)``

Wypróbuj online!

W jaki sposób?

nw×h

  • w=4n3
  • h=2n1

(0,n1)

Bazujący na 0 indeks środkowego znaku, który należy pominąć w kształcie rombu:

p=6n6

n=4

wprowadź opis zdjęcia tutaj

Skomentował

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)
Arnauld
źródło
Mam 136 bajtowe rozwiązanie zainspirowane twoim rozwiązaniem, choć myślę, że do tej pory może być wystarczająco różne, aby kwalifikować się jako osobna odpowiedź.
Neil
@ Neil Prawdopodobnie powinieneś opublikować go jako nową odpowiedź.
Arnauld
3

JavaScript (ES6), 136 bajtów

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>

Zwraca tablicę dwuwymiarową. Działa poprzez narysowanie łańcucha do tablicy bezpośrednio obliczając współrzędne docelowe działające wstecz od końca, dzięki czemu komórka środkowa jest automatycznie nadpisywana. Wyjaśnienie:

(s

Ciąg wejściowy

,l=s.length-1

Odległość między „odbiciami”, również połowa indeksu ostatniego rzędu i jeden mniej niż długość.

,z=l*4

Indeks ostatniej kolumny, również połowa długości tekstu do narysowania.

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

Tablica przestrzeni.

,g=x=>x--

Odliczanie od ostatniej komórki do pierwszej.

  ?g(x

Wywołanie rekurencyjne w celu przetworzenia pozostałych komórek.

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

Oblicz wiersz tej komórki.

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

Oblicz kolumnę tej komórki i znak, który do niej należy.

  :a

Zakończ, zwracając tablicę.

)=>g(z+z)

Zacznij od końca tekstu.

Neil
źródło
To fajne, +1
Ver Nick mówi Przywróć Monikę
2

J , 79 77 75 bajtów

(|.@$~8*])`([:;/(1,~<:@])+/\@,(_2{&1 _1\#:33495)}.@#~])`(' '$~1+2 4*])}<:@#

Wypróbuj online!

Jonasz
źródło
1

C (clang) , 201 196 188 bajtów

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);}

Wypróbuj online!

-13 @ sugestie @ceilingcat

AZTECCO
źródło
0

Python 2 , 137 bajtów

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))

Wypróbuj online!

Pełny program, który pobiera ciąg jako dane wejściowe podczas drukowania wersji diamentowej.

Chas Brown
źródło