มหาวิหารเศษส่วน


22

รับจำนวนเต็มบวกn >= 1เอาท์พุทnแถวแรกของโครงสร้างต่อไปนี้:

   #
  # #
  ###
 #   #
 # # #
 ## ##
 #####
#     #
#  #  #
# # # #
# ### #
##   ##
## # ##
### ###
#######

n-th แถว 1 การจัดทำดัชนีเป็นฐานเป็นตัวแทนของnกระจกโดยไม่คัดลอกตัวอักษรตัวสุดท้ายที่มี#ในสถานที่ของที่ 1 และ<space>ในสถานที่ของ 0. แถวทั้งหมดเป็นศูนย์กลาง

คุณต้องแสดงผลเป็น ASCII-art แต่คุณสามารถใช้อักขระที่ไม่ใช่ช่องว่างแทนตำแหน่งที่ฉันใช้#ในตัวอย่าง อนุญาตให้ใช้ช่องว่างต่อท้ายและขึ้นบรรทัดใหม่ได้ เอาต์พุตต้องมีลักษณะตัวอย่างและไม่มีช่องว่างนำหน้าหรือบรรทัดใหม่นำหน้า

คุณสามารถดู 1023 แถวแรกของโบสถ์เศษส่วนที่นี่

เพื่อสร้างกรณีทดสอบขนาดใหญ่ขึ้นนี่คือการใช้งานอ้างอิงที่ไม่ได้เกิดขึ้นในPython


ความคิดดี. ฉันจะไม่เดาเลขฐานสองที่จะผลิตงาน ASCII ที่น่ารัก
Jonah

@Jonah ขอบคุณ :) ดีใจที่คุณชอบ
HyperNeutrino

7
ลิงก์ทั้งสองชี้ไปที่มหาวิหารที่สร้างขึ้น
Otávio

@ Otávio: ฉันจะแก้ไขขอบคุณ
HyperNeutrino

คำตอบ:


6

MATL 10 ไบต์

:B2&Zv35*c

ลองออนไลน์!

คำอธิบาย

:      % Implicitly input n. Push range [1 2 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to
       % a number. Rows have left-padding zeros if needed
2      % Push 2
&Zv    % Symmetrize along sepecified dimension (2nd means horizontally),
       % without repeating the last element
35*    % Multiply by 35 (ASCII code for '#')
c      % Convert to char. Char 0 is shown as space. Implicitly display

1
ฉันสงสัยว่ามันจะเป็นประโยชน์หรือไม่ถ้าเพิ่มตัวบิวอินบางชนิดที่สอดคล้องกับการคูณด้วย 35 แล้วแปลงเป็นตัวอักษร ดูเหมือนว่าจะใช้บ่อย
Conor O'Brien

@ ConorO'Brien มันถูกใช้บ่อยใช่ แต่มันจะเป็นสองถ่านในตัวดังนั้นจะไม่มีกำไร
หลุยส์ Mendo

ไม่ได้อะไร? 35*cคือ 4 ตัวอักษร
Conor O'Brien

@ ConorO'Brien Ah คุณหมายถึงการ35แก้ไขหรือไม่ ดูเหมือนจะเฉพาะเจาะจงเล็กน้อย ในอีกด้านหนึ่งความท้าทายบางอย่างอนุญาตให้ตัวอักษรใด ๆ ดังนั้นจึงอาจเป็นความคิดที่ดี คุณคิดว่า#เป็นเรื่องธรรมดาที่สุดหรือไม่?
Luis Mendo

2
สำหรับการอ้างอิงคุณสมบัตินี้ได้รับการดำเนินการ (ฟังก์ชั่นที่Zcมีตัวละคร35เช่น#) ขอบคุณ @ ConorO'Brien!
Luis Mendo

5

05AB1E , 9 ไบต์

รหัส:

Lb€û.c0ð:

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

L              # List [1, .., input]
 b             # Convert each to binary
  €û           # Palindromize each binary number
    .c         # Join the array by newlines and centralize
      0ð:      # Replace zeroes by spaces

4

เยลลี่ 12 ไบต์

RBUz0ZUŒBo⁶Y

ลองออนไลน์!


1
ฉันต้องไปด้วยดังนั้นฉันจะอ่านความคิดเห็นเมื่อฉันกลับมา รู้สึกอิสระที่จะออกไปเล่นกอล์ฟฉัน
Leun Nun

+1 สำหรับ "อย่าลังเลที่จะเอาชนะฉัน" และสำหรับคำตอบที่ดี
Magic Octopus Urn

3

Python 2 , 92 ไบต์

n=input()
for x in range(n):s=bin(2**len(bin(n))/4+x+1)[3:].replace(*'0 ');print s+s[-2::-1]

ลองออนไลน์!

ใน Python 3 s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')นั้นสั้นกว่า แต่int(input())และ parens รอบ ๆprintอาร์กิวเมนต์สามารถดันได้สูงสุด 95 ไบต์


นั่นเป็นสำเนาของฉัน :) ( แต่ใช้ฉลาดของ2**len(bin(n))/4anyways)
เอริก Outgolfer

3

JavaScript (ES6), 106 ไบต์

ใช้1เป็นอักขระที่ไม่ใช่ช่องว่าง

f=(n,k=0)=>k++<n?[...Array(32-Math.clz32(n))].reduce((s,_,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,k):''

การสาธิต

รุ่นสำรอง (ขนาดเดียวกัน)

โดยไม่ต้องMath.clz32():

f=(n,a=[k=i=0])=>n>>i+1?f(n,a,a[++i]=i):k++<n?a.reduce((s,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,a):''

1
ดีมาก! ครั้งแรกที่ฉันเห็นMath.clz32- ฉันไม่รู้ด้วยซ้ำว่ามันมีอยู่จริง!
Birjolaxew

@ Birjolaxew Yup นี่คือการเพิ่ม ES6 มันมีประโยชน์ทุกครั้งในขณะที่
Arnauld

3

Husk , 21 20 18 ไบต์

ขอบคุณ @Zgarb สำหรับการเล่นกอล์ฟ 2 ไบต์!

S↑(tfS=↔ΠR" #"←DLḋ

ลองออนไลน์!

Ungolfed / คำอธิบาย

เพื่อหลีกเลี่ยงการขยายความยาวสิ่งนี้จะกำหนดความกว้างของเศษส่วนที่กำหนดให้2*len(bin(N))-1และสร้างลำดับทั้งหมดของความยาวนั้นด้วยสัญลักษณ์#,_('_' หมายถึงช่องว่าง)

เนื่องจากกำลังคาร์ทีเซียนถูกสร้างขึ้นตามลำดับและเลขฐานสองก็เช่นกัน สิ่งที่เราต้องทำเพื่อให้ได้เศษส่วน ณ จุดนี้คือการกรอง palindromes ทั้งหมดและนั่นคือ:

                    -- implicit input N
S↑(                 -- take N from the following list
        ΠR" #"      --   Cartesian power of [" #"] to
                Lḋ  --     number of bits in bin(N)
               D    --     2*
              ←     --     -1
    fS=↔            --   filter out palindromes
   t                --   drop the first line (all spaces)

1
Ṙ;สามารถเป็นเพียงแค่Rและȯไม่จำเป็น แนวคิดคำตอบที่ดี!
Zgarb


2

Mathematica ขนาด 98 ไบต์

Riffle[Nest[ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&,{1},⌊Log2@#⌋]~Take~#"#"/. 0->" ","
"]<>""&

ลองที่กล่องWolfram ! และสามไบต์ในแต่ละ

มันเป็นวิธีการที่แตกต่างจากคำตอบอื่น ๆ จนถึงขณะนี้โดยใช้ธรรมชาติของเศษส่วนของรูปแบบ ขั้นตอนสำคัญคือArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&ซึ่งทำสิ่งที่เศษส่วนอธิบายได้ดีที่สุดในรูปแบบของภาพ:

                 [    ]
                 [grid]
[    ]           [    ]
[grid]   --->   #      #
[    ]          #[    ]#
                #[grid]#
                #[    ]#

รหัสนี้ทำซ้ำขั้นตอนนี้มากพอที่จะได้รับอย่างน้อยnแถวจากนั้นตัดขอบแถวเพิ่มเติมและแสดงเป็นอย่างดี




2

C # (. NET Core) , 192 178 ไบต์ 168 + 23

ขอบคุณ TheLethalCoder สำหรับความช่วยเหลือ

x=>new int[x].Select((_,z)=>Convert.ToString(z+1,2).PadLeft((int)Math.Log(x,2)+2).Replace('0',' ')).Aggregate((y,z)=>y+"\n"+z+new string(z.Reverse().Skip(1).ToArray()))

ลองออนไลน์!

ค่อนข้างแน่ใจว่าสิ่งนี้สามารถลดลงได้มากมีแนวโน้มมากที่สุดในการขยายและการย้อนกลับของสตริง


ยินดีต้อนรับสู่ PPCG! ในขณะนี้คำตอบนี้เป็นเพียงข้อมูลโค้ด สามารถแก้ไขได้โดยการเพิ่มจำนวนx=>ลงในไบต์และโปรดทราบว่าคุณไม่จำเป็นต้องรวมเครื่องหมายเซมิโคลอนต่อท้าย Enumerable.Range(1,x).Select(zสั้นลงnew int[x].Select((_,z)(ฉันคิดว่าถูกต้อง) ในขณะที่คุณกำลังใช้ Linq คุณควรรวมusing System.Linq;เข้าไปในจำนวนไบต์ของคุณ คุณยังใช้อยู่Mathดังนั้นคุณควรรวมusing System;หรือมีคุณสมบัติครบถ้วน โปรดทราบว่านี่จะสั้นกว่านี้namespace System.Linq{}
TheLethalCoder

คุณไม่จำเป็นต้องรวม,' 'ในการPadLeftโทรเนื่องจากช่องว่างเป็นค่าเริ่มต้น
TheLethalCoder


@TheLethalCoder ขออภัยในความไม่สะดวกตอนนี้ได้รับการแก้ไขแล้ว
Dennis.Verweij

ไม่ต้องกังวล +1 จากฉันมันเป็นคำตอบที่ดี :)
TheLethalCoder

1

ถ่าน 28 ไบต์

A…·¹NθW⌈θ«Eθ§ #κ↓⸿AEθ÷κ²θ»‖O

ลองออนไลน์!การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

A…·¹Nθ

สร้างรายการแรก nหมายเลขธรรมชาติ

W⌈θ«

ทำซ้ำจนกระทั่งองค์ประกอบทั้งหมดเป็นศูนย์

Eθ§ #κ

พิมพ์เลขฐานสองตัวสุดท้ายของแต่ละองค์ประกอบของรายการเป็นหรือ#หรือ

↓⸿

ย้ายไปที่คอลัมน์ก่อนหน้า

AEθ÷κ²θ

แบ่งองค์ประกอบทั้งหมดของรายการด้วยสอง

»‖O

เมื่อวาดครึ่งซ้ายแล้วให้สะท้อนกลับ


Charcoal เวอร์ชันปัจจุบันมีขนาดMapAssignRight(IntDivide, 2, q);ที่ประหยัดได้ 3 ไบต์
Neil

1

J, 29 ไบต์

' #'{~(],}.@|.)"1@(#.^:_1)@i.

ลองออนไลน์!

คำอธิบาย

  • i. จำนวนเต็มสูงสุด n, อินพุต
  • (#.^:_1) แปลงเป็นฐาน 2
  • (],}.@|.)ทีละแถว ( "1ทำส่วนนั้น) รับเลขฐานสอง ( ]คือรหัสประจำตัว fn) และ cat (( ,) ด้วย reverse ( |.) โดยที่ reverse ถูกตัดหัว ( }.)
  • ' #'{~แปลง1s และ0s เป็น hash และช่องว่าง

คุณสามารถใช้แทน#.inv #.^:_1
Conor O'Brien

@ ConorO'Brien ขอบคุณไม่รู้ว่า
โยนาห์

ไม่ได้เป็นอย่างนี้หรือ? สำหรับn = 1คุณพิมพ์อะไร อย่างไรก็ตามคุณสามารถโกนทิ้งได้สองสามไบต์โดยมีการเปลี่ยนแปลงเล็กน้อยเช่นนั้น' #'{~(,|.@}:)"1@#:@:>:@i.(หากคุณได้รับอนุญาตให้ปิดโดยคุณสามารถลบได้อีก 4 ไบต์) โดยทั่วไปใช้เบ็ดเพราะมีประสิทธิภาพเช่นเดียวกับส้อมเมื่อขวากหนามซ้าย]และใช้ในตัว#:ซึ่ง AFAIK #.invเป็นเรื่องเดียวกันกับที่ แก้ไข: ฉันคิดว่าคำตอบของฉันคล้ายกันมากพอที่จะรับประกันความคิดเห็นโปรดแจ้งให้เราทราบหากคุณคิดว่าควรเป็นคำตอบของตัวเอง
โคล

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

@Jonah คุณอาจลองใช้แล้ว2 #:ซึ่งจะได้รับตัวเลขที่ถูกต้องที่สุดเท่านั้น #:ฟังก์ชั่นMonadic เช่นเดียวกับ#.inv(หรือ#.&:_1) สิ่งนี้แตกต่างจาก dyadic #:ซึ่งให้ตัวเลขมากที่สุดเท่าที่มีอะตอมในอาร์กิวเมนต์ซ้าย
โคล



1

PHP, 98 97 95 94 + 1 ไบต์

while($r++<$argn)echo$s=strtr(sprintf("%".-~log($argn,2).b,$r),0," "),substr(strrev("
$s"),1);

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์ ใช้1เป็นช่องว่างที่ไม่ใช่


ขอโทษที่ทำให้เสีย แต่มีบางอย่างผิดปกติที่นี่ เอาท์พุทสำหรับ$argn=1และ$argn=3ไม่ถูกต้องและ$argnเป็น 0-based (ระบุ 1-based)
เฟลิกซ์ Palmen

1
แก้ไข @ FelixPalmen แล้ว ความไม่ถูกต้องเกิดจากฐานที่ไม่ถูกต้อง ขอบคุณที่สังเกต
ติตัส




0

C (gcc) , 146 108 105 ไบต์

#define o putchar(33-!(c&(1<<n)))
b;c;p(n){--n?o,p(n),o:o;}f(n){while(n>>++b);while(c++<n)p(b),puts("");}

ลองออนไลน์!

นี่คือฟังก์ชั่นที่f(n)เรียกใช้โดยมีจำนวนแถวnโดยใช้เครื่องหมายอัศเจรีย์ ( !) เป็นอักขระที่ไม่ใช่ช่องว่าง

คำอธิบาย :

#define o putchar(33-!(c&(1<<n)))
b;c;
p(n)
{
    // least significant bit not yet reached?
    --n?
            // print bit twice with recursive step between
            o,
            p(n),
            o
        // for least significant, just print this bit
        :o;
}

// the main "cathedral function":
f(r)
{
    // determine max number of bits to shift
    while(r>>++b);

    // iterate over rows
    while(c++<r)

        // print row recursively
        p(b),

        // newline
        puts("");
}

/**
 * footer, just calling the function
 */
main(int argc, char **argv)
{
    f(atoi(argv[1]));
}

แนะนำ--n&&o+p(n);o;แทน--n?o,p(n),o:o;และfor(;c++<n;puts(""))p(b);แทนที่while(c++<n)p(b),puts("");
ceilingcat

0

JavaScript (Node.js) , 156 149 ไบต์

-7 ไบต์โดย @ ConorO'Brien

f=(n,w=n.toString(2).length,b=n.toString(2).replace(/0/g," "),s=" ".repeat(w-b.length))=>`${--n?f(n,w)+s+b+[...b].reverse().join``.substr(1):s+"1"}
`

ลองออนไลน์!

ฟังก์ชั่นวนซ้ำ น่าเสียดายที่ JS ไม่สนับสนุนการย้อนกลับสตริงดังนั้น 19 ไบต์จึงถูกใช้เพื่อเปลี่ยนให้เป็นอาร์เรย์และย้อนกลับ


1
คุณสามารถใช้[...b]แทนb.split(""); คุณสามารถใช้.join``.substr(1)แทน.join("").substr(1); ในที่สุดฉันคิดว่าคุณสามารถใช้s+1แทนs+"1"
Conor O'Brien


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