เห็นภาพอัลกอริทึมแบบยุคลิดอีกครั้ง


10

งาน

รับจำนวนเต็มบวกสองตัว:

  1. วาดสี่เหลี่ยมที่มีขนาดที่ระบุโดยจำนวนเต็มสองตัว
  2. ทำซ้ำขั้นตอนที่ 3 จนกว่าจะไม่มีที่ว่าง
  3. วาดและเติมสี่เหลี่ยมที่ใหญ่ที่สุดโดยสัมผัสทั้งสามด้านของสี่เหลี่ยม (เหลือ)
  4. เอาท์พุทสี่เหลี่ยมที่เกิดขึ้น

ตัวอย่าง

ยกตัวอย่างเช่นการป้อนข้อมูลของเราคือและ610

เราวาดรูปสี่เหลี่ยมผืนผ้ากลวงขนาด 6 x 10:

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

หลังจากเติมช่องสี่เหลี่ยมซ้ำ ๆ นี่คือสิ่งที่เราจะได้รับ:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

มี 4 สี่เหลี่ยมอยู่ที่นี่ ( a, b, c, dแต่ละที่มีความยาวด้านข้าง) 6, 4, 2, 2ตามลำดับ

กฎและเสรีภาพ

  1. คุณต้องใช้ตัวอักษรที่แตกต่างกันสำหรับแต่ละช่อง
  2. คุณสามารถเลือกตัวอักษรที่จะรองรับตราบใดที่ตัวอักษรที่รองรับเป็นตัวอักษรที่พิมพ์ได้ทั้งหมดและมี10ตัวอักษรอย่างน้อยรองรับ
  3. ในแต่ละการวนซ้ำของขั้นตอนที่ 3 ข้างต้นคุณมีสองตัวเลือก (ยกเว้นในการทำซ้ำครั้งล่าสุดซึ่งคุณมีเพียงหนึ่งตัวเลือก) ตัวเลือกทั้งสองนั้นถูกต้อง
  4. จำนวนสี่เหลี่ยมที่ต้องการจะต้องไม่เกินจำนวนตัวอักษรที่คุณสนับสนุน
  5. คุณสามารถกรอกข้อมูลลงในช่องสี่เหลี่ยมที่มีตัวอักษรที่คุณสนับสนุนในลำดับใด

Testcases

การป้อนข้อมูล: 6, 10

เอาท์พุท:

aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaaccdd
aaaaaaccdd

หรือ

aaaaaaccdd
aaaaaaccdd
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb
aaaaaabbbb

หรือ

bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
ccddaaaaaa
ccddaaaaaa

หรือ

ccddaaaaaa
ccddaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa
bbbbaaaaaa

หรือ

ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddaaaa
ddddddbbcc
ddddddbbcc

การป้อนข้อมูล: 1,1

เอาท์พุท:

a

การป้อนข้อมูล: 1,10

เอาท์พุท:

abcdefghij

การป้อนข้อมูล: 10,1

เอาท์พุท:

a
b
c
d
e
f
g
h
i
j

โปรดทราบว่ามีความเป็นไปได้มากกว่าที่ฉันสามารถรวมไว้สำหรับการทดสอบข้างต้น

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์

ช่องโหว่มาตรฐานใช้


ที่เกี่ยวข้อง
Leun Nun

คำตอบ:


3

ถ่าน 30 ไบต์

NδNγFβ¿×γδ«UOγδι¿‹γδA⁻δγδA⁻γδγ

ลองออนไลน์! คำอธิบาย:

Nδ      Input d
Nγ      Input g
Fβ      For i In ['a' ... 'z']
 ¿×γδ«   If g * d
  UOγδι   Oblong g, d, i
  ¿‹γδ    If g < d
   A⁻δγδ   d = d - g
   A⁻γδγ   Else g = g - d

คำสั่ง Oblong ที่น่ารำคาญของ Charcoal จะไม่ใช้0กับมิติซึ่งมีค่าใช้จ่ายฉัน 4 ไบต์ วิธีอื่นจะวนซ้ำในขณะg * dนั้น แต่ฉันไม่สามารถหาวิธีวนซ้ำb(ซึ่งกำหนดไว้ล่วงหน้ากับตัวอักษรตัวพิมพ์เล็ก)


โอ๊ะโอขออภัยนั่นเป็นการตัดสินใจที่ใส่ใจคุณคิดว่าควรอนุญาตให้ป้อนข้อมูลเชิงลบด้วยหรือไม่
ASCII- เท่านั้น

@ ASCII เท่านั้นพฤติกรรมปัจจุบันคืออะไร (ทั้งสำหรับ 0 และลบ) ความคิดที่ดีที่สุดของฉันคือการลบจะดึงไปทางซ้าย / บนแทนที่จะเป็นขวา / ล่าง (ถ้าฉันใช้ฉันW×γδจะพิมพ์จดหมายที่แตกต่างกันในแต่ละครั้งได้อย่างไร)
Neil

@ ไม่มีเลยฉันเห็นสิ่งที่คุณหมายถึงว่าจะน่ารำคาญ
Magic Octopus Urn



1

เยลลี่ 32 ไบต์

Ṁ,ạ/y
³,⁴ÇÐĿp/€Fs2
pµ¢ṣLµ€+95ỌsY

ลองออนไลน์!

Ṁ,ạ/yคุณต้องการคำอธิบายหรือไม่ นี่ไง

Ṁ,ạ/y          - perform one step of the Euclidean Algorithm, input 2-element list
 ,             - pair of the following two:
Ṁ              -  maximum of the the input list
  ạ/           -  absolute difference of the two elements
    y          - use this as a mapping on the input.

³,⁴ÇÐĿp/€Fs2   - apply Euclidean Algorithm
³,⁴            - start with the pair [input 1, input 2]
   Ç           - apply a step of the Euclidean Algorithm
    ÐĿ         - repetitively until the results repeat
      p/€      - take the Cartesian product of each step
         Fs2   - flatten and split into all coordinate pairs of letters

pµ¢ṣLµ€+95ỌsY
p              - Cartesian product of inputs: provides all possible coordinate pairs.
 µ   µ€       - for each coordinate
   ṣL         - find the number of times it is included in
  ¢           - the above list of covered coordinates.
       +95Ọ   - convert number of times to letters
           s  - split into rows
            Y - join by newlines.

ฉันสามารถมีแนวโน้มกอล์ฟเล็ก ๆ น้อย ๆ ³,⁴มากขึ้นโดยใช้ข้อโต้แย้งโดยปริยายแทน


1

Haskell , 181 ไบต์

import Data.List
(['!'..'~']&)
a#[]=a
a#b=zipWith(++)a$transpose b
(s&a)b|b<1=[]|b>a=transpose$s&b$a|n<-div a b,(t,u)<-splitAt n s=foldl1(#)((<$[1..b]).(<$[1..b])<$>t)#(u&b$mod a b)

ลองออนไลน์!

สำหรับจำนวน10ไบต์ที่มากขึ้นคุณจะได้เกลียวที่ดีแทน :)

!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!$$$#####
!!!!!!!!!!!!!%%'#####
!!!!!!!!!!!!!%%&#####
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""
!!!!!!!!!!!!!""""""""

ลองออนไลน์!

Ungolfed

(#)ประกอบการทำให้สองเมทริกซ์ถัดจากแต่ละอื่น ๆ แต่ transposes หนึ่งที่เหมาะสมเช่น:

!!!                !!!"
!!! # "#$    ->    !!!#
!!!                !!!$

a # [] = a
a # b  = zipWith (++) a $ transpose b

นี้เป็นพื้นรุ่น recursive ของอัลกอริทึมของยุคลิด แต่แทนที่จะลืมหารและเหลือและกลับมาก็สร้างสี่เหลี่ยมจากมันและสะสมเหล่านี้ด้วยgcd ตัวแปรตัวอักษรที่เหลือที่เราสามารถใช้:(#)s

(s & a) b
  | b == 0 = []                     -- Base case
  | b > a = transpose $ (s & b) a   -- In this case we can just flip the arguments and rotate the result by 90 degrees
  | n <- div a b                    -- set n to the number of squares we need
  , (t,u) <- splitAt n s =          -- take n characters, ..
               ((<$[1..b]).(<$[1..b]) <$> t)                     -- .. build squares from them and ..
    foldl1 (#)                                                   -- put them next to each other
                                             (u & b $ mod a b)   -- recursively build the smaller squares with the remaining characters..
                                            #                    -- .. flip them and put them next to the previous one(s)

ฟังก์ชั่นที่เกิดขึ้นจริงเพียงแค่เรียกฟังก์ชั่นจากด้านบนด้วยสายอักขระที่พิมพ์ได้ทั้งหมด:

(['!'..'~']&)

คุณจำเป็นต้องนับการใช้งานimport Data.List transpose
Anders Kaseorg

ฉันทำ แต่เป็นไปไม่ได้ที่จะนำเข้าเมื่อฉันใช้ฟังก์ชั่น pointfree แต่ผมรวมไว้ในการนับไบต์โปรดดู TIO ที่นับไบต์เป็นจริง164..
ბიმო

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