Sprawdź, czy program Trójkątność jest prawidłowy

19

Trójkątność to nowy esolang opracowany przez pana Xcodera, w którym struktura kodu musi być zgodna z bardzo specyficznym wzorem:

  • W tym nwierszu kodu muszą znajdować się dokładnie 2n-1znaki programu. Powoduje to kształt trójkąta / piramidy, przy czym pierwsza linia ma tylko jeden znak, a reszta zwiększa się o 2.
  • Każda linia musi być uzupełniona .literami s po lewej i prawej stronie, tak aby znaki były wyśrodkowane na swoich liniach, a wszystkie linie były wypełnione na tej samej długości. Jeśli ljest zdefiniowany jako liczba linii w programie, każda linia w programie musi mieć długość2 * l - 1

Na przykład program po lewej stronie jest poprawny, ale program po prawej stronie nie jest:

 Valid    |  Invalid  
          |
...A...   |  ABCDE
..BCD..   |  FGH
.EFGHI.   |  IJKLMN
JKLMNOP   |  OPQRS

Po umieszczeniu w prawidłowej strukturze nazwa staje się oczywista.

Zadanie

Twoim zadaniem jest pobranie jednego ciągu wiersza jako danych wejściowych, reprezentujących kod trójkątności, i przesłanie go przekonwertowanego na prawidłowy kod, jak opisano powyżej.

Dane techniczne we / wy:

  • Dane wejściowe będą zawierać tylko znaki z zakresu 0x20 - 0x7e
  • Długość wejścia zawsze będzie liczbą kwadratową, a zatem będzie ładna do wypełnienia.
  • Do wypełnienia wyjściowego należy użyć kropek, a nie czegoś innego.

Możesz wprowadzać i wyprowadzać dowolną akceptowalną metodą. To jest więc wygrywa najkrótszy kod w bajtach !

Przypadki testowe

input
----
output

g
----
g

PcSa
----
.P.
cSa

DfJ0vCq7G
----
..D..
.fJ0.
vCq7G

7xsB8a1Oqw5fhHX0
----
...7...
..xsB..
.8a1Oq.
w5fhHX0

QNYATbkX2sKZ6IuOmofwhgaef
----
....Q....
...NYA...
..TbkX2..
.sKZ6IuO.
mofwhgaef

ABCDEF"$%& G8"F@
----
...A...
..BCD..
.EF"$%.
& G8"F@

ab.c
----
.a.
b.c

Dla tych, którzy znają Trójkątność, zauważysz z ostatniego przypadku testowego, że łańcuchy nie muszą być obsługiwane

Cairney Coheringaahing
źródło
Post w piaskownicy
caird coinheringaahing
13
Zdaję sobie sprawę, że jest to prawdopodobnie daremne, ale czy zstępujący zechciałby wyjaśnić swój głos? W każdym razie chciałbym poprawić wyzwanie.
caird coinheringaahing
Czy dopuszczalne są wiodące lub końcowe znaki nowej linii?
Arnauld
@Arnauld Tak, wiodące i końcowe białe znaki są idealnie w porządku.
caird coinheringaahing
Czy lista linii jest w porządku?
Pan Xcoder

Odpowiedzi:

19

Trójkątność , 127 bajtów

.......).......
......2)1......
...../)IL^.....
....f)rMD@_....
...)2)1/)IL^...
..f+`"'.'*"+E..
.DWReD)2s^)Its.
D+@sh+s+})10cJ.

Wypróbuj online!

Wyjaśnienie

Usuwając znaki, które składają się na wypełnienie, otrzymujemy następujący program:

)2)1/)IL^f)rMD@_)2)1/)IL^f+`"'.'*"+EDWReD)2s^)ItsD+@sh+s+})10cJ

... Która jest dość długa, prawda? Podzielmy to na kawałki.

Generowanie liczb całkowitych [0… √len (wejście))

)2)1/)IL^f)r – Subprogram #1.
)            – Creates a new stack entry, equal to 0. This must precede any integer
               literal, because each character in '0123456789' isn't parsed on its
               own as a literal, but rather they are commands which multiply the ToS
               by 10 and add the value of their digit equivalent. 
 2           – ToS * 10 + 2 = 2.           || STACK: [2]
  )1         – The literal 1.              || STACK: [2, 1]
    /        – Division.                   || STACK: [1 / 2] = [0.5]
     )I      – Get the input at index 0.   || STACK: [0.5, input]
       L     – Length.                     || STACK: [0.5, len(input)]
        ^    – Exponentiation.             || STACK: [len(input) ** 0.5]
         f   – Trim decimals.              || STACK: [int(len(input) ** 0.5)] 
          )r – Create the list [0 .. ToS). || STACK: [[0 ... int(len(input) ** 0.5))]

Generowanie kropek

MD@_)2)1/)IL^f+`"'.'*"+E – Subprogram #2.
MD                       – For each integer in the range, run some code on a separate
                           stack, preinitialised to two copies of the argument.
  @_                     – Increment and negate the ToS.
    )2)1/)IL^f           – The square root of the length of the input, again.
              +          – Add the two.
               `         – And cast the integer given to a string.
                "'.'*"+  – Prepends the literal "'.'*" to the string representation.
                       E – Evaluate as a Python expression (basically string repetition).

Przycinanie znaków z przodu

DWReD)2s^)It – Subprogram #3.
D            – Duplicate the result of the expression above.
 W           – Wrap the whole intermediate stack to an array.
  Re         – Reverse the stack and dump the contents separately onto the stack.
    D        – Duplicate the result.
     )2      – Push the literal 2.
       s^    – Swap and perform exponentiation.
         )It – Push the input and trim the characters before that index.

Przycinanie znaków na końcu

sD+@sh+s+ – Subprogram #4.
s         – Swap the top two elements on the stack.
 D+       – Double. Push twice and add.
   @      – Increment.
    sh    – Swap the top two elements and trim the characters after that index.
      +   – Append the first set of dots.
       s+ – And prepend the second set of dots.

Kończąc pętlę i ładnie drukując

})10cJ – Subprogram #5.
}      – End the loop.
 )10   – Push the literal 10.
    c  – Convert from code-point to character (yields '\n').
     J – And join the result by newlines.
Pan Xcoder
źródło
czy musisz zdobyć bajty dla „.” znaki, jeśli są one wymagane przez cechy języka?
JDL
@JDL Tak, bez nich program nie będzie działał poprawnie, więc muszę je uwzględnić w liczbie bajtów :-)
Pan Xcoder
Czy potrzebujesz „przycinać miejsca po przecinku”, ponieważ długość wejścia jest gwarantowana jako kwadratowa? Powinieneś być również w stanie uzyskać pręt Jna końcu i wyprowadzić tablicę linii. Nie wiem jednak, czy to ci cokolwiek uratuje, jeśli koniec ostatniej linii wymaga .wypełnienia pozostałym miejscem.
Kudłaty
1
@ Shaggy 1) Tak, fjest potrzebny, ponieważ zakres nie może przyjmować argumentów zmiennoprzecinkowych (nawet z .0) 2) Pozbycie się Jnie zapisuje żadnych bajtów z powodu wypełnienia, więc wybrałem ładniejszy format wyjściowy.
Pan Xcoder,
8

Japt , 15 14 10 bajtów

Wysyła tablicę wierszy.

ò@°T¬v1Ãû.

Wypróbuj | Sprawdź wszystkie przypadki testowe


Wyjaśnienie

ò@     Ã       :Partition at characters where the following function returns true
  °T           :  Increment T (initially 0)
    ¬          :  Square root
     v1        :  Divisible by 1?
               :(Or, in other words, split after every character with a 1-based index that's a perfect square)
        û.     :Centre pad each element with .s to the length of the longest element

Oryginalne rozwiązanie

ʬÆsTT±X+°XÃû.

Spróbuj

Ê                  :Length of input
 ¬                 :Square root
  Æ        à       :Range [0,ʬ) and pass each X through a function
   s               :  Slice input
    T              :    from index T, initially 0
     T±X+°X        :    to index T incremented by X plus X incremented
            û.     :Centre pad each element with .s to the length of the longest element
Kudłaty
źródło
7

Łuska , 15 bajtów

Ṡzö`JR2tR'.ṡCİ1

Wypróbuj online!

Wyjaśnienie

Ṡzö`JR2tR'.ṡCİ1  Implicit input, say s = "DfJ0vCq7G".
             İ1  List of odd positive integers: [1,3,5,7,..
            C    Cut s to those lengths: x = ["D","fJ0","vCq7G"]
           ṡ     Reversed indices of x: y = [3,2,1]
Ṡz               Zip x and y using this function:
                  Arguments are a string and a number, e.g. r = "fJ0" and n = 2.
        R'.       n copies of '.': ".."
       t          Drop first element: "."
     R2           Two copies of this: [".","."]
  ö`J             Join by r: ".fJ0."
                 Result is ["..D..",".fJ0.","vCq7G"]; implicitly print on separate lines.
Zgarb
źródło
7

05AB1E , 20 19 18 bajtów

Oszczędność bajtu dzięki Magic Octopus Urn

ā·<£õKRvy'.N×.ø}r»

Wypróbuj online!

Wyjaśnienie

ā                    # push the list [1 ... len(input)]
 ·<                  # multiply each by 2 and decrement each, making a list of odd numbers
   £                 # split the input into chunks of these sizes
    õK               # remove empty strings
      R              # reverse list
       vy      }     # for each y in the list
             .ø      # surround it with
         '.N×        # "." (dot) repeated N times, where N is the current iteration index
                r    # reverse the stack
                 »   # join stack by newlines
Emigna
źródło
ÅÉna szanse mogą pomóc?
Magic Octopus Urn
Coś w stylu g;ÅÉ£Rvy'.N×.ø}r»? Ale to nie dlatego, że to nie w porządku lol.
Magic Octopus Urn
@MagicOctopusUrn: ÅÉzdecydowanie pomogłoby, gdybyśmy mogli znaleźć długość dolnego rzędu w 2 bajtach. Nie wiem jednak, czy możemy. Może to być także inny sposób na włączenie go.
Emigna
@MagicOctopusUrn: Miałem to samo rozwiązanie wcześniej, z wyjątkiem tego, że użyłem )Rzamiast tego rnie
zapisałem
Próbowałem znaleźć sposób na „odwrócenie pętli”, aby po prostu drukować, gdy się pojawi, ale nie ma na to żadnych pomysłów.
Magic Octopus Urn
5

Galaretka ,  22  19 bajtów

J²‘Ṭœṗ⁸Ṛz”.Zµṙ"JC$Ṛ

Monadyczny link zwracający listę list znaków (wiersze)

Wypróbuj online!

W jaki sposób?

J²‘Ṭœṗ⁸Ṛz”.Zµṙ"JC$Ṛ - Link: list of characters e.g. "DfJ0vCq7G"
J                   - range of length               [1,2,3,4,5,6,7,8,9]
 ²                  - square (vectorises)           [1,4,9,16,25,36,49,64,81]
  ‘                 - increment                     [2,5,10,17,26,37,50,65,82]
   Ṭ                - untruth (1s at those indices) [0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,...]
      ⁸             - chain's left argument         "DfJ0vCq7G"
    œṗ              - partition at indexes          ["D","fJ0","vCq7G"]
       Ṛ            - reverse                       ["vCq7G","fJ0","D"]
         ”.         - literal '.'                   '.'
        z           - transpose with filler         ["vfD","CJ.","q0.","7..","G.."]
           Z        - transpose                     ["vCq7G","fJ0..","D...."]
            µ       - start a new monadic chain
                 $  - last two links as a monad:
               J    -   range of length             [1,2,3]
                C   -   complement (vectorises)     [0,-1,-2]
              "     - zip with:
             ṙ      -   rotate left by              ["vCq7G",".fJ0.","..D.."]
                  Ṛ - reverse                       ["..D..",".fJ0.","vCq7G"]
Jonathan Allan
źródło
5

JavaScript (ES7), 82 78 bajtów

f=(s,k=1-s.length**.5*2,p='')=>s&&f(s.slice(0,k),k+2,p+'.')+`
`+p+s.slice(k)+p

Przypadki testowe

Skomentował

f = (                       // f = recursive function taking:
  s,                        //   s = input string
  k = 1 - s.length**.5 * 2, //   k = additive inverse of the length of the base
  p = ''                    //   p = padding string
) =>                        //
  s &&                      // if s is not empty:
    f(                      //   do a recursive call with:
      s.slice(0, k),        //     s without the last -k characters
      k + 2,                //     the updated base length (2 less characters)
      p + '.'               //     the updated padding string
    ) +                     //   end of recursive call()
    `\n` +                  //   append a line feed
    p +                     //   append the left padding string
    s.slice(k) +            //   append the last -k characters of s
    p                       //   append the right padding string
Arnauld
źródło
[drobny] symbol „/ n” stał się faktycznym
podziałem
@ G0BLiN Jest na odwrót: jest to rzeczywiście dosłowny podział linii w kodzie golfowym, który został zastąpiony przerwaniem linii ucieczki w wersji bez golfa dla przejrzystości. :)
Arnauld
Ha, żart jest na mnie, a potem ... :-)
G0BLiN
2

05AB1E , 25 bajtów

gÅÉ£õKð'ø‡.c¶¡ζøð'.‡'øð‡»

Wypróbuj online!

Erik the Outgolfer
źródło
2

MATL , 21 bajtów

tnX^eRP&1ZvGyg(46y~(!

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 'DfJ0vCq7G'jako przykład. Zawartość stosu jest oddzielona przecinkami, a górny element jest ostatni. Wiersze w tablicy 2D używają średnika jako separatora.

t      % Implicit input: string. Duplicate
       % STACK: 'DfJ0vCq7G',
                'DfJ0vCq7G'
nX^    % Number of elements. Square root
       % STACK: 'DfJ0vCq7G',
                3
e      % Reshape with that many rows (in column major order)
       % STACK: ['D0q';
                 'fv7';
                 'JCG']
R      % Upper triangular part: set elements below diagonal to char(0)
       % (displayed as space)
       % STACK: ['D0q';
                 ' v7';
                 '  G']
P      % Flip vertically
       % STACK: ['  G';
                 ' v7';
                 'D0q']
&1Zv   % Reflect vertically
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G']
G      % Push input again
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                'DfJ0vCq7G'
yg     % Duplicate from below and convert to logical. This gives true for
       % for nonzero chars (the entries where input chars will be written)
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                'DfJ0vCq7G',
                [0 0 1;
                 0 1 1;
                 1 1 1;
                 0 1 1;
                 0 0 1]
(      % Assignment indexing: write values at those positions
       % STACK: ['  v';
                 ' fC';
                 'DJq';
                 ' 07';
                 '  G']
46     % Push 46, which is ASCII for '.'
       % STACK: ['  v';
                 ' fC';
                 'DJq';
                 ' 07';
                 '  G'],
                 46
y~     % Duplicate from below and apply logical negate. This gives true
       % for char(0) (the entries where '.' will be written)
       % STACK: ['  G';
                 ' v7';
                 'D0q';
                 ' v7';
                 '  G'],
                46
                [1 1 0;
                 1 0 0;
                 0 0 0;
                 1 0 0;
                 1 1 0]
(      % Assignment indexing: write value at those positions
       % STACK: ['..G';
                 '.v7';
                 'D0q';
                 '.v7';
                 '..G'],
!      % Transpose. Implicit display
       % STACK: ['..D..';
                 '.fJ0.';
                 'vCq7G']
Luis Mendo
źródło
2

Czysty , 107 94 89 88 bajtów

import StdEnv
@s _[]=s
@s n r= @([['.':l]++['.']\\l<-s]++[take n r])(n+2)(drop n r)

@[]1

Wypróbuj online! Przykładowe zastosowania: @[]1 ['ABCDEF"$%& G8"F@'].

Laikoni
źródło
1

Haskell , 84 68 bajtów

[]%1
(s%n)[]=s
(s%n)r=(['.':l++"."|l<-s]++[take n r])%(n+2)$drop n r

Wypróbuj online!

Przykładowe użycie: []%1 $ "abcd"zwraca listę linii [".a.","bcd"].

Laikoni
źródło
1

Perl, 56 52 bajtów

Obejmuje +3dla-p

#!/usr/bin/perl -p
$_=("."x y///c**.5)=~s%.%$'@{[$&x/$`$`./g]}$'
%rg

Podaj dane wejściowe STDIN (w zasadzie bez końcowej nowej linii, ale to ma znaczenie tylko dla pustych danych wejściowych)

Ton Hospel
źródło
1
zgodnie z zasadami PCG -pkosztuje tylko 1 bajt
mik
@mik Tylko jeśli kod nie zawiera '. Ale ten kod działa, więc należy go umieścić w pliku (lub w #!wierszu poleceń), który wymaga 3 dodatkowych znaków w porównaniu do normalnej linii. Więc w tym przypadku jest to +3(dla normalnego kodu widać I rzeczywiście liczyć tylko +na p)
Ton Hospel
1

Czerwony , 227 203 bajtów

f: func[s][l: to-integer(length? s)** 0.5
n: 0 foreach m parse s[collect[(r: []repeat i l[append r reduce['keep i * 2 - 1
charset[not{Я}]]])r]][v: copy""insert/dup v"."l - n: n + 1 print rejoin[v m v]]]

Wypróbuj online!

Nie golfowany:

f: func[s][
l: to-integer (length? s) ** 0.5
n: 0
foreach m parse s [ 
    collect [
        (r: []
        repeat i l [ append r reduce [
            'keep i * 2 - 1 charset [ not{Я} ]]])
    r ]] 
    [v: copy ""
    insert/dup v "." l - n: n + 1
    print rejoin [v m v]]
]
Galen Iwanow
źródło
1

Retina , 88 72 71 bajtów

S1`
+m`^(.)+¶(?>(?<-1>.)+)..(?!¶)
$&¶
P^'.m`^.(?=(..)*)(?<-1>.)*
P'.`.+

Wypróbuj online! Edycja: Zapisano 12 13 bajtów dzięki @MartinEnder. Wyjaśnienie:

S1`

Podziel pierwszą postać na własną linię, aby piłka się toczyła.

+m`^(.)+¶(?>(?<-1>.)+)..(?!¶)
$&¶

Posiekaj każdą linię dwa znaki dłuższą niż poprzednia.

P^'.m`^.(?=(..)*)(?<-1>.)*

Lewy pad pierwszej połowy każdej linii, skutecznie je centrując.

P'.`.+

Prawym padem wszystkie linie.

Neil
źródło
1

Węgiel drzewny , 21 19 bajtów

UB.F₂Lθ«P✂θXι²X⊕ι²↙

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 2 bajty, odkrywając SquareRoot. Wyjaśnienie:

UB.                 Set the background fill to `.`
      θ             (First) input
     L              Length
    ₂               Square root
   F   «            Loop over implicit range
            ι   ι   Current value
               ⊕    Incremented
             ²   ²  Literal 2
           X  X     Power
         ✂θ         Slice the (first) input string
        P           Print without moving the cursor
                  ↙ Move down left
Neil
źródło
: / To prawie działa, ale wygląda na to, że węgiel jest trochę wadliwy. Myślę, że to działa?
Tylko ASCII
@ Tylko ASCII ... co to za czarna magia?
Neil
Wypełnij w zasadzie sprawdza, czy bajty są puste (tj. Znak użyty do spacji, w której nic nie jest rysowane), więc możesz po prostu narysować wielokąt z bajtami zerowymi (cóż, jeśli nawet działa poprawnie> _>) i wypełnić go. Oczywiście nie jest to dokładnie zamierzone, ponieważ z jakiegoś powodu możesz zobaczyć bajty zerowe nawet przed wypełnieniem> _>
tylko ASCII
powinno to działać poprawnie przy następnym ściągnięciu
tylko ASCII
0

Python 2 , 84 bajtów

s=input()
l=int(len(s)**.5)
for i in range(l):print s[i*i:][:i-~i].center(l*2-1,'.')

Wypróbuj online!

całkowicie ludzki
źródło
0

Czysty , 123 bajty

import StdEnv
?n l#(a,b)=splitAt n l
|b>[]=[a: ?(n+2)b]=[a]
$s#s= ?1s
=[c++l++c\\l<-s&i<-[1..],c<-[repeatn(length s-i)'.']]

Wypróbuj online!

Obrzydliwe
źródło
2
Trochę przyjaznej konkurencji .
Laikoni
@Laikoni Ooh, to mój ulubiony rodzaj zawodów!
Οurous
0

Rubinowy , 73 66 bajtów

->s{(1..z=s.size**0.5).map{|q|s[q*q-2*q+1...q*q].center 2*z-1,?.}}

Wypróbuj online!

-5 bajtów: zwraca tablicę ciągów zamiast je drukować

-2 bajty: Deklaracja zna miejscu zamiast z wyprzedzeniem

Nie golfowany:

->s{
  (1..z=s.size**0.5).map{|q|   # Map the range [1,sqrt(s.size)]
    s[q*q-2*q+1...q*q]         # To the relevant portion of s,
      .center 2*z-1, ?.        #   padded left and right with . characters
  }
}

Zadeklarowanie zmiennej, r=q-1dzięki której mogę wziąć, s[r*r...q*q]zapisuje dokładnie zero bajtów.

Używanie .centerzamiast wypełniania ręcznie również oszczędza zero bajtów, ale bardziej mi się podoba.

benj2240
źródło