ทำตัวให้เฉียบสุด ๆ


35

พื้นหลัง

เฉลิมฉลองการเปิดตัว Dyalog APL 16.0โดยที่การแก้ไขปัญหานี้คือ{⊢⌺(≢⍵)⊢⍵}คำอธิบาย

งาน

กำหนดสตริง ASCII พิมพ์ความยาวแปลก n , ทำให้n × nตารางกับสตริงศูนย์กลางแนวนอนซ้ำจะเป็นศูนย์กลางในแนวตั้งและมี acrostics ของสายเดียวกันในแต่ละแถวและคอลัมน์ โปรดทราบว่าทั้งหมด แต่สตริงศูนย์กลางจะถูกตัดออกเพื่อให้ขนาดของตารางn × n

คำอธิบายรหัสของคุณจะได้รับการชื่นชมมาก

กฎระเบียบ

  1. คุณอาจมีช่องว่างต่อท้ายและบรรทัดใหม่ (รวมถึงสามเหลี่ยมล่างขวา)
  2. คุณอาจส่งคืนรายการสตริง

ตัวอย่างการใช้สตริงABXCD:

  • nคือ 5. ก่อนอื่นเราวาดสองเส้นกลาง, หนึ่งแนวนอนและแนวตั้งหนึ่ง:

    ┌─────┐
    │ A │
    │ B │
    │ABXCD│
    │ C │
    │ D │
    └─────┘
    

    (เพิ่มขอบเขต 5 × 5 เพื่อความชัดเจน)

  • จากนั้นเราวาง acrostics ที่เป็นไปได้ทั้งหมดในแนวนอนและแนวตั้ง:

           
          AB
      ┌─────┐
      │ABX│CD
      │ABXC│D
      │ABXCD│
     A│BXCD│
    AB│XCD│
      └─────┘
       ซีดี
       D
    
  • ในที่สุดเรากลับเฉพาะสิ่งที่อยู่ภายในกล่องขอบเขต:

      ABX
     ABXC
    ABXCD
    BXCD 
    XCD  
    

กรณีทดสอบ

World:

  Wor
 Worl
World
orld
rld

mississippi:

     missis
    mississ
   mississi
  mississip
 mississipp
mississippi
ississippi
ssissippi
sissippi
issippi
ssippi

Pneumonoultramicroscopicsilicovolcanoconiosis:

                      Pneumonoultramicroscopi
                     Pneumonoultramicroscopic
                    Pneumonoultramicroscopics
                   Pneumonoultramicroscopicsi
                  Pneumonoultramicroscopicsil
                 Pneumonoultramicroscopicsili
                Pneumonoultramicroscopicsilic
               Pneumonoultramicroscopicsilico
              Pneumonoultramicroscopicsilicov
             Pneumonoultramicroscopicsilicovo
            Pneumonoultramicroscopicsilicovol
           Pneumonoultramicroscopicsilicovolc
          Pneumonoultramicroscopicsilicovolca
         Pneumonoultramicroscopicsilicovolcan
        Pneumonoultramicroscopicsilicovolcano
       Pneumonoultramicroscopicsilicovolcanoc
      Pneumonoultramicroscopicsilicovolcanoco
     Pneumonoultramicroscopicsilicovolcanocon
    Pneumonoultramicroscopicsilicovolcanoconi
   Pneumonoultramicroscopicsilicovolcanoconio
  Pneumonoultramicroscopicsilicovolcanoconios
 Pneumonoultramicroscopicsilicovolcanoconiosi
Pneumonoultramicroscopicsilicovolcanoconiosis
neumonoultramicroscopicsilicovolcanoconiosis
eumonoultramicroscopicsilicovolcanoconiosis
umonoultramicroscopicsilicovolcanoconiosis
monoultramicroscopicsilicovolcanoconiosis
onoultramicroscopicsilicovolcanoconiosis
noultramicroscopicsilicovolcanoconiosis
oultramicroscopicsilicovolcanoconiosis
ultramicroscopicsilicovolcanoconiosis
ltramicroscopicsilicovolcanoconiosis
tramicroscopicsilicovolcanoconiosis
ramicroscopicsilicovolcanoconiosis
amicroscopicsilicovolcanoconiosis
microscopicsilicovolcanoconiosis
icroscopicsilicovolcanoconiosis
croscopicsilicovolcanoconiosis
roscopicsilicovolcanoconiosis
oscopicsilicovolcanoconiosis
scopicsilicovolcanoconiosis
copicsilicovolcanoconiosis
opicsilicovolcanoconiosis
picsilicovolcanoconiosis
icsilicovolcanoconiosis

กิตติกรรมประกาศ

ขอบคุณdzaima , Leaky Nun , Mr. Xcoderสำหรับทุกสิ่ง แต่ความคิดที่ดีของความท้าทายนี้


1
ช่องว่าง - รูปสามเหลี่ยมที่มุมล่างขวาต้องรวมหรือไม่?
ข้อผิดพลาด

1
@flawr OP: พฤษภาคม
Adám

คำตอบ:



5

MATL , 8 ไบต์

nXyPGZ+c

ลองออนไลน์!

คำอธิบาย

n    % Implicit input. Number of elements
Xy   % Identity matrix of that size
P    % Flip vertically
G    % Push input again
Z+   % 2D convolution, maintaining size
c    % Convert to char (char 0 is displayed as space). Implicitly display

1
ใครคิดว่าฉันต้องการคำตอบนี้: D
ข้อบกพร่อง

1
@flawr ใช่ใครจะคิด
Luis Mendo

4

เรติน่า70 70ไบต์

.
$.'$* $_$.`$* ¶
(?=((....))+)(?<-1>.)+(.*?)(?<-2>.)+¶
$3¶

ลองออนไลน์! แก้ไข: บันทึก 11 ไบต์ด้วยความช่วยเหลือจาก @MartinEnder คำอธิบาย: ขั้นตอนแรกป้อนข้อมูลซ้ำหนึ่งครั้งสำหรับตัวละครแต่ละตัวและเติมอย่างเหมาะสมในแต่ละบรรทัดเพื่อรับแรงเฉือน ขั้นตอนสุดท้ายจะลบ 25% จากแต่ละด้านเพื่อสร้างผลลัพธ์ที่ต้องการ


ฉันคิดว่าฉันมี 59 ก่อนหน้านี้ ไม่ได้มีเวลาที่จะขุดขึ้นรายละเอียดในขณะนี้ แต่เป็นหลักในระยะแรกผมแค่เบาะป้อนข้อมูลที่มีn/2ช่องว่างด้านซ้ายและขวา (ใช้สิ่งที่ต้องการ(..)+.-> $#1$* $&$#1$*มีพื้นที่ต่อท้าย) แล้วก็ไม่ได้!&`...ที่...การแข่งขันnว่าnตัวละคร
Martin Ender

วิธีการของคุณอย่างน้อยสามารถย่อให้เหลือ 63: tio.run/##K0otycxL/ …
Martin Ender

@ มาร์ตินเดอร์ขอบคุณและฉันได้ตีกอล์ฟอีก 4 ไบต์!
Neil

คุณต้องการที่สอง$*spหรือไม่
CalculatorFeline

@CalculatorFeline ใช่ฉันต้องการทุกเส้นให้มีความยาวเท่ากันดังนั้นฉันจึงสามารถหารมันได้ด้วย 4
Neil

3

Java 8, 120 103 ไบต์

s->{int l=s.length(),i=l/2;for(;i-->0;s=" "+s+" ");for(;++i<l;System.out.println(s.substring(i,l+i)));}

-17 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองที่นี่

s->{                      // Method with String parameter and no return-type
  int l=s.length(),       //  Length of the input-String
      i=l/2;              //  Temp index-integer (starting at halve the length floored)
  for(;i-->0;             //  Loop (1) from `l/2` to 0 (exclusive)
    s=" "+s+" "           //   Add spaces before and after the input-String
  );                      //  End of loop (1)
                          //  (If the input was "World", it is now "  World  ")
  for(;++i<l;             //  Loop (2) from 0 to `l` (exclusive)
    System.out.println(   //   Print:
      s.substring(i,      //    Substring of the modified input from `i`
                    l+i)  //    to `l+i` (exclusive)
    )                     //   End of print
  );                      //  End of loop (2)
}                         // End of method

i=l/2+1และi-->1และfor(;i<lบันทึกไบต์
Olivier Grégoire

1
และ ... นักกอล์ฟทั้งหมด: s->{int l=s.length(),i=l/2;while(i-->0)s=" "+s+" ";while(++i<l)System.out.println(s.substring(i,l+i));}(103 ไบต์) การเปลี่ยนแปลงที่สำคัญเพียงอย่างเดียวคือสตริงที่มีช่องว่างถูกสร้างเพียงครั้งเดียวและสำหรับทั้งหมดแทนที่จะเป็น "แบบทันที" (และแน่นอนว่าการพิมพ์แทนที่จะส่งคืน)
Olivier Grégoire

3

Haskell, 64 62 ไบต์

f s|l<-length s=take l$take l<$>scanr(:)""(([2,4..l]>>" ")++s)

ลองออนไลน์! มันทำงานอย่างไร:

l<-length s               -- let l be the length of the input string

      ([2,4..l]>>" ")     -- take l/2 spaces and
                     ++s  -- append s
    scanr(:)""            -- make a list of the inits of the above string, e.g.
                          -- "  world" -> ["  world"," world","world","orld"...]
  take l <$>              -- take the first l chars of each string
take l                    -- and the first l strings

3

SWI Prolog ขนาด 234 ไบต์

h(_,0,_,_,[]).
h(T,N,S,L,[H|U]):-sub_string(T,S,L,_,H),M is N-1,A is S+1,h(T,M,A,L,U).
s(T,R):-string_length(T,L),findall('_',between(1,L,_),A),string_chars(B,A),
                   string_concat(B,T,C),string_concat(C,B,D),S is L-((L-1)/2),h(D,L,S,L,R).

อาจลองออนไลน์ได้ที่นี่: http://swish.swi-prolog.org/p/hEKigfEl.pl

NB

  1. บรรทัดสุดท้ายคือหนึ่งบรรทัดที่ยาวฉันเพิ่ม linebreak และช่องว่างที่นี่เพื่อหลีกเลี่ยงแถบเลื่อนแนวนอนในคำตอบนี้
  2. คำถามเกี่ยวข้องกับช่องว่างสำหรับการขยาย แต่ Swish ออนไลน์ไม่แสดงอย่างสมบูรณ์เนื่องจากการโต้ตอบการแสดงผล HTML คุณต้องดูแหล่งที่มาในเครื่องมือ dev ของเบราว์เซอร์เพื่อตรวจสอบว่ามีอยู่จริงหรือไม่ ฉันได้เปลี่ยนช่องว่างภายในเป็น_ที่นี่เพราะมันแสดงให้เห็นว่ามันทำงานได้และไม่ส่งผลกระทบต่อจำนวนไบต์

ตัวอย่างการรันใน Swish:

กรณีทดสอบ

วิธีการนั้นเป็นสิ่งแรกที่ฉันสามารถทำงานได้เลยและผู้ใช้ Prolog ที่มีทักษะไม่ต้องสงสัยก็สามารถทำให้มันสั้นลงได้มาก:

  • ด้วยสตริงที่มีความยาว L เอาต์พุตจะมีเส้น L และแต่ละบรรทัดจะมีอักขระ L ยาวดังนั้น 'L' จึงปรากฏขึ้นจำนวนมาก นับถอยหลังจาก L ถึง 0 สำหรับจำนวนบรรทัด L สำหรับความยาวสตริงย่อยสำหรับแต่ละบรรทัด
  • สร้างสายอักขระ padding ของช่องว่าง L (ขีดล่าง) เพิ่มลงที่ปลายทั้งสองของสตริงอินพุตเนื่องจากเป็นความยาวที่เรียบง่ายซึ่งแน่นอนว่าจะมีช่องว่างเพียงพอ
  • คำนวณออฟเซ็ตเริ่มต้นลงในสตริงที่มีความยาวสามเท่าและทำการรีเซตสร้างซับสตริงแต่ละครั้งลงในรายการผลลัพธ์

รหัสที่อธิบายและแสดงความคิดเห็น (อาจไม่ได้รัน) อ่านจากsuperacrostic()ล่างจากนั้นhelper()เนื้อหาหลักจากนั้นจึงhelper()พิมพ์ตัวพิมพ์ใหญ่:

% helper function recursive base case, 
% matches when counter is 0, other input has any values, and empty list 'output'.
helper(_,0,_,_,[]). 



% helper function recursively generates substrings
% matching a padded input Text, a line Counter
% a substring starting Offset, a line Length,
% and an output list with a Head and a Tail
helper(Text, Counter, Offset, LineLength, [Head|Tail]):-

    sub_string(Text, Offset, LineLength, _, Head),    % The list Head matches
                                                      % a substring of Text starting 
                                                      % from Offset, of LineLength chars 
                                                      % and

    NextCounter is Counter-1,                         % decrement the Counter

    NextOffset is Offset+1,                           % increment the offset

    helper(Text, NextCounter, NextOffset, LineLength, Tail).  % Recurse for list Tail



% Result is a superacrostic for an input string Text, if
superacrostic(Text, Result):-
    string_length(Text, Length),                   % Length is length of input, 
                                                   % Text = 'ABXCD', Length = 5
                                                   % and

    findall('_',between(1,Length,_),PaddingList),  % PaddingList is a list of padding
                                                   % chars Length items long, 
                                                   % ['_', '_', '_', '_', '_']
                                                   % and

    string_chars(PaddingString, PaddingChars),     % PaddingString is the string from 
                                                   % joining up that list of chars
                                                   % '_____'
                                                   % and

    string_concat(PaddingString, Text, Temp),      % Temp is Text input with a
                                                   % padding prefix
                                                   % Temp = '_____ABXCD'
                                                   % and

    string_concat(Temp, PaddingString, PaddedText), % PaddedText is Temp with 
                                                    % a padded suffix
                                                    % Temp = '_____ABXCD_____'
                                                    % and


    S is Length - ((Length - 1) / 2),              % Starting offset S for the substring
                                                   % is just past the padding,
                                                   % then half the input length back
                                                   % '_____ABXCD_____'
                                                   %     |
                                                   % to start the first line,
                                                   % and


    helper(PaddedText, Length, S, Length, Result). % Result is the list generated from 
                                                   % the helper function, 

    % to recurse Length times for that many output rows, S starting offset, 
    % Length linelength, and Result 'output'.



2

APL (Dyalog Unicode) , 10 ตัวอักษร = 22 ไบต์

{⊢⌺(≢⍵)⊢⍵}

ลองออนไลน์!

{} ฟังก์ชั่นที่ไม่ระบุชื่อโดยมีการโต้แย้งโดย

 ให้พื้นที่ครอบคลุมเมื่อ

⌺() เลื่อนขนาดลายฉลุ

   ความยาวของ

   อาร์กิวเมนต์

 บน

 อาร์กิวเมนต์

วิธีการทำงานนี้คือการปล่อยให้ตัวละครแต่ละตัวอยู่ตรงกลางของสายอักขระที่มีความยาวเท่ากันกับอินพุตการเติมด้านซ้ายหรือขวาตามต้องการ ใช้เช่นABXCD:

สตริงมีอักขระห้าตัวดังนั้น stencil จะมี "ช่องว่าง" ที่มีความกว้างห้าอักขระ

┌──↓──┐     การเปิดลายฉลุที่มีเครื่องหมายกลาง
│ ABX│CD   ให้Aอยู่ตรงกลาง
 │ ABXC│D   แล้วB
  │ABXCD|   เป็นต้น
  A|BXCD | 
  AB|XCD  |
    └──↑──┘ ตำแหน่งลายฉลุสุดท้าย



2

JavaScript (ES8), 66 63 62 ไบต์

ส่งคืนอาร์เรย์

s=>[...s].map((_,x)=>s.padStart(l*1.5).substr(x,l),l=s.length)

ลองมัน

o.innerText=(f=
s=>[...s].map((_,x)=>s.padStart(l*1.5).substr(x,l),l=s.length)
)(i.value="Pneumonoultramicroscopicsilicovolcanoconiosis").join`\n`;oninput=_=>o.innerText=f(i.value).join`\n`
<input id=i><pre id=o>


คำอธิบาย

s=>

sฟังก์ชั่นที่ไม่ระบุชื่อการสตริงเป็นอาร์กิวเมนต์ผ่านพารามิเตอร์

[...s]

แยกสตริงออกเป็นอาร์เรย์ของอักขระแต่ละตัว

l=s.length

lได้รับความยาวของสตริงและกำหนดให้กับตัวแปร

.map((_,x)=>                                        )

แม็พกับอาร์เรย์ผ่านแต่ละองค์ประกอบผ่านฟังก์ชันซึ่งxเป็นดัชนีขององค์ประกอบปัจจุบัน

s.padStart(l*1.5)

สำหรับแต่ละองค์ประกอบให้ส่งคืนสตริงเดิมด้วยช่องว่างที่มีการเติมจนกระทั่งความยาวของมันคือ 1.5 เท่าของความยาวดั้งเดิม

.substr(x,l)

รับสตริงย่อยของความยาวที่lเริ่มต้นจากดัชนีขององค์ประกอบปัจจุบัน


2

V , 14 , 11 ไบต์

òlÙxHÄ$x>>ê

ลองออนไลน์!

บันทึก 3 ไบต์ด้วย @nmjmcman!

hexdump:

00000000: f26c d978 48c4 2478 3e3e ea              .l.xH.$x>>.

วิธีดั้งเดิม (18 ไบต์):

ø..
Duu@"ñLÙxHÄ$x>

คำอธิบาย:

ò           " Recursively:
 l          "   Move one char to the right (this will break the loop if we move too far
  Ù         "   Duplicate this line down
   x        "   Delete the first character on this line
    H       "   Move to the first line
     Ä      "   Duplicate this line up
      $     "   Move to the end of this line
       x    "   And delete a character
        >>  "   Put one space at the beginning of this line
          ê "   And move to this column on the last line
            " (implicit) ò, end the loop.

บันทึกสองไบต์: ลองออนไลน์!
nmjcman101

@ nmjcman101 อ้านั่นเป็นอัจฉริยะ! êฉันทั้งหมดลืมเกี่ยวกับ ขอบคุณ :)
DJMcMayhem

2

PowerShell Coreขนาด 68 ไบต์

0..($L=($a="$args").Length-1)|%{-join(' '*($L/2)+$a)[($_..($_+$L))]}

ลองออนไลน์!

คำอธิบายที่ไม่ดี

# Input string ABXCD
# -> indexes  0,1,2,3,4  string indexing and num of output lines.
# -> Pad with half-len of spaces __ABXCD.
# -> sliding window array of chars:
# __ABXCD
# |    |       0..4
#  |    |      1..5
#   |    |     2..6
#    |    |    3..7   (selecting indexes past the end returns $nulls, no error)
#     |    |   4..8

# joining those chars into a line


$Text = "$args"                            # script args array to string.
$L    = $Text.Length - 1                   # useful number

$Offsets = 0..$L                           # range array 0,1,2,3,.. to last offset

$Offsets | ForEach-Object {                # Offsets doubles as number of output lines

    $LinePadding = ' ' * ($L / 2)          # lead padding string __
    $PaddedText  = $LinePadding + $Text    # -> __ABXCD

    $Chars = $_..($_+$L)                   # windows 0..4, then 1..5, then 2..6, etc.
    $Line  = $PaddedText[$Chars]           #_,_,A,B,X then _,A,B,X,C then A,B,X,C,D etc.

    -join $Line                            # __ABX  then _ABXC then ABXCD etc.

}

1
สนใจที่จะปลดเปลื้องการเข้าร่วม[($_..($_+$L))]หรือไม่
รูต

@ คำตอบสั้น ๆ ของรูต, การ(ไม่เข้ากับการเข้าร่วม, มันกำลังทำการ-join ($Padding + $Text)[0,1,2,3,4]เลือกอักขระหลายตัวจากสตริงเสริมสำหรับเอาท์พุทบรรทัด, และรวมเข้ากับสตริงเพื่อให้เป็นวิธีที่สั้นลง.SubString(). และมันสร้างช่องว่างภายในและช่วงของอักขระแบบแทนที่ เพิ่มคำอธิบายที่ไม่ดีออกไปจากคำตอบของฉันแล้ว
TessellatingHeckler

2

Japt , 19 17 14 ไบต์

บันทึก 5 ไบต์ด้วย @ETHproductions และ @Shaggy

¬£iSp½*Ul¹tYUl

ทดสอบออนไลน์! -Rเพิ่มการตั้งค่าสถานะเพื่อเข้าร่วมกับการขึ้นบรรทัดใหม่ (เพื่อการเปิดเผย)

คำอธิบาย

¬£iSp½*Ul¹tYUl
                U = Implicit input
¬               Split the input into an array of chars
 £              Map; At each char:
  i               Insert:
   S                Space " "
    p               repeated(
     ½*Ul           .5 * U.length times 
         ¹          )
          t        Substring(
           Y         Index,
            Ul       U.length) 

1
ควรจะมีวิธีที่สั้นกว่ามากในการสร้างSp½*Ulแต่ฉันไม่คิดว่าจะมีหนึ่ง atm ... BTW คุณสามารถเปลี่ยนsXX+Yเป็นtXY( s == .slice, t == .substr)
ETHproductions

@ ETHproductions โอ้ใช่ขอบคุณ!
Oliver


หรือเห็นเป็นอาร์เรย์กลับมาจะได้รับอนุญาต, 14 ไบต์
Shaggy



1

QBICขนาด 32 ไบต์

_L;|A=space$(a'\`2)+A[a|?_sA,b,a    

ชายมันเป็นเวลาสำหรับฉันที่จะเพิ่มspace$ใน QBIC

คำอธิบาย

  ;             Read a cmd line parameter as A$
_L |            And take its length as 'a'
A=space$        Set A$ to a number of spaces
(a'\`2)           equal to its own length halved
+A                prepended to itself
[a|             FOR b= 1 to the length of A$
?_sA,b,a        Print a substring of our space-padded A$, starting at the b'th character, running for a chars

วิ่งตัวอย่าง

Command line: acknowledgement
       acknowle
      acknowled
     acknowledg
    acknowledge
   acknowledgem
  acknowledgeme
 acknowledgemen
acknowledgement
cknowledgement
knowledgement
nowledgement
owledgement
wledgement
ledgement
edgement


1

Haskell , 86 70 ไบต์

นี่คือวิธี (ยัง) ยาวเกินไป แต่ขอบคุณ @bartavelle สำหรับเตือนฉันว่าการแสดงรายการของสตริงเป็นที่ยอมรับเช่นกัน!

f s|m<-div(length s)2=take(2*m+1).(`drop`((*>)s" "++s))<$>[m+1..3*m+1]

ลองออนไลน์!


ฉันทำได้แค่ 82: ลองออนไลน์!
bartavelle

@bartavelle ไม่ถูกต้อง ด้านขวาของคุณไม่ถูกสับ
อดัม

ใช่ฉันแนะนำข้อผิดพลาด! คุณสามารถได้รับเพียงเล็กน้อยโดยการวางข้อตกลงของคุณ: ลองออนไลน์!
bartavelle

และด้วยการสับเป็น 84 ทำให้วิธีการของคุณดีขึ้น! ลองออนไลน์!
bartavelle

และคุณสามารถประหยัดได้มากขึ้นเพราะคุณไม่จำเป็นต้องส่งคืนสตริงเดี่ยวรายการของสตริงก็โอเคเช่นกัน!
bartavelle


1

PowerShell , 133 119 ไบต์

$a="$args";$L=$a.Length;$m=($L+1)/2;$s=" "*($m-1)+$a+" "*($m-1);for($h=0;$h-lt$L;$h++){$r="";0..$L|%{$r+=$s[$_+$h]};$r}

ลองออนไลน์!

Ungolfed

$a="$args"
$L=$a.Length                        # the length of the input
$m=($L + 1) / 2                     # the midpoint of the input
$s=" " * ($m-1) + $a + " " * ($m-1) # create a string using the input and padded on both sides with spaces

for($h=0;$h -lt $L;$h++) {          # the height, matching the length of the input
    $r=""                           # init/reset the output string

    0..$L | % {                     # number range to represent each character in the string
        $r+=$s[$_+$h]               # append the output string with the next character
    }

    $r                              # write the output
}

1
คำตอบที่ดี! ยินดีต้อนรับสู่เว็บไซต์ :)
DJMcMayhem

1

งูหลาม 2 ,76 74 73 ไบต์

-1 ต้องขอบคุณ @FelipeNardiBatista

แน่นอนไม่สั้นเท่ากับคำตอบอื่น ๆ ของ Python แต่มันก็คุ้มค่าที่จะลองใช้วิธีที่ต่างไปอย่างสิ้นเชิง:

n=input();x=len(n)
for i in range(x):print((2*x-~i)*' '+n)[x+x/2:2*x+x/2]

ลองออนไลน์! (กับรุ่น 74 ไบต์)

นี่เป็นครั้งแรกที่สร้างสายอักขระเต็มแล้วแบ่งออกเป็นสี่เหลี่ยม


คำอธิบาย

n = การป้อนข้อมูล (); - รับอินพุตและกำหนดให้กับตัวแปร n
          x = len (n) - กำหนดความยาวของอินพุตให้กับตัวแปร x
สำหรับ i ในช่วง (x): - วนซ้ำในช่วง 0 ... x, พร้อมตัวแปร i
                   พิมพ์ - ส่งออกผลลัพธ์
                         ((2 * xi-1) * '' + n) - สร้างสตริง "diamond"
                                          [x + x / 2: 2 * x + x / 2] - ครอบตัดสตริงเพื่อให้พอดีกับกล่อง

(2*x+~i)เพื่อประหยัด byte
Felipe Nardi Batista

@FelipeNardiBatista ขอบคุณ

1

J , 19 ไบต์

|.!.' '"{~2%~#\-#\.

ลองออนไลน์!

คำอธิบาย

|.!.' '"{~2%~#\-#\.  Input: string S
             #\      Length of each prefix of S, [1, 2, ..., len(S)]
                #\.  Length of each suffix of S, [len(s), ..., 2, 1]
               -     Subtract elementwise
          2%~        Divide by 2
                     We now have a range [(1-len(S))/2, ..., -1, 0, 1, ..., (len(S)-1)/2]
       "{~           Use each value to operate on S
|.!.' '                Perform a shift while replacing characters with ' '

ทำงานร่วมกับ''การเปลี่ยน
FrownyFrog

0

C # (. NET Core) 101 ไบต์

(a)=>{int L=a.Length,l=L/2;for(;l-->0;)a=" "+a+" ";for(;++l<L;)Console.WriteLine(a.Substring(l,L));};

โดยพื้นฐาน @ คำตอบของ KevinCruijssen บันทึก 2 ไบต์เนื่องจากstring.Lengthไม่ต้องการ () และอีก 2 ไบต์เนื่องจากอาร์กิวเมนต์ที่สองของstring.Substring()คือความยาวแทนที่จะเป็นดัชนีสิ้นสุด แต่จากนั้นจะสูญเสีย 2 ไบต์เนื่องจากConsole.WriteLine()ยาวกว่า ฉันมีการนำไปใช้ที่ไร้เดียงสามากขึ้น แต่มันก็นานประมาณสองเท่า ...


0

Excel VBA ขนาด 68 ไบต์

แข็งแรงเล่นกอล์ฟ

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากเซลล์[A1]และเอาต์พุตไปยังหน้าต่างทันที VBE

l=[Len(A1)]:For i=Int(-l/2)+2To l/2+1:?Mid(Space(l-i)&[A1],l,l):Next

Ungolfed

Sub C(ByVal s As String)
    Let l = Len(s)
    For i = Int(-l / 2) + 2 To l / 2 + 1 Step 1
        Debug.Print Mid(Space(l - i) & s, l, l)
    Next i
End Sub

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