Złóż sznurek w trójkąt

22

Biorąc pod uwagę ciąg, którego długość dzieli się przez 4, utwórz trójkąt, jak pokazano poniżej.

Jeśli ciąg jest abcdefghijkl, to trójkąt będzie:

   a
  b l
 c   k
defghij

Jeśli ciąg jest iamastringwithalengthdivisiblebyfour, to trójkąt będzie:

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

Jeśli ciąg jest thisrepresentationisnotatriangle, to trójkąt będzie:

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

Notatki

  • Ciąg będzie składał się wyłącznie ze znaków od ado z.
  • Doprowadzające / końcowe białe spacje i znaki nowej linii są dozwolone, o ile kształt nie jest uszkodzony.
  • Lista ciągów jako danych wyjściowych jest dozwolona.

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło

Odpowiedzi:

7

Węgiel , 25 22 21 bajtów

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

Wypróbuj online! Link jest do pełnej wersji kodu. Wystarczy pokroić sznurek na trzy części i wydrukować je w odpowiednich kierunkach. Edycja: Zapisano 3 bajty, stosując dzielenie i dzielenie liczb całkowitych. Zapisano kolejny bajt, używając CycleChopzamiast Slicegłowy łańcucha. Edycja: Węgiel drzewny obsługuje teraz rysowanie dowolnego tekstu wzdłuż krawędzi wielokąta, upraszczając kod do 12 bajtów:

GH↙→→↖⊕÷Lθ⁴θ

Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
Co robią s?
Erik the Outgolfer
@EriktheOutgolfer To nowy operator Slice.
Neil
: | Ups, który ma zmusić PolygonHollow do zrobienia tego, GH↙→→↖⊕÷Lθ⁴θzadziała następnym razem, gdy popchnę węgiel drzewny
tylko ASCII
6

05AB1E , 23 bajty

ćsIg4÷GćsÁćsŠN·<ú«s}».C

Wypróbuj online!

Wyjaśnienie

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center
Emigna
źródło
6

JavaScript (ES6), 119 117 108 105 bajtów

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

Sformatowane i skomentowane

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

Przypadki testowe

Arnauld
źródło
4

C #, 260 bajtów

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

Naprawdę chciałem użyć SetCursorPosition.

Nie golfowany:

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}
LiefdeWen
źródło
Przepraszam za moją ignorancję, ale jaki jest cel działania w twoim rozwiązaniu? Czy to tylko mniej bajtów niż funkcja pustki?
confusedandamused
1
@confusedandamused Jestem przyzwyczajony do pisania odpowiedzi na pojedyncze funkcje, więc nawet nie zastanawiałem się nad ustawieniem tej funkcji normalnie, ale będzie ona krótsza.
LiefdeWen
3

Mathematica, 164 bajty

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


wkład

[„iamastringwithalengthdivisiblebyfour”]

J42161217
źródło
Wszyscy wiemy, że [[1]]można to zastąpić #&@@.
user202729,
1
wszyscy jesteście tacy sprytni, kochanie!
J42161217,
Miałem na myśli codegolf.stackexchange.com/questions/12900/… .
user202729,
Kiedy znajdziesz się na czymś @(...), po prostu zrób to [...]. I nie testowałem, ale prawdopodobnie możesz zapisać kolejny bajt, podając Columnnazwę (a może nawet, aby Column[#,Alignment->Center]&tego uniknąć q), a następnie umieszczając wszystkie pozostałe zmienne w pierwszym argumencie zewnętrznym Column(aby zapisać otaczające nawiasy).
Martin Ender
3

Python 3 , 120 bajtów

Po pierwsze golf, pomyślałem, że równie dobrze mogę nauczyć się Pythona po drodze.

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

Wypróbuj online!

Wyjaśnienie:

Pierwszy znak jest drukowany sam po len(a)//4spacji, a następnie idrukowane są pierwsze i ostatnie znaki zaczynające się od drugiego, oddzielone 2*i - 1spacjami.

Na koniec drukowany jest pozostały podciąg.

Fedone
źródło
Witamy w PPCG! Możesz nauczyć się z tego rozwiązania .
Leaky Nun
Możliwym golfem jest tutaj zadeklarowanie p=print, a następnie po prostu skorzystanie pz trzech printużywanych kart.
FlipTack,
Ponadto, ponieważ gwarantuje się, że długość struny jest zawsze podzielna przez cztery, //(podział podłogi) można zastąpić /.
FlipTack,
Nawiasem mówiąc, kod, który podłączyłeś do wypróbowania online, to nie to samo, co kod w odpowiedzi.
FlipTack,
3

GNU sed , 178 158 132 + 1 = 133 bajty

+1 bajt dla -rflagi.

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

Wypróbuj online!

Wyjaśnienie

W poprzednich wersjach używałem wielu bajtów zajmujących się matematyką, specjalnymi przypadkami i porządkami, chociaż intuicyjnie byłem pewien, że można ich uniknąć. Od tego czasu głównie to zrobiłem.

Załóżmy, że mamy dane wejściowe abcdEFGHIJKLMnop. Litery EFGHIJKLMbędą na dole trójkąta, więc wykorzystałem je jako pomoc wizualną.

Najpierw przygotowujemy dane wejściowe, umieszczając pierwszy znak we własnej linii (poprzedzonej spacją) i wstawiając kursor ( ;) przed ostatnim znakiem:

s/(.)(.*)(.)/ \1\n\2;\3/

Teraz mamy:

 a
bcdEFGHIJKLMno;p

Teraz, w pętli, zrobimy kilka rzeczy do ostatniego wiersza: 1. Skopiuj spacje z poprzedniego wiersza i wstaw je po pierwszym znaku plus dwa; 2. Przenieś ostatni znak w prawo za spacjami, a następnie nowy wiersz; i 3. Przesuń kursor o trzy znaki w lewo.

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

Oto wynik każdej iteracji:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

Możesz zobaczyć, jak piramida zaczyna nabierać kształtu. Możesz także zobaczyć, do czego służył kursor: w każdej iteracji przesuwał się w lewo o trzy znaki, a gdy nie ma już trzech znaków po jego lewej stronie, przerywa pętlę, co zdarza się, gdy osiągamy „dół” piramidy.

Teraz zrobimy podobną operację, ale w odwrotnej kolejności. W pętli skopiujemy spacje od początku linii kursorem do początku poprzedniej linii plus jeden, w trakcie przesuwania kursora do tej linii.

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

Oto kilka iteracji i wynik końcowy:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

Skończyliśmy teraz, z wyjątkiem kilku dodatkowych znaków: A ;i dodatkowe spacje w pierwszej linii oraz dwa spacje w „środku” piramidy w następnych trzech liniach. Pozbywa się ich prosta zamiana:

s/. (.)$/\1/gm

Wszystko gotowe!

    a
   b p
  c   o
 d     n
EFGHIJKLM
Jordania
źródło
2

Rubinowy , 106 bajtów

i=-1
s= ~/$/
sub /./,"#{' '*l=s/4}\\0
"
(l-1).times{sub /^(\w)(.*)(.)/,"#{' '*l-=1}\\1#{' '*i+=2}\\3
\\2"}

Wypróbuj online!

Wartość tuszu
źródło
2

Python 2 , 100 97 96 bajtów

  • Jakub zapisał 1 bajt: dzielenie liczb całkowitych nie jest konieczne
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

Wypróbuj online!

Wyjaśnienie:

Jedną sprytną rzeczą, którą tutaj zrobiłem, jest wypełnienie wejścia spacją na końcu, tak aby pierwszy znak sparował się z nim i można go wepchnąć do pętli (i ponieważ dozwolone są końcowe białe znaki)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

Liczba pętli do naśladowania jest związana len(word)//4. W ostatnim kroku drukowany jest cały pozostały ciąg (stanowi to podstawę trójkąta). Przestrzenie są zgodne z prostym wzorem; pierwszy zestaw spacji zmniejsza się o 1, zaś drugi zestaw spacji rośnie o 2.

Officialaimm
źródło
1
Czy potrafisz ogolić bajt, nie dzieląc liczb całkowitych? Ponieważ azawsze będzie wielokrotność 4. //->/
jacoblaw
Dziękuję, jestem zaskoczony, że nie rzuca żadnych błędów nawet w przypadku [danych wejściowych o długości niepodzielnej przez 4] [ tio.run/…
officialaimm
1
Jest tak, ponieważ w Pythonie 2 podział jest domyślnie liczbą całkowitą. Zostało to zapisane w Pythonie 3.
CalculatorFeline
2

C 225 bajtów

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

wyjaśnił

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}
Alex Zeffertt
źródło
2

C #, 172 bajty

int i=0,n=s.Length;var p="";p=new string(' ',n/4)+s[i]+"\r\n";for(i=1;i<n/4;i++){p+=new string(' ',n/4-i)+s[i]+new string(' ',i*2-1)+s[n-i]+"\r\n";}p+=s.Substring(i,n/2+1);

Wypróbuj online!

Erlantz Calvo
źródło
1

Oktawa, 87 bajtów

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

* W maszynie z systemem Windows powyższy kod daje poprawny wynik, jednak w tio dodałem trochę kodu, aby go poprawić.

Wyjaśnienie:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

Wypróbuj online!

rahnema1
źródło
1

Haskell , 136 bajtów

i#x=x<$[1..i]
f s|let h=div l 4;l=length s=unlines$[(h-i)#' '++(s!!i):(2*i-1)#' '++[(s++" ")!!(l-i)]|i<-[0..h-1]]++[drop h$take(l-h+1)s]

Wypróbuj online!

sudee
źródło
1

PHP> = 7,1, 122 bajtów

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i])echo str_pad(str_pad($a[$i],$i*2).$e,$w+1," ",2),"
";echo substr($a,$i,$w+1);

PHP Sandbox Online

PHP> = 7,1, 124 bajtów

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i],$s.=$s?"  ":" ")echo str_pad("",$w/2-$i)."$a[$i]$s$e
";echo substr($a,$i,$w+1);

PHP Sandbox Online

Jörg Hülsermann
źródło
1

AWK , 129 bajtów

{n=split($0,a,"")
printf"%"(w=n/4+1)"s\n",a[++i]
for(;++i<w;)printf"%"(w-i+1)"s%"2*i-2"s\n",a[i],a[n-i+2]
$0=substr($0,i,i+w-1)}1

Wypróbuj online!

Powinienem pomyśleć, że można to trochę pograć w golfa, po prostu go nie widząc.

Robert Benson
źródło
1

Siatkówka , 99 bajtów

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

Wypróbuj online! Objaśnienie: Pierwsze dwa etapy generują pierwsze dwa wiersze, ale potem nie jest wymagana specjalna obudowa i każda kolejna linia może być generowana automatycznie:

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat
Neil
źródło
1

Java 8, 213 bajtów

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

Wyjaśnienie:

Wypróbuj tutaj.

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)
Kevin Cruijssen
źródło
0

Perl 5 , 76 bajtów

74 bajty kodu +2 dla -F

say$"x($l=@F/4),shift@F;say$"x$l,shift@F,$"x($#i+=2),pop@F while--$l;say@F

Wypróbuj online!

Xcali
źródło