ตารางตัวหารหลัก


28

Intro

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

ตัวอย่างเช่นสำหรับการป้อนข้อมูล6, 9, 14, 22ตารางคล้ายกับต่อไปนี้จะถูกสร้างขึ้น:

    6  9 14 22
 2  *     *  *
 3  *  *
 7        *
11           *

นี้เป็นเพราะ6มีตัวหารที่สำคัญของ2และ3, 9มีตัวหารที่สำคัญของ3และอื่น ๆ

การก่อสร้าง

  • ตารางถูกสร้างขึ้นเพื่อให้ป้ายชื่อคอลัมน์ในรูปแบบตัวเลขที่คั่นด้วยช่องว่างและเรียงลำดับจากน้อยไปมาก (คุณสามารถสันนิษฐานได้ว่ามีการจัดเรียงไว้ล่วงหน้า) และตัวคั่นหลักจะแสดงรายการทางด้านซ้ายในลำดับจากน้อยไปหามาก ป้ายชื่อ
  • โปรดทราบว่าอาจต้องใช้ช่องว่างนำหน้าบนตัวหารหลักและหมายเลขอินพุทหากตัวเลขนั้นมีความยาวแตกต่างกันดังนั้นคอลัมน์ทั้งหมดจึงมีความกว้างและแถวเดียวกันอย่างเหมาะสม
  • ตัวหารแต่ละตัวจะแสดงเป็นตัวเดียว*(หรืออักขระ ASCII ที่เหมาะสมอื่น ๆ ที่คุณเลือกตราบใดที่มีการใช้ตัวอักษรเดียวกันสำหรับเหตุการณ์ทั้งหมด)
  • ตัวหารหลายตัวจะถูกละเว้น (เช่น3 x 3 = 9แต่มีเพียงอันเดียว*สำหรับจุดตัดนั้น)
  • *สามารถวางที่ใดก็ได้ในแนวนอนในคอลัมน์ตราบใดที่มันเป็นที่ชัดเจน (ผมมีตัวอย่างของฉันทั้งหมดที่มี*จัดชิดขวา)

อินพุต

  • รายการจำนวนเต็มบวกในรูปแบบที่สะดวกสบายแต่ละ>1รายการ
  • คุณสามารถสมมติว่าอินพุตถูกจัดเรียงล่วงหน้า
  • อินพุตรับประกันว่ามีค่าเฉพาะเท่านั้น

เอาท์พุต

การแทนค่า ASCII art ที่เป็นผลลัพธ์ของตารางตัวหารหลัก

กฎระเบียบ

  • ขึ้นบรรทัดใหม่หรือต่อท้ายช่องว่างหรือช่องว่างทั้งหมดเป็นตัวเลือกตราบใดที่ตัวละครตัวเองเข้าแถวอย่างถูกต้อง
  • ถ้าสั้นกว่าที่จะมีเส้นแบ่งที่แยกส่วนหัวของคอลัมน์ / แถวออกจากข้อมูลแบบตารางก็อนุญาตเช่นกัน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงก์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้คนสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

6,9,14,22

    6  9 14 22
 2  *     *  *
 3  *  *
 7        *
11           *


2,3,5,7

  2 3 5 7
2 *
3   *
5     *
7       *

2,4,8,16,32

   2  4  8 16 32
2  *  *  *  *  *

75,99,151,153

     75  99 151 153
  3   *   *       *
  5   *
 11       *
 17               *
151           *

1
เราสามารถแบ่งเส้นหลังแถวบนสุดและคอลัมน์ซ้ายได้ไหม?
ngenisis

@ngenisis แน่นอนฉันจะอนุญาต สูตรที่แน่นอนของตารางนั้นค่อนข้างเปิดกว้างเนื่องจากนั่นไม่ใช่แรงผลักดันที่แท้จริงของการท้าทายนี้
AdmBorkBork

คำตอบ:


5

Mathematica, 101 90 ไบต์

ขอบคุณ ngenisis สำหรับการบันทึก 11 ไบต์!

TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->‌{f,g}]&

ตัวละครหนึ่งในสามของผ่านทางเป็น U + 2223 (3 bytes) ฟังก์ชั่นที่ไม่มีชื่อของจำนวนตัวแปรของการขัดแย้งซึ่งแต่ละคนเป็นจำนวนเต็มไม่ใช่ศูนย์ซึ่งจะส่งกลับTableFormวัตถุ (เอาท์พุทที่จัดรูปแบบ) เช่น:

เอาต์พุต TableForm

f=#&@@@FactorInteger[1##]กำหนดfให้เป็นชุดของช่วงเวลาทั้งหมดที่หารอินพุตใด ๆ (เท่ากันหารผลิตภัณฑ์1##) ในขณะgที่รายการประกอบด้วยอินพุต Outer[If[#∣#2,Y,""]&,f,g]สร้างตารางของYสตริงและสตริงว่างที่สอดคล้องกับการหาร (เราใช้โทเค็นที่ไม่ได้กำหนดYแทนสตริง"Y"หรือ"*"บันทึกสองไบต์) จากนั้นเราใช้TableForm[...,TableHeadings->‌{f,g}]เพื่อจัดรูปแบบอาร์เรย์ผลลัพธ์ด้วยแถวและส่วนหัวคอลัมน์ที่เหมาะสม

การส่งก่อนหน้า:

Grid[p=Prepend;Thread[q[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}]~p~g,f~p~""]]/.q->p]&

""คุณสามารถปล่อยออกมาเป็นครั้งแรก
Martin Ender

2
TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&ถ้าอนุญาตให้ใช้วงเวียน
ngenisis

p[f,]และครั้งที่สองเช่นกันถ้าคุณจะเปลี่ยนไป
Martin Ender

อนุญาตให้ใช้เส้นกริดเพื่อแยกส่วนหัว
AdmBorkBork

1
TableFormเจ๋งหวังว่าจะอยู่ในกล่องเครื่องมือของฉัน!
เกร็กมาร์ติน

3

เจลลี่ , 18 ไบต์

PÆfQ0;ðḍ€+W}⁸;"o⁶G

ใช้1แทน*ตามที่อนุญาตโดยกฎ

ลองออนไลน์!

มันทำงานอย่างไร

PÆfQ0;ðḍ€+W}⁸;"o⁶G  Main link. Argument: A (array of integers greater than 1)

P                   Take the product of the integers in A.
 Æf                 Compute all prime factors (with multiplicity) of the product.
   Q                Unique; deduplicate the prime factors.
    0;              Prepend a 0. Let's call the result P.
      ð             Begin a new, dyadic chain. Left argument: P. Right argument: A
       ḍ€           Divisible each; for each p in P, test all integers in A for
                    divisibility by P. Yields one row of the shape of A for each p.
                    Note that the first element of P is 0, so the first row of the
                    resulting matrix contains only zeroes.
          W}        Wrap right; yield [A].
         +          Add the results to both sides. Because of how Jelly's auto-
                    vectorization works, this adds the first row of [A] (just A) to
                    the first row of the divisibility matrix (all zeroes) and
                    leaves the other rows untouched.
            ⁸;"     Prepend the elements of P to the corresponding rows of the
                    previous result.
               o⁶   OR space; replace all zeroes with spaces.
                 G  Grid; format the matrix as requested in the challenge spec.

2

เยลลี่ , 25 23 ไบต์

PÆfQ©ḍþµị⁾* ³;"Z⁶;®¤;"G

ลองออนไลน์!

อย่างไร?

มันอาจจะสั้นกว่าที่จะใช้ÆEและกรองแถวที่ว่างเปล่า

PÆfQ©ḍþµị⁾* ³;"Z⁶;®¤;"G - Main link: list of numbers, L
       µ                - monadic chain separation
P                       - product of L - multiply them all together
 Æf                     - prime factors (with repetitions, in ascending order)
   Q                    - unique items, maintaining order
                              - note that the product was performed to keep order
    ©                   - place in the register for later use, and yield
      þ                   - form the outer product of that and L using the dyad:
     ḍ                  -     isDivisor - 1 if divides, 0 if not
        ị⁾* <space      - index into "* " (1s to "*", 0s to " ")
            ³           - program's first input, L
             ;"         - zip with concatenation (column headers to the left)
               Z        - transpose (get it around the right way)
                   ¤    - nilad followed by link(s) as a nilad
                ⁶;®     - space (⁶) concatenated with (;) the register value (®)
                    ;"  - zip with concatenation (row labels to the left)
                      G - format the result as a grid (join items with spaces and
                                               rows with line feeds so they align)
                        - implicit print

2

JavaScript (ES6), 264 260 ... 179 173 ไบต์

a=>[for(c of s=' '.repeat(w=a.slice(-1),i=0))if(!+(r=[i++?i:s,...i<2?a:a.map(x=>x%i&&c)].map(y=>(s+y).slice(-(w+1).length),a=a.map(d=x=>i<2|x%i?x:d(x/i))).join``))r].join`
`

ฉันคิดว่าวิธีการนี้มีวิธีเรียกซ้ำแบบซ้ำอย่างถาวร (ปัจจุบัน 178 ไบต์):

f=(a,i=0,w=a.slice(-1))=>i++-w?(+(r=[i<2?'':i,...i<2?a:a.map(x=>x%i&&' ')].map(y=>(' '.repeat(w)+y).slice(-(w+1).length)).join``)?'':r+`
`)+f(a.map(d=x=>i<2|x%i?x:d(x/i)),i,w):''

ใช้0ในสถานที่*ซึ่งได้รับอนุญาตจากความท้าทาย

ตัวอย่างการทดสอบ


ถ้าฉันไม่เข้าใจผิดคุณสามารถใช้|โอเปอเรเตอร์ในคำสั่ง if เนื่องจากคุณเปรียบเทียบ 2 booleans ...
ลุค

@ ลุคเฮ้คุณพูดถูก ไม่แน่ใจว่าฉันพลาดได้อย่างไร
ETHproductions

การย้ายi<2เช็คภายใน.mapฟังก์ชั่นสั้นลงหรือไม่?
ลุค

@Luke หากคุณเปลี่ยนแปลงหมายถึง...i<2?a:a.map(x=>x%i&&c)การ...a.map(x=>i<2?x:x%i&&c)ที่ไม่มีที่สั้นกว่า หากคุณหมายถึงย้ายมันไปที่อื่น .mapบางที ...
ETHproductions

2

Python 2 - 197 ไบต์

เปลี่ยนเป็น Python 2 เพื่อการจัดการอินพุตที่ง่ายขึ้นและอนุญาตให้ `` สำหรับการแปลงสตริง ใช้gmpy2สำหรับสร้างนายกคนต่อไป รูปแบบผลลัพธ์ยังคงยึดตามการส่ง Python 3 ก่อนหน้า (ดูด้านล่าง) กล่าวคือเติมรายการgพร้อมสัญลักษณ์และการจัดรูปแบบ

import gmpy2
i=input()
n=len(i)+1
p=1;g=[' ']+i
while p<i[-1]:
 p=gmpy2.next_prime(p)
 t=['*'[m%p:]for m in i]
 if'*' in t:g+=[p]+t
print((('{:>%d}'%(len(`i[-1]`)+1)*n+'\n')*(len(g)/n)).format(*g))

ลองออนไลน์!

คำอธิบาย

สำหรับผู้ที่ไม่ต้องการถอดรหัสด้วยตนเอง

import gmpy2                    # arithmetic library
i=input()
n=len(i)+1                      # saves bytes by not needing ()
                                # afterwards
p=1                             # starting number
g=[' ']+i                       # initialsing header row
while p<i[-1]:                  # looping until last character
  p=gmpy2.next_prime(p)         # get the next prime
  t=['*'[m%p:] for m in i]      # verify whether p is a 
                                # divisor of each number
  if'*'in t:g+=[p]+t            # if any divisor found, append
                                # p + divisors to g.
print(
    (('{:>%d}'%(len(`i[-1]`)+1) # compute right formatting element
                                # for length of last character + 1
        *n+'\n'                 # repeat for each input + once
                                # for the prime and add newline
     )*(len(g)/n)               # repeat row format until g
                                # can be inserted
    ).format(*g)                # format using g
)


ก่อน

Python 3 - 251 ไบต์

ค่อนข้างมั่นใจว่าใครบางคนสามารถทำได้ดีกว่า ขึ้นอยู่กับคำตอบนี้สำหรับการสร้างจำนวนเฉพาะ k<

i=list(map(int,input().split(',')))
l=len(str(i[-1]))+1
n=len(i)+1
g=[0]+i+sum([l for l in [[k]+[j%k==0for j in i]for k in range(2,i[-1])if all(k%f for f in range(2,k))]if 1in l],[])
print((('{:>%d}'%l*n+'\n')*(len(g)//n)).format(*g).replace('0',' '))

เวอร์ชันที่ไม่ดีและคำอธิบายจะตามมา


4
ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

1
แทนที่จะi=list(map(int,input().split(',')))คุณก็สามารถทำและใช้การป้อนข้อมูลในรูปแบบi=input() [1, 2, 3, 4]
nedla2004

ขอบคุณฉันไม่รู้ แต่ฉันจะกลับมาทำใหม่ในภายหลัง :)
PidgeyUsedGust

คุณสามารถบันทึก 2 ไบต์ด้วยp=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]และลบพื้นที่if"*" inออก
Trelzevir

1

Mathematica, 165 ไบต์

ค่อนข้างละเอียด - บางทีบางคนสามารถทำอะไรกับมันได้:

(j=Join;a=#[[All,1]]&/@FactorInteger@#;b=Sort@DeleteDuplicates@Flatten@a;Grid[j[{j[{""},#]},Transpose@j[{b},Table[If[MemberQ[a[[t]],#],"*",""]&/@b,{t,Length@a}]]]])&


1

Python 2 , 181 179 bytes

-2 ไบต์ขอบคุณ FlipTack

n=input()
p=[]
t="%%%ss "%len(`n[-1]`)*-~len(n)
print t%(('',)+n)
i=2
while n[-1]/i:
 if all(i%j for j in p):
	p+=[i];s=['*'[m%i:]for m in n]
	if'*'in s:print t%tuple([i]+s)
 i+=1

อินพุตจะต้องเป็นสิ่งอันดับ
ลองออนไลน์!


ไม่all(i%j for j in p)ทำงานแทนการใช้map?
FlipTack

@FlipTack ใช่มันดีกว่า แต่ฉันเปลี่ยนบางสิ่งและลืมอัปเดตนี้
Rod

1

แบตช์ 451 ไบต์

@echo off
set/am=0,w=2,p=1
for %%n in (%*)do set/a"n=m-%%n,m+=(n>>31)*n
for /l %%i in (0,1,9)do set/am/=10,w+=!!m
set s=
for %%n in ("" %*)do set t=%%~n&call:t
set v=%*
:g
if not %s: =%==%p% echo%s%
if %m%==1 exit/b
set/at=p+=1,m=0
set s=
call:t
set v=&for %%n in (%v%)do set n=%%n&set t=&call:c
goto g
:c
set/ar=n%%p
if %r%==0 set/an/=p&set t=*&goto c
set/a"m|=n
set v=%v% %n%
:t
set t=           %t%
call set s=%%s%%%%t:~-%w%%%

คำอธิบาย: เริ่มต้นโดยการคำนวณความกว้างของเขตทางสูงสุดของค่าการป้อนข้อมูลw mสร้างบรรทัดแรกของการส่งออกโดย padding สตริงที่ว่างเปล่าและตัวเลขการป้อนข้อมูลเพื่อความกว้างwโดยใช้ tsubroutine จากนั้นวนซ้ำผ่านจำนวนเต็มเริ่มต้นที่ 2 สร้างบรรทัดของเอาต์พุตโดยการใส่จำนวนเต็มแล้วเรียกรูทีนย่อยcเพื่อรองสตริงว่างหรือดอกจันตามความเหมาะสมสำหรับแต่ละค่าอย่างไรก็ตามบรรทัดที่สร้างขึ้นจะถูกข้ามหากไม่มีเครื่องหมายดอกจัน เมื่อมีการสร้างเอาต์พุตแต่ละค่าจะถูกหารด้วยจำนวนเต็มจนกว่ามันจะเหลือส่วนที่เหลือดังนั้นลูปจะสิ้นสุดลงเมื่อไม่มีค่ามากกว่า 1

โปรดทราบว่าset v=ได้รับการดำเนินการหลังจากที่%v%ถูกแทนที่ลงในforลูปในบรรทัดเดียวกัน


1

Python 2 , 157 148 146 145 143 ไบต์

def p(*t):print'%%%ds '%len(`x[-1]`)*len(t)%t
def f(x):k=m=1;p(' ',*x);exec"r=[n%k and' 'for n in x]\nif 0in m%k*r:p(k,*r)\nm*=k*k;k+=1;"*x[-1]

ใช้0แทน*ตามที่อนุญาตโดยกฎ

ลองออนไลน์!

พื้นหลัง

ในการระบุช่วงเวลาเราใช้ทฤษฎีบทของวิลสัน :

ข้อพิสูจน์ทฤษฎีบทของวิลสัน

มันทำงานอย่างไร

บรรทัดแรกกำหนดฟังก์ชั่นตัวช่วย

def p(*t):print'%%%ds '%len(`x[-1]`)*len(t)%t

พีใช้เวลาจำนวนตัวแปรของการขัดแย้งที่จะเก็บใน tuple ที

'%%%ds '%len(`x[-1]`)ใช้สตริงรูปแบบที่จะสร้างสตริงรูปแบบ; %%เป็นเครื่องหมายเปอร์เซ็นต์ตามตัวอักษร%dเป็นตัวยึดสำหรับจำนวนเต็มที่len(`x[-1]`)ส่งคืนเช่นจำนวนหลักขององค์ประกอบสุดท้ายในx (อินพุตยังไม่ได้กำหนด) และเป็นตัวอักษร

ถ้าเช่นองค์ประกอบสุดท้ายของxมีสามตัวเลขอัตราผลตอบแทนนี้%3s ซึ่ง*len(t)ซ้ำครั้งสำหรับองค์ประกอบของทุกx สุดท้าย%tใช้สตริงรูปแบบที่ไป tuple ทีการสร้างสตริงของเสื้อ 's องค์ประกอบพื้นที่แยกออกจากกันและทุกขวาธรรมเพื่อความยาวบาง

บรรทัดที่สองกำหนดการส่งจริง: ฟังก์ชันfที่รับ list xเป็นอินพุต หลังจากแทนที่execคำสั่งซึ่งดำเนินการสตริงมันนำหน้าx[-1]ครั้งด้วยforวงเราได้รับรหัสต่อไปนี้

def f(x):
    k=m=1;p(' ',*x)
    for _ in range(x[-1]):
        r=[n%k and' 'for n in x]
        if 0in m%k*r:p(k,*r)
        m*=k*k;k+=1

ครั้งแรก initializes kและม.ไป1 ทราบว่า(k - 1)! = 0! = 1 = m

จากนั้นp(' ',*x)พิมพ์พื้นที่และจำนวนเต็มในxโดยใช้ฟังก์ชั่นหน้า

ทีนี้เราเข้าสู่ลูปเพื่อพิมพ์เอาท์พุทที่เหลือ

ครั้งแรกที่r=[n%k and' 'for n in x]สร้างรายการที่เหลือของแต่ละจำนวนเต็มที่nในxหารด้วยk เหลือบวกคือส่วนที่เหลือที่ไม่สอดคล้องกับหลายรายการkเป็น truthy and' 'และได้รับการแทนที่ด้วยพื้นที่โดย

m%k*rต่อไปเราจะสร้าง ตั้งแต่m = (k - 1)! โดยผลของทฤษฎีบทของวิลสันนี่จะเป็นเพียงแค่rถ้าkเป็นนายก แต่เป็นรายการที่ว่างเปล่าถ้าไม่ ถ้ามีอย่างน้อยหนึ่ง0ในผลที่ได้คือถ้าkเป็นสำคัญและอย่างน้อยหนึ่งจำนวนเต็มในxหารด้วยk , 0in m%k*rจะกลับมาทรูและp(k,*r)ได้รับการเรียกพิมพ์kและหารตัวชี้วัด: 0ถ้าหารพื้นที่หากไม่ได้ .

สุดท้ายเราคูณmด้วยและเพิ่มkดังนั้นคุณภาพm = (k - 1)! ยังคงถือ


1

MATL , 31 ไบต์

pYfu!Gy\~h0GhwvVZ{'(?<!\d)0'0YX

สิ่งนี้ใช้1แทน*ได้ตามที่ได้รับอนุญาตจากการท้าทาย

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย ( ล้าสมัย )

p           % Implictly input array of numbers. Push product of array
Yf          % Prime factors as a row vector
u           % Keep only unique values
!           % Transpose into column vector
G           % Push input again
y           % Duplicate column vector of unique prime factors onto top
\           % Modulo, element-wise with broadcast
~           % Negate
h           % Concatenate horizontally
0           % Push 0
G           % Push input again
h           % Concatenate horizontally
w           % Swap
v           % Concatenate vertically
V           % Char array representation
Z{          % Convert to cell array of strings. Each row gives a string
'(?<!\d)0'  % Push this string: match '0' not preceded by a digit
0           % Push this string: '0' will be replaced by char 0
YX          % Regexp replace
            % Implicit inoput. Char 0 is displayed as space

0

แร็กเก็ต 176 ไบต์

(let((p printf))(display"   ")(for((x nl))(p" ~a " x))(displayln"")(for((i '(2 3 7 11)))
(p"~a  " i)(for((j nl))(if(member i(prime-divisors j))(p" * ")(p"   ")))(displayln"")))

Ungolfed:

(define (f nl)
  (let ((p printf))

    (display "   ")
    (for ((x nl))
      (p " ~a " x))
    (displayln "")

    (for ((i '(2 3 7 11)))
      (p "~a  " i)
      (for ((j nl))
        (if (member i (prime-divisors j))
            (p " * ")
            (p "   ")))
      (displayln ""))))

การทดสอบ:

(f '(6 9 14 22))

เอาท์พุท:

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