หมายเลขนี้เป็นสามเหลี่ยมหรือไม่


33

ท้าทาย

รับค่าจำนวนเต็มบวกกำหนดว่าเป็นตัวเลขสามเหลี่ยมหรือไม่และส่งออกหนึ่งในสองค่าคงที่และค่าที่ต่างกัน

คำนิยาม

จำนวนสามเหลี่ยมเป็นจำนวนที่สามารถแสดงเป็นผลรวมของจำนวนเต็มบวกติดต่อกันเริ่มต้นที่ 1 พวกเขายังสามารถแสดงออกด้วยสูตรn(n + 1) / 2ที่nเป็นจำนวนเต็มบวกบาง

กรณีทดสอบ

Truthy:

1
3
6
10
15
21
55
276
1540
2701
5050
7626
18915
71253
173166
222111
303031
307720
500500
998991

Falsy:

2
4
5
7
8
9
11
16
32
50
290
555
4576
31988
187394
501500
999999

กฎระเบียบ

  • ผลงานของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรม
  • คุณอาจจะคิดว่าการป้อนข้อมูลที่เป็นจำนวนเต็มบวกอายุต่ำกว่า 10 6
  • คุณต้องเลือกเอาต์พุตสองค่าคงที่และแตกต่างกันเพื่อแยกความแตกต่างของสองหมวดหมู่

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาจะชนะ


1
ที่เกี่ยวข้อง , ที่เกี่ยวข้อง
ETHproductions



ทำไมคุณไม่รวมศูนย์?
Neil

1
@Neil ฉันต้องการลดจำนวนกรณีที่เป็นไปได้ให้น้อยที่สุดและการจัดการศูนย์เป็นหนึ่งในนั้นที่ฉันรู้สึกว่าไม่สำคัญเกินไป คุณคิดว่ามันจะดีกว่าไหมถ้าจำเป็นต้องจัดการให้เป็นศูนย์? (ตัวอย่างเช่นคำตอบของเยลลี่ล้มเหลวเป็นศูนย์เช่น)
ETHproductions

คำตอบ:


21

Haskell , 23 ไบต์

แก้ไข:

  • -1 ไบต์: @xnor $ได้กำจัดวงเล็บด้วย

ฟังก์ชั่นที่ไม่ระบุชื่อสละและกลับIntChar

เอาท์พุท'1'สำหรับตัวเลขสามเหลี่ยมและ'0'สำหรับคนอื่น ๆ

(!!)$show.(10^)=<<[0..]

ลองออนไลน์!

  • ((!!)$show.(10^)=<<[0..]) 998991ใช้เป็น
  • สร้างตัวเลข 1, 10, 100, 1000, ... , แปลงตัวเลขเหล่านั้นเป็นสตริงและเชื่อมโยงมันเข้าด้วยกัน จากนั้นสร้างดัชนีลงในสตริงที่ไม่มีที่สิ้นสุดที่เป็นผลลัพธ์

    "1101001000100001000001000000...

6
วิธีการจินตนาการ! (!!)$show.(10^)=<<[0..]คุณสามารถบันทึกไบต์ด้วย
xnor

20

Pythonขนาด 24 ไบต์

lambda n:(8*n+1)**.5%1>0

ลองออนไลน์!

เอาต์พุตFalseสำหรับตัวเลขสามเหลี่ยมTrueสำหรับส่วนที่เหลือ ตรวจสอบว่า8*n+1เป็นตารางที่สมบูรณ์แบบ Python จะใช้เวลากำลังสองที่สมบูรณ์แบบในจำนวนเต็มที่แน่นอนลอยไม่ว่าจะมีขนาดใหญ่เท่าใดจึงไม่มีปัญหาจุดลอยตัว


3
(1<<10000)**.5: OverflowError: int มีขนาดใหญ่เกินไปที่จะแปลงเป็น float
isaacg

@isaacg ความท้าทายไม่จำเป็นต้องใช้อินพุตที่มีขนาดใหญ่: "คุณอาจคิดว่าอินพุตเป็นจำนวนเต็มบวกที่ต่ำกว่า 10 ^ 6"
trichoplax

1
@trichoplax ฉันคิดว่าฉันกำลังโต้แย้งการอ้างสิทธิ์ของ xnor ในข้อความ การส่งเป็นเรื่องปกติฉันเห็นด้วย
isaacg

13

เยลลี่ 4 ไบต์

R+\ċ

ลองออนไลน์!

อย่างไร?

R+\ċ - Main link: n
R    - range(n)   -> [1,2,3,...,N]
  \  - cumulative reduce by:
 +   -   addition -> [1,3,6,...,T(N)]
   ċ - count occurrences of right (n) in left -> 1 if triangular, 0 otherwise

ฉันประหลาดใจที่การลดลงสะสมไม่ได้สร้างช่วงโดยอัตโนมัติ มีตัวเลือกการออกแบบที่อยู่เบื้องหลังสิ่งนี้หรือไม่?
ETHproductions

ฉันไม่แน่ใจ 100% แต่ฉันคิดว่ามันจะต้อง (โดยอย่างน้อยในปัจจุบัน) จำเป็นต้องได้รับการลดขนาดของการทำ dyadic ซึ่งจะทำให้เกิดช่วง
Jonathan Allan

... จริง ๆ แม้ดูเหมือนจะไม่ได้ใช้ (เช่นนี้เทียบกับนี้ดูเหมือนว่าการดำเนินการอย่างรวดเร็วของการเชื่อมโยงดังกล่าวแทนที่ที่ iterable ไม่ได้ทำให้ช่วงแม้ว่าการดำเนินการ dyadic กำหนดให้ทำเพื่อโต้แย้ง Pinged Dennis to field อันนี้ :)
Jonathan Allan

@ETHproductions /และ\อาจเป็นหนึ่งในห้าquicks แรกที่จะนำไปใช้ก่อนที่ความคิดที่จะโยนอาร์กิวเมนต์จำนวนเต็มไปยังช่วง
เดนนิส

13

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

(^1|1\1)+$

อินพุตไม่พร้อมกัน เอาท์พุทเป็นหรือ01

ลองออนไลน์! (เป็นชุดทดสอบที่แปลงเป็นทศนิยมแบบทศนิยมเพื่อความสะดวก)

คำอธิบาย

นี่คือการฝึกขั้นพื้นฐานที่สุดในการอ้างอิงล่วงหน้า คนส่วนใหญ่คุ้นเคยกับ backreferences ใน regex เช่น(.)\1เพื่อจับคู่อักขระซ้ำ อย่างไรก็ตามรสชาติขั้นสูงบางอย่างช่วยให้คุณสามารถใช้การอ้างอิงย้อนกลับก่อนหรือภายในกลุ่มที่อ้างอิง ในกรณีนี้มักเรียกว่าการอ้างอิงไปข้างหน้า วิธีนี้จะสมเหตุสมผลถ้ามีการอ้างอิงซ้ำ มันอาจไม่ได้กำหนดไว้อย่างดีในการทำซ้ำครั้งแรก แต่ในการทำซ้ำต่อมากลุ่มในภายหลังหรือโดยรอบได้จับบางสิ่งบางอย่างและสามารถนำกลับมาใช้

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

(        # This is group 1, which we'll repeat 1 or more times.
  ^1     #   Group 1 either matches a single 1 at the beginning of the string.
|        # or
  1\1    #   It matches whatever the previous iteration matched, plus another
         #   1, thereby incrementing our counter.
         # Note that the first alternative only works on the first iteration
         # due to the anchor, and the second alternative only works *after*
         # the first iteration, because only then the reference is valid.
)+
$        # Finally, we make sure that we can exactly hit the end of the
         # string with this process.

1
ทำไมไม่(^|1\1)+$ทำงาน
Leun Nun

3
@LeakyNun regex engine มีการเพิ่มประสิทธิภาพที่พวกเขาหยุดการทำซ้ำกลุ่มถ้ามันว่างเปล่าnครั้งโดยที่nคือจำนวนขั้นต่ำของปริมาณที่คุณใช้ (ในกรณีของคุณ 1; ถ้าน้อยที่สุดคือ 0 มันจะลองอีกครั้ง) . ถ้าคุณเปลี่ยน+ไป{2,}ก็ควรจะทำงาน การปรับให้เหมาะสมนี้ป้องกันลูปไม่สิ้นสุด แต่ก็เป็นเพียงสิ่งเดียวที่ทำให้. NET regex ไม่ให้ทัวริงสมบูรณ์ด้วยตัวเอง
Martin Ender

สิ่งนี้ช่วยฉันได้ 70 ไบต์: codegolf.stackexchange.com/a/118387
Neil

ทำที่ 74 ไบต์ขอบคุณ\G!
Neil


8

Mathematica ขนาด 16 ไบต์

OddQ@Sqrt[1+8#]&

หลักพอร์ตของ XNOR เป็นวิธีการแก้ปัญหาหลาม เอาท์พุทTrueสำหรับตัวเลขสามเหลี่ยมFalseมิฉะนั้น


7

JavaScript (ES6), 30 27 ไบต์

บันทึก 2 ไบต์ขอบคุณ kamoroso94

f=(n,k)=>n>0?f(n+~k,-~k):!n

กรณีทดสอบ

รุ่นที่ไม่ใช่แบบเรียกซ้ำ (ES7), 19 ไบต์

ท่าเรือคำตอบ Adnan ของ

x=>(8*x+1)**.5%1==0

เพียง แต่เห็นในขณะนี้ที่คุณแก้ไขการแก้ปัญหา 19 ไบต์ลงในคำตอบของคุณไม่กี่นาทีก่อนที่ผมโพสต์เหมือง ฉันควรจะลบของฉันหรือไม่ มารยาทที่ยอมรับกันโดยทั่วไปคืออะไร?
Shaggy

1
@Shaggy ฉันไม่คิดว่ามันเป็นปัญหาจริงที่นี่ คำตอบ 'หลัก' ของฉันคือคำตอบที่ซ้ำกัน
Arnauld

ลดลงถึง 28 ไบต์ด้วยf=(n,k=1)=>n>0?f(n-k,k+1):!n?
kamoroso94

1
@ kamoroso94 ขอบคุณ! Updated kและไบต์ที่สามถูกบันทึกไว้โดยเลี่ยงการเริ่มต้นของ
Arnauld

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

6

CJam , 11 ไบต์

ri2*_mQ_)*=

เอาท์พุท1สำหรับรูปสามเหลี่ยม0มิฉะนั้น

ลองออนไลน์!

คำอธิบาย

21พิจารณาการป้อนข้อมูล

ri               e# Input integer.             STACK: 21
  2*             e# Multiply by 2.             STACK: 42
    _            e# Duplicate.                 STACK: 42, 42
     mQ          e# Integer square root.       STACK: 42, 6
       _)        e# Duplicate, increment.      STACK: 42, 6, 7
         *       e# Multiply.                  STACK: 42, 42
          =      e# Equal?                     STACK: 1

6

Brain-Flakขนาด 40 ไบต์

(([{}](((()))<>))<>){<>({}({}({})))}{}{}

ข้าวสาลีตัวช่วยสร้างและฉันมีการต่อสู้กับคำถามนี้ เมื่อเราตัดสินใจที่จะโพสต์โซลูชั่นของเราเราถูกผูกไว้ที่ 42 ไบต์ แต่ฉันพบ 2 ไบต์กอล์ฟของโซลูชั่นของเขา เราตัดสินใจว่าจะนับเป็นตัวแบ่งไทม์เมอร์ (โซลูชันของฉันอยู่ด้านล่าง)

ลองออนไลน์!

คำอธิบาย:

# Set up the stacks like this:  -input
                                     1     -input
                                     1          1
(([{}](((()))<>))<>)                 ^

# Output 1 for triangular and 0 for non-triangular 
{<>({}({}({})))}{}{}

สำหรับคำอธิบายทั้งหมดโปรดดูคำตอบข้าวสาลีของพ่อมด


Brain-Flakขนาด 42 ไบต์

(([({})])<>){(({}())<>{}({})){((<>))}{}{}}

เอาท์พุท0\n(ขึ้นบรรทัดใหม่ตามตัวอักษร) เพื่อความจริงและสตริงว่างสำหรับเท็จ

แนวคิดคือการลบ 1 จากนั้น 2 จากนั้น 3 ไปจนถึงทางเข้า หากคุณกด 0 คุณจะรู้ว่านี่เป็นตัวเลขสามเหลี่ยมดังนั้นคุณสามารถหยุดตรงนั้นได้

ลองออนไลน์! (ความจริง)
ลองออนไลน์! (falsy)

# Push -input on both stacks. One is a counter and the other is a running total
(([({})])<>)

# Count up from -input to 0
{
  # Push the new total which is: (counter += 1) + total (popped) + input (not popped)
  # This effectively adds 1, then 2, then 3 and so on to the running total
  (({}())<>{}({}))
  # If not 0
  {
    # Push to 0s and switch stacks to "protect" the other values
    ((<>))
  # End if
  }
  # Pop the two 0s, or empty the stack if we hit 0
  {}{}
# End loop
}

นี่เป็นวิธีแก้ปัญหา 46 ไบต์ที่ฉันคิดว่าน่าสนใจ

{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}

เอาท์พุท0\n(ขึ้นบรรทัดใหม่ตามตัวอักษร) สำหรับความจริงแล้วสตริงว่างสำหรับเท็จ

แนวคิดคือการนับถอยหลังจากการป้อนข้อมูลด้วยหมายเลขที่ต่อเนื่องกัน 1 ครั้ง input - (1) - (1,1) - (1,1,1)เช่น ทุกครั้งที่เราลบถ้าเรายังไม่อยู่ที่ 0 เราจะทิ้งมูลค่าไว้ที่กอง ด้วยวิธีนี้ถ้าเราอยู่ที่ 0 และยังคงลบเมื่อเราป๊อปเราจะลบค่าสุดท้ายในสแต็ก ถ้าอินพุตเป็นตัวเลขสามเหลี่ยมเราจะสิ้นสุดที่ 0 และจะไม่ปรากฏ 0

ลองออนไลน์! ความจริง
ลองออนไลน์! falsy

# Implicit input (call it I)

# Until we reach 0, or the stack is empty
{
  # Add 1 to the other stack and push it twice. This is our counter.
  <>(({}()))
  # While counter != 0
  {
    # counter -= 1
    ({}[()]
    # if I != 0 
    <>{
      # I -= 1, and push 0 to escape the if
      (<({}[()])>)
    # End if
    }
    # Pop from the stack with I. This is either the 0 from the if, or I
    {}
    # Get ready for next loop End while
    <>)
  # End While
  }
  # Pop the counter that we were subtracting from
  {}<>
# End Until we reach 0, or the stack is empty.
}

6

เยลลี่ 5 ไบต์

×8‘Ʋ

ลองออนไลน์!

พื้นหลัง

ให้nเป็นอินพุต ถ้าnเป็นk THสามเหลี่ยมจำนวนที่เรามี

n=k(k+1)2k2+k-2n=0k=12(-1±1+8n),

ซึ่งหมายความว่าจะมีวิธีแก้ปัญหาตามธรรมชาติหาก1 + 8nเป็นสี่เหลี่ยมจัตุรัสที่แปลกและสมบูรณ์แบบ เห็นได้ชัดว่าไม่จำเป็นต้องตรวจสอบพาริตี้1 + 8n

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

×8‘Ʋ  Main link. Argument: n

×8     Yield 8n.
  ‘    Increment, yielding 8n + 1.
   Ʋ  Test if the result is a perfect square.

5

PowerShell , 31 30 ไบต์

"$args"-in(1..1e6|%{($s+=$_)})

ลองออนไลน์!

วิธีการบังคับดีและช้าเดียรัจฉาน จัดเรียงอาร์เรย์ของผลรวมทั้งหมดของ 1 ถึง 10 6และดูว่ามีการโต้แย้งไหม


5

Brain-Flakขนาด 42 ไบต์

(([{}](<((())<>)>))<>){<>({}({}({})))}{}{}

ลองออนไลน์!

คำอธิบาย

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

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

แล้วเราจะตั้งค่าสแต็คอย่างไรเพื่อให้การดำเนินการเดียวกันลบตัวเลขที่ต่อเนื่องกันในหนึ่งและลบหนึ่งในอีกอัน? ในแต่ละสแต็คเรามีอินพุตอยู่ด้านบนเพื่อให้สามารถตรวจสอบได้ด้านล่างว่าเรามีความแตกต่างและด้านล่างที่เรามีความแตกต่าง ทุกครั้งที่เราเรียกใช้เราเพิ่ม "ความแตกต่างของความแตกต่าง" ใน "ความแตกต่าง" ปกติและลบสิ่งนั้นออกจากอินพุต สำหรับสแต็กที่ตรวจสอบความเป็นรูปสามเหลี่ยมเราตั้งค่าความแตกต่างเป็นสองเท่าเพื่อ1ให้เราได้จำนวนเต็มที่ต่อเนื่องทุกครั้งที่เราเรียกใช้สำหรับสแต็กอื่นที่เราตั้งค่าไว้เพื่อไม่0ให้เราเปลี่ยนความแตกต่าง วิธีตั้งค่าสแต็กที่จุดเริ่มต้นโดยที่nอินพุต:

-n  -n
 0   1
 1   0

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


รหัสข้อเขียน

(([{}](<((())<>)>))<>) Set up the stack
{                      While
 <>                    Switch stacks
 ({}({}({})))          Add bottom to second to bottom, add second to bottom to top
}                      End while
{}{}                   Pop the top two values

นี่เป็นวิธีแก้ปัญหา 50 ไบต์ที่ฉันชอบเช่นกัน

{(({}[()]))}(([[]])<>){({}{}())<>}({}{()<><{}>}{})

ลองออนไลน์!


5

Cubix , 23 24 25ไบต์

I1Wq/)s.;0..s;p-?\.+O@u

0 สำหรับความจริงและไม่มีอะไร0สำหรับความเท็จ เพิ่มกองกำลังโดยการเพิ่มตัวนับเพิ่มไปยังผลรวมสะสมและเปรียบเทียบกับอินพุต ทีนี้ลองและใส่มันลงในลูกบาศก์ 2x2x2 ทำไม่ได้!

    I 1
    W q
/ ) s . ; 0 . .
s ; p - ? \ . +
    O @
    u .

ลองออนไลน์!

  • / สะท้อนกับใบหน้า
  • I10\ รับอินพุตจำนวนเต็มกด 1 (ตัวนับ) กด 0 (รวม) และสะท้อนกลับ
  • +s;p-ร่างกายห่วง เพิ่มผลรวมและตัวนับวางผลรวมก่อนหน้าเพิ่มอินพุตและลบ
  • ? ทดสอบผลลัพธ์ของการลบ
    • สำหรับผลลัพธ์ 0 ที่ดำเนินการตรงไปข้างหน้า\.uO@สะท้อนไปที่ใบหน้าด้านล่าง no-op, U-turn, output และ halt
    • เพื่อผลลัพธ์ที่ดีให้หันไปทางขวาล่างของใบหน้าแล้ว@หยุด
    • สำหรับผลลัพธ์ด้าน;qWs)/suลบการลบการลบแบบหล่นซ้ายให้ใส่อินพุตไปด้านล่างเลื่อนไปทางซ้ายสลับตัวนับและผลรวมตัวนับเพิ่มตัวสะท้อนกลับผลรวมและตัวนับกลับรถไปที่ตัวหลักของวง

ดังนั้นยั่วเย้าปิด ... ไบต์สุดท้ายที่จะใช้ความพยายามและความฉลาดมาก
ETHproductions

ใช่คิดว่าฉันมีมัน แต่จะเข้าใจยาก
MickyT

1
@ETHproductions พบ byte
MickyT

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

@WheatWizard ขอบคุณสำหรับการแก้ไขที่ไม่ดีในส่วนของฉัน
MickyT

4

05AB1E , 7 6 ไบต์

แก้ไข : ขอบคุณ @Dennis: บันทึกไบต์เนื่องจากฉันลืมเกี่ยวกับตัวดำเนินการที่เพิ่มขึ้น

8*>t.ï

ลองออนไลน์!

nเป็นสามเหลี่ยมถ้าsqrt(8n + 1)เป็นจำนวนเต็ม

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

8* # multiply implicit input by 8
  > # add one
   t # sqrt
    .ï # is integer

อาจยังไม่พร้อมใช้งานในเวลา แต่t.ïอาจเป็นŲวันเหล่านี้ซึ่งเป็น builtin เพื่อตรวจสอบว่าตัวเลขเป็นสี่เหลี่ยม
Kevin Cruijssen

4

Perl 6 , 17 ไบต์

{$_∈[\+] 1..$_}

การตรวจสอบเพียงแค่ว่า$_ใส่ฟังก์ชั่นที่มีค่าเท่ากับใด ๆ (1, 1+2, ..., 1+2+...+$_)ขององค์ประกอบของการลดลงนอกจากสามเหลี่ยม


4

อลิซ , 38 22 ไบต์

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณ Martin และ Leo

/ i \ 2 * .2RE.h * -n / o @

มีการขึ้นบรรทัดใหม่ เอาท์พุท1สำหรับรูปสามเหลี่ยม0มิฉะนั้น

ลองออนไลน์!

คำอธิบาย

วิธีนี้ใช้วิธีการเดียวกับคำตอบ CJamของฉันเท่านั้นที่ไม่แน่นอน ในรูปแบบเชิงเส้นโปรแกรมจะกลายเป็น

i2*.2RE.h*-no@

โดยที่iและoอยู่ในโหมดปกติ

พิจารณาการป้อนข้อมูล21เป็นตัวอย่าง

i         Input integer                       STACK: 21
2*        Multiply by 2                       STACK: 42
.         Duplicate                           STACK: 42, 42
2RE       Integer square root                 STACK: 42, 6
.         Duplicate                           STACK: 42, 6, 6
h         Increment                           STACK: 42, 6, 7
*         Multiply                            STACK: 42, 42
-         Subtract                            STACK: 0
n         Logical negation                    STACK: 1
o         Output integer                      STACK:
@         End program

อลิซคำตอบแรกของฉัน
Luis Mendo

1
ฉันมีความรู้สึกว่าสิ่งนี้อาจลดลงครึ่งหนึ่งด้วยหนึ่งในโครงสร้างการควบคุมแฟนซีของ Martin ...
ETHproductions

ดังนั้นฉัน ... :-)
Luis Mendo

อลิซกอล์ฟคนแรกของฉัน: รหัสเดียวกัน, 23 ไบต์
Nitrodon

ขึ้นรูปแบบ "มาตรฐาน" สำหรับชนิดของโปรแกรมนี้จะเป็นนี้ ที่กล่าวว่าคุณจะได้รับการกำจัดของ 1 ในกองและก็เอาท์พุทปฏิเสธตรรกะของการลบ (เช่น...h*-no@)
ลีโอ

4

Japt , 10 7 ไบต์

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

*8Ä ¬v1

ลองออนไลน์!

คำอธิบาย:

*8Ä ¬v1
    ¬    // Square root of:
*8       //   Input * 8
  Ä      //   +1
     v1  // Return 1 if divisible by 1; Else, return 0

õ å+ øU

คำอธิบาย:

õ å+ øU
õ           // Create a range from [1...Input]
  å+        // Cumulative reduce by addition
     øU     // Does it contain the input?

ลองออนไลน์!


คำถามจะถามหา ouputs ที่ต่างกันสองค่าคงที่
xnor

*8Ä ¬u1 cสำหรับ 9B (เอาต์พุต 0 ถ้าอินพุตเป็นรูปสามเหลี่ยม 1 มิฉะนั้น)
ลูกา

@ ลุคคุณสามารถเปลี่ยนu1 cเป็นv1ฉันเชื่อ (เปลี่ยนผลลัพธ์)
ETHproductions

7 ไบต์ ดี! อย่างใดพลาดนี้ในขณะที่โพสต์ของฉันเองโซลูชั่นที่คล้ายกันอาจล่าช้าล่าสุด แจ้งให้เราทราบหากคุณต้องการให้ฉันลบ
Shaggy

4

R , 23 19 ไบต์

วิธีการที่คล้ายกันเป็นคำตอบอื่น ๆ ตรวจสอบเพื่อดูว่า8x+1เป็นตารางที่สมบูรณ์แบบ
-4 ไบต์ขอบคุณ Giuseppe และ MickyT

!(8*scan()+1)^.5%%1

ลองออนไลน์!


2
คุณสามารถใช้!แทน==0
Giuseppe

นี่เป็นสิ่งที่ดีเป็นพิเศษเนื่องจากมันเป็นเวกเตอร์ด้วย!
Giuseppe

1
ฉันคิดว่าคุณสามารถกำจัดวงเล็บภายนอกได้เช่นกัน!(8*scan()+1)^.5%%1
MickyT

3

MATL , 5 ไบต์

t:Ysm

ลองออนไลน์!

คำอธิบาย:

t       % Duplicate input
 :      % Range(1, input)
  Ys    % Cumulative sum. This will push the first *n* triangular numbers
    m   % ismember. Pushes true if the input is contained within the array we just pushed

t:Ys=aฉันกำลังจะไปโพสต์ ลืมเกี่ยวกับm:-)
Luis Mendo

1
@ LuisMendo ฉันไม่รู้mจนกระทั่งฉันเห็นคำตอบนี้ ตลกว่าคำตอบทั้งสองนั้นเกือบจะเหมือนกัน: D
DJMcMayhem

3

แบตช์ 72 ไบต์

@set/aj=i=0
:l
@if %1% gtr %j% set/aj+=i+=1&goto l
@if %1==%j% echo 1

แสดงผล 1 เมื่อสำเร็จไม่มีอะไรล้มเหลว ใช้งานได้เป็นศูนย์เช่นกันแม้ว่าจะไม่ได้ถามด้วยเหตุผลบางประการ


3

JavaScript (ES7), 19 18 ไบต์

จากคำตอบของฉันกับคำถามที่เกี่ยวข้อง

เอาท์พุทfalseสำหรับตัวเลขสามเหลี่ยมหรือที่trueไม่ใช่สามเหลี่ยมตามที่อนุญาตโดย OP

n=>(8*n+1)**.5%1>0

ลองมัน

f=
n=>(8*n+1)**.5%1>0
oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยn=>(8*n+1)**.5%1>0(ซึ่งจะย้อนกลับผลลัพธ์)
ETHproductions

@ETHproductions: ตกลงตราบใดที่คุณอนุญาต ได้รับอนุญาตตามปกติหรือไม่?
Shaggy

1
มันมีคุณสมบัติเป็น "เอาต์พุตสองค่าคงที่และแตกต่าง" ดังนั้นใช่ ความท้าทายปัญหาการตัดสินใจอื่น ๆ อาจต้องใช้ความจริง / เท็จ
ETHproductions


3

Mathematica ขนาด 28 ไบต์

!Accumulate@Range@#~FreeQ~#&

ผมขอแนะนำให้เปลี่ยนจาก7! #ก่อนอื่นมันสั้นกว่า ที่สำคัญกว่าโซลูชันปัจจุบันไม่ถูกต้องเนื่องจากมีการ จำกัด ขนาดของอินพุตที่ทำงาน
Greg Martin

1
OP กล่าวว่า: "คุณอาจคิดว่าอินพุตเป็นจำนวนเต็มบวกต่ำกว่า 10 ^ 6" แต่ฉันชอบความคิดของคุณและฉันจะรับมันถึงแม้ว่าของฉันจะให้ผลลัพธ์ที่ถูกต้องสำหรับทุกกรณีโดยใช้รายการ 5040 องค์ประกอบ แต่เป็นกรณีที่แย่ที่สุด ต้องการรายการองค์ประกอบ 999999 ขอขอบคุณสำหรับเคล็ดลับ!
J42161217

1
โอ๊ะโอขออภัยไม่เห็นความคิดเห็นของ OP! ใช่มีบางคน "อ้อน" แรงจูงใจในการเล่นกอล์ฟรหัส: เงินฝากออมทรัพย์ที่ 1 ไบต์มีความสำคัญมากขึ้นในการเป็นคำถามรหัสกอล์ฟกว่าทุกอย่างมีประสิทธิภาพในโลก :)
เกร็กมาร์ติน


3

Excel, 31 22 ไบต์

บันทึกไปแล้ว 9 ไบต์ด้วย Octopus

เอาต์พุตTRUEสำหรับตัวเลขสามเหลี่ยม FALSEอื่น ตรวจสอบว่า8*n+1เป็นตารางที่สมบูรณ์แบบ

=MOD(SQRT(8*B1+1),1)=0

1
=MOD(SQRT(8*A1+1),1)=0บันทึกไม่กี่ไบต์
Octopus

2

Brachylogขนาด 5 ไบต์

≥ℕ⟦+?

ลองออนไลน์!

คำอธิบาย

≥ℕ⟦+?
≥ℕ     There is a number from 0 to {the input} inclusive
  ⟦    such that the range from 0 to that number
   +   has a sum
    ?  that equals the input


2

Python - 52 ไบต์

หมายเหตุ: ฉันรู้ว่าคำตอบของงูหลามอีกสองคำนั้นสั้นกว่ามาก แต่นี่เป็นวิธีเก่าแก่ของอัลกอริธึมมากกว่า

n=input();i=s=0
while s<n:s=(i*i+i)/2;i+=1
print s>n

2

APL (Dyalog) 6 ไบต์

⊢∊+\∘

ลองออนไลน์!

คำอธิบาย

⊢∊+\∘
                       Creates a range from 1 to the right_argument
  +\                    Cumulative sum of this range; 1 1+2 1+2+3 .. 1+2+..+n. These are the triangular numbers
⊢∊                      Does the right argument belong to this list of integers in this cumulative sum

เอาต์พุต0สำหรับ false และ1true


2

TI-BASIC, 10 7 ไบต์

-3 ขอบคุณ@lirtosiast

:not(fPart(√(8Ans+1

Xใช้เวลาในการป้อนข้อมูล ตรวจสอบว่า√(8X+1)เป็นจำนวนเต็มหรือไม่


ทำไมไม่not(fPart(√(8Ans+1?
lirtosiast

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