ทำให้โปรแกรมสามเหลี่ยมเป็นสิ่งที่ถูกต้อง


19

Triangularityเป็น esolang ใหม่ที่พัฒนาโดยMr. Xcoderโดยที่โครงสร้างของโค้ดต้องเป็นไปตามรูปแบบที่เฉพาะเจาะจงมาก:

  • สำหรับnบรรทัดที่รหัสจะต้องมี2n-1ตัวอักษรของโปรแกรมอย่างแน่นอน สิ่งนี้ทำให้เกิดรูปสามเหลี่ยม / ปิรามิดโดยที่บรรทัดแรกมีอักขระเพียงตัวเดียวและส่วนที่เหลือเพิ่มขึ้นทีละ 2
  • แต่ละบรรทัดจะต้องมีการบุด้วย.s ที่ด้านซ้ายและขวาเช่นตัวละครที่มีศูนย์กลางอยู่ที่เส้นของพวกเขาและทุกบรรทัดจะมีความยาวเบาะเดียวกัน หากlกำหนดเป็นจำนวนบรรทัดในโปรแกรมแต่ละบรรทัดในโปรแกรมต้องมีความยาว2 * l - 1

ตัวอย่างเช่นโปรแกรมทางด้านซ้ายนั้นถูกต้อง แต่โปรแกรมทางด้านขวาไม่ใช่:

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

เมื่อวางในโครงสร้างที่ถูกต้องชื่อจะชัดเจน

งาน

งานของคุณคือการใช้สตริงบรรทัดเดียวเป็นอินพุตแทนรหัสสามเหลี่ยมและเอาท์พุทมันแปลงเป็นรหัสที่ถูกต้องตามที่อธิบายไว้ข้างต้น

ข้อมูลจำเพาะสำหรับ I / O:

  • ข้อมูลที่ป้อนจะมีอักขระอยู่ในช่วงเท่านั้น 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

สำหรับผู้ที่รู้จัก Triangularity คุณจะสังเกตได้จากกรณีทดสอบสุดท้ายที่ไม่จำเป็นต้องจัดการสตริง



13
ฉันรู้ว่าสิ่งนี้อาจไร้ประโยชน์ แต่ผู้ลงคะแนนเสียงจะอธิบายการลงคะแนนของพวกเขาหรือไม่ ฉันชอบที่จะปรับปรุงความท้าทายในสิ่งที่ฉันทำได้
caird coinheringaahing

ขึ้นบรรทัดใหม่หรือนำขึ้นบรรทัดใหม่เป็นที่ยอมรับหรือไม่
Arnauld

@Arnauld ใช่พื้นที่สีขาวชั้นนำและต่อท้ายนั้นดีมาก
caird coinheringaahing

รายการของเส้นละเอียดหรือไม่?
Mr. 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 ใช่โปรแกรมไม่สามารถทำงานได้อย่างถูกต้องหากไม่มีพวกเขาดังนั้นฉันต้องรวมไว้ในจำนวนไบต์ :-)
Mr. Xcoder

คุณจำเป็นต้อง "ตัดทศนิยม" หรือไม่เนื่องจากความยาวของอินพุตถูกรับประกันว่าเป็นรูปสี่เหลี่ยม? นอกจากนี้คุณควรจะได้รับแกนของJที่ส่วนท้ายและส่งออกจำนวนบรรทัด ไม่ทราบว่าจะช่วยให้คุณประหยัดทุกอย่างได้หรือไม่ถ้าจุดสิ้นสุดของบรรทัดสุดท้ายต้องถูก.เติมเต็มเพื่อเติมเต็มพื้นที่ที่เหลืออยู่
Shaggy

1
@Shaggy 1) ใช่fเป็นสิ่งที่จำเป็นเพราะช่วงไม่สามารถยอมรับข้อโต้แย้งแบบลอย (แม้จะมี.0) 2) การกำจัดJไม่ได้บันทึกไบต์ใด ๆ เนื่องจากการแพ็ดดิ้งดังนั้นฉันเลือกรูปแบบเอาต์พุตที่สวยกว่า
Mr. Xcoder

8

Japt , 15 14 10 ไบต์

เอาต์พุตอาร์เรย์ของบรรทัด

ò@°T¬v1Ãû.

ลองมัน | ตรวจสอบกรณีทดสอบทั้งหมด


explantion

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

Huskขนาด 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 ไบต์

บันทึกเป็นไบต์ขอบคุณMagic Octopus Urn

ā·<£õ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

ÅÉสำหรับอัตราต่อรองอาจช่วยได้อย่างไร
Magic Octopus Urn

เป็นg;ÅÉ£Rvy'.N×.ø}r»อย่างไร แต่ไม่ใช่เพราะนั่นไม่ถูกต้องฮ่า ๆ
Magic Octopus Urn

@ MagicOctopusUrn: ÅÉจะช่วยได้แน่นอนถ้าเราสามารถหาความยาวของแถวล่างเป็น 2 ไบต์ ฉันไม่รู้ว่าเราสามารถทำได้ อาจเป็นอีกวิธีในการรวมเข้าด้วยเช่นกัน
Emigna

@MagicOctopusUrn: ฉันมีวิธีแก้ไขปัญหานี้เหมือนกันก่อนหน้านี้ยกเว้นฉันใช้)Rแทนrซึ่งไม่ได้บันทึกไบต์ใด ๆ : /
Emigna

ฉันพยายามหาวิธี "ย้อนกลับวนซ้ำ" เพื่อพิมพ์ตามที่เกิดขึ้น แต่ก็ยังไม่มีแนวคิดใด ๆ
Magic Octopus Urn


5

เยลลี่ ,  22  19 ไบต์

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

ลิงก์ monadic ส่งคืนรายการของอักขระ (บรรทัด)

ลองออนไลน์!

อย่างไร?

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

@ G0BLiN นี่เป็นวิธีอื่น: นี่เป็นตัวแบ่งบรรทัดตามตัวอักษรในรหัส golfed ซึ่งถูกแทนที่ด้วยตัวแบ่งบรรทัดหนีในรุ่น ungolfed เพื่อความชัดเจน :)
Arnauld

ฮ่าตลกในตัวฉันแล้ว ... :-)
G0BLiN


2

MATL , 21 ไบต์

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

ลองออนไลน์!

คำอธิบาย

พิจารณาการป้อนข้อมูล'DfJ0vCq7G'เป็นตัวอย่าง เนื้อหาสแต็กจะแสดงคั่นด้วยเครื่องหมายจุลภาคโดยองค์ประกอบด้านบนสุด แถวในอาเรย์ 2 มิติใช้เครื่องหมายอัฒภาคเป็นตัวคั่น

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 'เท่านั้นถ้ารหัสไม่ได้มี แต่รหัสนี้ทำดังนั้นจึงต้องใส่ไฟล์ (หรือหนีออกจาก commandline) ซึ่งต้องการอักขระพิเศษ 3 ตัวเมื่อเทียบกับ#!บรรทัดปกติ ดังนั้นในกรณีนี้มันเป็น+3(รหัสปกติคุณจะเห็นฉันคนเดียวเท่านั้นจริงนับ+สำหรับp)
Ton Hospel

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

ลองออนไลน์!

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

1

เรติน่า , 88 72 71 ไบต์

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

ลองออนไลน์! แก้ไข: บันทึกแล้ว12 13 ไบต์ขอบคุณ @MartinEnder คำอธิบาย:

S1`

แยกตัวละครตัวแรกเป็นสายของตัวเองเพื่อให้ลูกบอลกลิ้ง

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

ตัดแต่ละอักขระสองบรรทัดยาวกว่าอักขระก่อนหน้า

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

แผ่นซ้ายครึ่งแรกของแต่ละบรรทัดจัดกึ่งกลางอย่างมีประสิทธิภาพ

P'.`.+

กดขวาทุกบรรทัด


1

Charcoal , 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 เท่านั้น ... เวทมนตร์สีดำนี่คืออะไร
Neil

เติมการตรวจสอบโดยทั่วไปสำหรับไบต์ที่ว่าง (เช่นอักขระที่ใช้สำหรับพื้นที่ที่ไม่มีการวาด) ดังนั้นคุณสามารถวาดรูปหลายเหลี่ยมที่มีค่า null (ดีถ้ามันทำงานได้อย่างถูกต้อง> _>) แล้วเติม เห็นได้ชัดว่านี่ไม่ได้มีจุดมุ่งหมายอย่างแท้จริงเนื่องจากคุณสามารถเห็นไบต์ว่างก่อนที่จะเติมด้วยเหตุผลบางอย่าง> _>
ASCII เท่านั้นเท่านั้น

สิ่งนี้จะทำงานได้อย่างถูกต้องในการดึงครั้งถัดไป
เฉพาะ ASCII เท่านั้น



0

Ruby , 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ในสถานที่แทนการก่อนเวลา

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

การประกาศตัวแปรr=q-1เพื่อให้ฉันสามารถs[r*r...q*q]ประหยัดได้อย่างแม่นยำถึงศูนย์ไบต์

ใช้.centerแทนการขยายด้วยตนเองยังช่วยประหยัดศูนย์ไบต์ แต่ฉันชอบดีกว่า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.