Machen Sie ein Triangularity-Programm gültig

19

Triangularity ist ein neuer von Mr. Xcoder entwickelter Esolang, bei dem die Codestruktur einem ganz bestimmten Muster folgen muss:

  • In der ndritten Codezeile müssen sich genau die 2n-1Zeichen des Programms befinden. Dies führt zu einer Dreiecks- / Pyramidenform, wobei die erste Zeile nur ein Zeichen hat und der Rest in Schritten von 2 zunimmt.
  • Jede Zeile muss .links und rechts mit s aufgefüllt werden , sodass die Zeichen in der Mitte der Zeilen stehen und alle Zeilen auf die gleiche Länge aufgefüllt werden. Wenn lals Anzahl der Zeilen im Programm definiert ist, muss jede Zeile im Programm eine Länge von haben2 * l - 1

Das Programm auf der linken Seite ist beispielsweise gültig, das Programm auf der rechten Seite jedoch nicht:

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

In der gültigen Struktur wird der Name deutlich.

Aufgabe

Ihre Aufgabe ist es, eine einzelne Zeichenfolge als Eingabe zu verwenden, die den Triangularitätscode darstellt, und sie wie oben beschrieben in gültigen Code zu konvertieren.

Spezifikationen für E / A:

  • Die Eingabe enthält nur Zeichen im Bereich 0x20 - 0x7e
  • Die Länge der Eingabe ist immer eine quadratische Zahl und daher gut auffüllbar.
  • Sie müssen Punkte als Ausgabeauffüllung verwenden, nicht etwas anderes.

Sie können durch jede akzeptable Methode eingeben und ausgeben . Dies ist ein also gewinnt der kürzeste Code in Bytes !

Testfälle

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

Für diejenigen, die Triangularity kennen, werden Sie im letzten Testfall feststellen, dass Zeichenfolgen nicht behandelt werden müssen

Caird Coinheringaahing
quelle
Sandkasten Post
Caird Coinheringaahing
13
Mir ist klar, dass dies wahrscheinlich sinnlos ist, aber würde es dem Downvoter etwas ausmachen, seine Stimme zu erklären? Ich würde es lieben, die Herausforderung so gut wie möglich zu verbessern.
Caird Coinheringaahing
Sind führende oder nachfolgende Zeilen akzeptabel?
Arnauld
@Arnauld Ja, führende und nachfolgende Leerzeichen sind vollkommen in Ordnung.
Caird Coinheringaahing
Ist eine Liste von Zeilen in Ordnung?
Mr. Xcoder

Antworten:

19

Dreieckigkeit , 127 Bytes

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

Probieren Sie es online!

Erläuterung

Wenn wir die Zeichen entfernen, die das Auffüllen ausmachen, erhalten wir das folgende Programm:

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

... Was ist ziemlich langweilig, oder? Zerlegen wir es in Stücke.

Ganzzahlen generieren [0… √len (Eingabe)]

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

Punkte generieren

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

Schneiden Sie die Zeichen an der Vorderseite

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.

Schneiden Sie die Zeichen am Ende

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.

Die Schleife beenden und schön drucken

})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.
Mr. Xcoder
quelle
Müssen Sie Bytes für das "." Zeichen, wenn sie durch die Eigenheiten der Sprache mandatiert sind?
JDL
@JDL Ja, das Programm kann ohne sie nicht korrekt ausgeführt werden, daher muss ich sie in die Byteanzahl aufnehmen :-)
Byteanzahl aufnehmen Mr. Xcoder
Müssen Sie Dezimalstellen "trimmen", da die Länge der Eingabe garantiert quadratisch ist? Sie sollten auch in der Lage sein, den Stab Jam Ende abzurufen und eine Reihe von Zeilen auszugeben. Ich weiß jedoch nicht, ob Sie dadurch etwas sparen können, wenn das Ende der letzten Zeile aufgefüllt werden muss ., um den verbleibenden Platz zu füllen.
Shaggy
1
@ Shaggy 1) Ja, f wird benötigt, da range keine float-Argumente akzeptiert (auch mit .0). 2) Durch das Entfernen von werden Jaufgrund der Auffüllung keine Bytes gespeichert. Daher habe ich das schönere Ausgabeformat ausgewählt.
Mr. Xcoder
8

Japt , 15 14 10 Bytes

Gibt ein Array von Zeilen aus.

ò@°T¬v1Ãû.

Versuchen Sie es | Überprüfen Sie alle Testfälle


Erklärung

ò@     Ã       :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

Ursprüngliche Lösung

ʬÆsTT±X+°XÃû.

Versuch es

Ê                  :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
Zottelig
quelle
7

Schale , 15 Bytes

Ṡzö`JR2tR'.ṡCİ1

Probieren Sie es online!

Erläuterung

Ṡ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
quelle
7

05AB1E , 20 19 18 Bytes

Dank Magic Octopus Urn wurde ein Byte gespeichert

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

Probieren Sie es online!

Erläuterung

ā                    # 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
quelle
ÅÉfür Quoten kann helfen?
Magic Octopus Urn
So etwas wie g;ÅÉ£Rvy'.N×.ø}r»? Aber nicht das, denn das ist nicht richtig, lol.
Magic Octopus Urn
@MagicOctopusUrn: ÅÉWürde definitiv helfen, wenn wir die Länge der untersten Zeile in 2 Bytes herausfinden könnten. Ich weiß nicht, ob wir das können. Könnte auch eine andere Art sein, es zu integrieren.
Emigna
@MagicOctopusUrn: Ich hatte die gleiche Lösung früher außer ich verwenden , )Ranstatt rwelche nicht speichern Sie alle Bytes: /
Emigna
Ich habe versucht, eine Möglichkeit zu finden, die Schleife "umzukehren", um nur zu drucken, wenn sie auftritt, aber keine Ideen dazu.
Magic Octopus Urn
5

Jelly ,  22  19 Bytes

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

Ein monadischer Link, der eine Liste von Zeichenlisten (die Zeilen) zurückgibt

Probieren Sie es online!

Wie?

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
quelle
5

JavaScript (ES7), 82 bis 78 Byte

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

Testfälle

Kommentiert

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
quelle
[minor] Das '/ n'-Symbol wurde zu einem tatsächlichen Zeilenumbruch im Codeblock oben - aus Gründen der Übersichtlichkeit sollten Sie es
vermeiden
@ G0BLiN Dies ist umgekehrt: Dies ist in der Tat ein buchstäblicher Zeilenumbruch im Golf-Code, der aus Gründen der Klarheit durch einen maskierten Zeilenumbruch in der ungolfed-Version ersetzt wurde. :)
Arnauld
Ha, Witz auf mich, dann ... :-)
g0bLiN
2

MATL , 21 Bytes

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

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 'DfJ0vCq7G'als Beispiel. Der Stapelinhalt wird durch Kommas getrennt angezeigt, wobei das oberste Element das letzte ist. Zeilen in einem 2D-Array verwenden ein Semikolon als Trennzeichen.

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
quelle
2

Sauber , 107 94 89 88 Bytes

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

@[]1

Probieren Sie es online! Beispiel Nutzung: @[]1 ['ABCDEF"$%& G8"F@'].

Laikoni
quelle
1

Haskell , 84 68 Bytes

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

Probieren Sie es online!

Anwendungsbeispiel: []%1 $ "abcd"ergibt die Liste der Zeilen [".a.","bcd"].

Laikoni
quelle
1

Perl, 56 52 Bytes

Enthält +3für-p

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

Geben Sie auf STDIN eine Eingabe ein (im Prinzip ohne letzte Zeile, aber das ist nur für die leere Eingabe von Bedeutung)

Tonne Hospel
quelle
1
nach PCG-Regeln -pkostet nur 1 Byte
Mik
@mik Nur wenn der Code nicht enthält '. Dieser Code muss jedoch in eine Datei eingefügt werden (oder in der Befehlszeile maskiert werden), die im Vergleich zur normalen #!Zeile 3 zusätzliche Zeichen benötigt . Also in diesem Fall ist es +3(für normalen Code , den Sie sehen , ich nur in die Tat zählt +für p)
Ton Hospel
1

Rot , 227 203 Bytes

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

Probieren Sie es online!

Ungolfed:

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 Ivanov
quelle
1

Retina , 88 72 71 Bytes

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

Probieren Sie es online! Bearbeiten: 12 13 Bytes dank @MartinEnder gespeichert. Erläuterung:

S1`

Teilen Sie das erste Zeichen in eine eigene Linie, um den Ball ins Rollen zu bringen.

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

Schneiden Sie jede Zeile zwei Zeichen länger als die vorherige.

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

Füllen Sie die erste Hälfte jeder Zeile mit der linken Maustaste, um sie effektiv zu zentrieren.

P'.`.+

Füllen Sie alle Zeilen mit der rechten Maustaste aus.

Neil
quelle
1

Holzkohle , 21 bis 19 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 2 Bytes durch Erkennen gespeichert SquareRoot. Erläuterung:

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
quelle
: / Das funktioniert fast, aber Charcoal scheint ein bisschen fehlerhaft zu sein. Das funktioniert aber, denke ich?
Nur ASCII
@ Nur ASCII ... was für schwarze Magie ist das?
Neil
Fill prüft im Grunde genommen, ob Null-Bytes (dh das Zeichen, das für Leerzeichen verwendet wird, bei denen nichts gezeichnet wird), sodass Sie einfach ein Polygon mit Null-Bytes zeichnen können (na ja, wenn es überhaupt richtig funktioniert> _>) und dieses ausfüllen können. Offensichtlich ist dies nicht genau beabsichtigt, da Sie die Null-Bytes sogar vor dem Füllen aus irgendeinem Grund sehen können> _>
Nur ASCII
Dies sollte beim nächsten Abzug ordnungsgemäß funktionieren
ASCII
0

Python 2 , 84 Bytes

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

Probieren Sie es online!

total menschlich
quelle
0

Sauber , 123 Bytes

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)'.']]

Probieren Sie es online!

Οurous
quelle
2
Eine freundliche Konkurrenz .
Laikoni
@Laikoni Ooh, das ist mein Lieblingswettbewerb!
Urous
0

Ruby , 73 66 Bytes

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

Probieren Sie es online!

-5 Bytes: Gibt ein Array von Strings zurück, anstatt sie zu drucken

-2 Bytes: Deklarieren z an Ort und Stelle anstatt vor der Zeit

Ungolfed:

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

Eine Variable deklarieren, r=q-1damit ich sie nehmen kanns[r*r...q*q] spart genau null Bytes.

Die .centermanuelle Verwendung anstelle des Auffüllens spart auch null Bytes, aber ich mag es besser.

benj2240
quelle