Зробіть програму «Трикутність» дійсною


19

Трикутність - це новий езоланг, розроблений містером Xcoder, де структура коду повинна відповідати дуже специфічній схемі:

  • Для nпершого рядка коду на ньому повинні бути саме 2n-1символи програми. Це спричиняє форму трикутної / піраміди, причому перший рядок має лише один символ, а решта збільшується з кроком на 2.
  • Кожен рядок повинен бути прокреслений .s ліворуч та праворуч, таким чином, щоб символи були по центру на їх лініях, а всі рядки були прокладені однаковою довжиною. Якщо lвизначено кількість рядків у програмі, кожен рядок у програмі повинен мати довжину2 * l - 1

Наприклад, програма зліва дійсна, але програма праворуч:

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

Якщо викладено у дійсній структурі, назва стає очевидною.

Завдання

Ваше завдання - взяти вхідний рядок, що представляє собою трикутний код, і вивести його, перетворений у дійсний код, як описано вище.

Технічні умови для вводу / виводу:

  • Вхід буде містити лише символи в діапазоні 0x20 - 0x7e
  • Довжина вводу завжди буде квадратним числом і, таким чином, добре підшивається.
  • Ви повинні використовувати крапки для вихідних прокладок, а не щось інше.

Ви можете вводити та виводити будь-який прийнятний метод. Це тому найкоротший код у байтах виграє!

Тестові справи

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

Для тих, хто знає трикутність, ви помітите з останнього тестового випадку, що рядки не потрібно обробляти



13
Я усвідомлюю, що це, мабуть, безрезультатно, але чи хотіла б особа, котра проголосила свій голос, пояснити свій голос? Я б хотів покращити виклик у будь-якому разі, що можу.
caird coinheringaahing

Чи прийнятні провідні чи останні рядки?
Арнольд

@Arnauld Так, простір білого простору ідеально чудовий.
caird coinheringaahing

Чи прекрасний список рядків?
Містер Xcoder

Відповіді:


19

Трикутність , 127 байт

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

Спробуйте в Інтернеті!

Пояснення

Видаляючи символи, що складають підкладку, ми отримуємо таку програму:

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

... Що досить довго, так? Розбиймо його на шматки.

Генерація цілих чисел [0… √len (вхід))

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

Створення крапок

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

Обрізка персонажів спереду

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.

Обрізка персонажів в кінці

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.

Закінчуємо цикл і досить друкуємо

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

чи потрібно вам байти за "." символи, якщо вони наділені властивістю мови?
JDL

@JDL Так, програма не може правильно запуститись без них, тому я повинен включити їх до числа байтів :-)
Містер Xcoder

Чи потрібно «обрізати десяткові знаки», бачачи, що довжина вводу гарантовано буде квадратною? Ви також повинні мати можливість отримати стрижень Jу кінці та вивести масив ліній. Не знайте, чи це допоможе вам щось заощадити, якщо кінець останнього рядка потрібно застелити, .щоб заповнити залишився пробіл.
Кудлатий

1
@Shaggy 1) Так, fпотрібен, тому що діапазон не може приймати плаваючі аргументи (навіть з .0) 2) Позбавлення Jне зберігає жодних байтів завдяки прокладці, тому я вибрав гарніший вихідний формат.
Містер Xcoder

8

Japt , 15 14 10 байт

Виводить масив рядків.

ò@°T¬v1Ãû.

Спробуйте | Перевірте всі тестові випадки


Роз'яснення

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

Оригінальне рішення

ʬÆsTT±X+°XÃû.

Спробуй це

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

7

Лушпиння , 15 байт

Ṡzö`JR2tR'.ṡCİ1

Спробуйте в Інтернеті!

Пояснення

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

7

05AB1E , 20 19 18 байт

Збережено байт завдяки чарівної урни восьминога

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

Спробуйте в Інтернеті!

Пояснення

ā                    # 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

ÅÉдля шансів може допомогти?
Чарівний восьминіг Урна

Щось на кшталт g;ÅÉ£Rvy'.N×.ø}r»,? Але не це, тому що це не так, хаха.
Чарівний восьминога Урна

@MagicOctopusUrn: ÅÉбезумовно, допоможе, якби ми змогли дізнатися довжину нижнього ряду в 2 байти. Я не знаю, чи зможемо ми. Можливо, це ще один спосіб включити його.
Емінья

@MagicOctopusUrn: Це те саме рішення я мав раніше, за винятком того, що я використовував, )Rзамість rякого не зберігав жодних байтів: /
Emigna

Я намагався знайти спосіб "перевернути цикл", щоб просто надрукувати так, як це відбувається, однак ідеї щодо цього немає.
Чарівний восьминіг Урна


5

Желе ,  22  19 байт

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

Монадічне посилання, що повертає список списків символів (рядки)

Спробуйте в Інтернеті!

Як?

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

5

JavaScript (ES7), 82 78 байт

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

Тестові справи

Прокоментував

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

[мінор] символ '/ n' став фактичним розривом рядка в
кодовому

@ G0BLiN Це навпаки: це є дійсно буквальним розрив рядка в golfed коду, який був замінений на який втік розриві рядки в ungolfed версії для ясності. :)
Арнольд

Ха, жарт у мене, то ... :-)
G0BLiN


2

MATL , 21 байт

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

Спробуйте в Інтернеті!

Пояснення

Розглянемо вклад 'DfJ0vCq7G'як приклад. Вміст стеку показано розділеним комами, останній елемент - останнім. Рядки в 2D масиві використовують крапку з комою як роздільник.

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



1

Perl, 56 52 байти

Включає +3для-p

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

Введіть STDIN (в принципі без остаточного нового рядка, але це має значення лише для порожнього вводу)


1
за правилами PCG -pкоштує всього 1 байт
mik

@mik Тільки якщо код не містить '. Але цей код робить, тому його потрібно помістити у файл (або уникнути командного рядка), якому потрібні 3 зайві символи порівняно із звичайним #!рядком. Тож у цьому випадку це так +3(для звичайного коду ви побачите, що я справді розрахований лише +на них p)
Тон Євангелія

1

Червоний , 227 203 байт

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

Спробуйте в Інтернеті!

Безголівки:

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

1

Сітківка , 88 72 71 байт

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

Спробуйте в Інтернеті! Редагувати: Збережено 12 13 байт завдяки @MartinEnder. Пояснення:

S1`

Розділіть першого персонажа у свою лінію, щоб отримати кульку.

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

Наріжте кожен рядок на два символи довше попереднього.

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

Першу половину кожного рядка залиште внизу, ефективно центруючи їх.

P'.`.+

Праворуч прокладіть всі рядки.


1

Вугілля деревне , 21 19 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Редагувати. Збережено 2 байти, виявивши SquareRoot. Пояснення:

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

: / Це майже працює, але, здається, вугілля трохи баггі. Це працює, хоча, я думаю?
Лише ASCII

@ ASCII-тільки ... що це за чорна магія?
Ніл

В основному заповніть перевірку нульових байтів (тобто символ, який використовується для простору, де нічого не намальовано), тож ви можете просто намалювати багатокутник з нульовими байтами (добре, якщо він навіть працює правильно> _>) і заповнити це. Очевидно, це не зовсім призначено, оскільки ви насправді можете побачити нульові байти ще до заповнення з якихось причин> _>
лише ASCII

це має працювати належним чином наступного витягу
лише для ASCII



0

Рубі , 73 66 байт

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

Спробуйте в Інтернеті!

-5 байт: Повернення масиву рядків замість їх друку

-2 байти: оголосити zна місці замість випередження

Безголівки:

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

Оголошення змінної, r=q-1щоб я міг взяти, s[r*r...q*q]економить рівно нуль байт.

Використання .centerзамість прокладки вручну також економить нульові байти, але це мені подобається краще.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.