ค้นหาการจัดกลุ่มตัวเลขที่เกี่ยวข้อง


14

เมื่อเร็ว ๆ 25,121นี้ชื่อเสียงของฉันคือ ฉันสังเกตเห็นว่าการจัดกลุ่มตัวเลขแต่ละหลัก (เช่นตัวเลขคั่นด้วยเครื่องหมายจุลภาค) เป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ

ความท้าทายของคุณคือให้เป็นจำนวนเต็มที่ไม่ใช่ลบNและฟังก์ชันกล่องดำ แบบบูล unary f : Z *Bให้ค่าจริงถ้าแต่ละค่าfนำไปใช้กับการจัดกลุ่มหลักของNคือความจริงและเท็จเป็นอย่างอื่น

หนึ่งสามารถค้นหาการจัดกลุ่มหลักโดยแยกหมายเลขออกเป็นกลุ่ม 3 โดยเริ่มจากด้านขวา กลุ่มซ้ายสุดอาจมี 1, 2 หรือ 3 หลัก ตัวอย่างบางส่วน:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)

กฎเพิ่มเติม

  • ฟังก์ชั่นนี้สามารถแมปกับบูลีน (เช่นtrueและfalse), 1s และ0s หรือค่าความจริง / เท็จ โปรดระบุคำตอบของคุณในรูปแบบใด
  • คุณอาจใช้จำนวนเต็มเป็นอินพุตหรือสตริงจำนวนเต็ม (เช่นสตริงที่ประกอบด้วยตัวเลข)
  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น
  • เมื่อส่งกลุ่มดิจิตอลไปยังฟังก์ชันfคุณควรตัดเลขศูนย์นำที่ไม่จำเป็นทั้งหมด ตัวอย่างเช่นfเมื่อใช้กับN = 123,000 ควรถูกดำเนินการเป็นf (123) และf (0)

กรณีทดสอบ

สัญกรณ์ฟังก์ชั่นคือn -> f(n)เช่นn -> n == 0. ตัวดำเนินการทั้งหมดจะใช้เลขคณิตเลขจำนวนเต็ม (เช่นsqrt(3) == 1)

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n 
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true

หากเราไม่สามารถรับฟังก์ชั่นเป็นอาร์กิวเมนต์เราได้รับอนุญาตให้สมมติว่าฟังก์ชั่นนั้นถูกกำหนดให้เป็นตัวแปรและเราอ้างอิงมันในโปรแกรมของเราหรือไม่?
caird coinheringaahing

@cairdcoinheringaahing โปรดอ่านข้อมูลอ้างอิงสำหรับฟังก์ชั่นกล่องดำโดยเฉพาะการอ้างอิงในตอนท้ายของโพสต์นั้น เพื่อสรุปใช่คุณสามารถทำได้แม้ว่าภาษาของคุณสามารถทำหน้าที่เป็นอาร์กิวเมนต์ (afaict)
Conor O'Brien

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

1
@ ConorO'Brien ในกรณีนั้นคุณควรเพิ่ม ( n -> n > 0นำไปใช้กับ0) กรณีทดสอบเพราะคำตอบส่วนใหญ่ล้มเหลว
Asone Tuhid

1
@EriktheOutgolfer [0]พวกเขาเป็น
Conor O'Brien

คำตอบ:


4

เยลลี่ 5 ไบต์

bȷÇ€Ạ

ลองออนไลน์!

อาร์กิวเมนต์บรรทัดคำสั่งคือตัวเลข บรรทัดด้านบนบรรทัดที่ฟังก์ชันนี้อยู่นั้นเป็นสายหลักของส่วนที่เหลือของโปรแกรมกล่าวคือรหัสที่ได้รับเรียกสำหรับแต่ละกลุ่ม ระวังอย่าอ้างอิงถึงสายที่bȷÇ€Ạอยู่ใน! ตัวอย่างที่ใช้ในที่นี้คือกรณีทดสอบครั้งที่ 5



@AsoneTuhid มันไม่ใช่; จำนวนนั้นคือ0และรายชื่อกลุ่มหลัก[0]จึงถูกแมปกับแต่ละองค์ประกอบ (รายการเดียว0ที่นี่) เปลี่ยนรายการเป็น[1]และเนื่องจากองค์ประกอบทั้งหมดของรายการนี้เป็นความจริง1จะถูกส่งคืน โปรดทราบว่าหากฉันมีรายชื่อกลุ่มหลัก[]แทนที่จะเป็นผลลัพธ์จะไม่เปลี่ยนแปลงเนื่องจากองค์ประกอบทั้งหมดของความ[]เป็นจริง (ความจริงว่างเปล่า) อย่างไรก็ตามผลลัพธ์อาจแตกต่างกันไปสำหรับโปรแกรมที่แตกต่างกันและกฎยังไม่ชัดเจนในเรื่องนี้ ( OP ถาม )
Erik the Outgolfer

ขออภัยฉันเพิ่งเข้าใจเยลลี่ ทางออกที่ดี
Asone Tuhid

7

Brachylogขนาด 8 ไบต์

ḃ₁₀₀₀↰₁ᵐ

ลองออนไลน์!

ฟังก์ชั่นแบล็กบ็อกซ์ดำเนินการในบรรทัดที่สอง (หรือ "ส่วนท้าย" บน TIO) และอ่านจำนวนเต็มจาก STDIN พิมพ์true.หรือfalse.ตาม

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
     ↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
           result of the map, but the predicate must succeed for each digit,
           otherwise the entire map fails.

5

APL (Dyalog) , 16 13 ไบต์

บันทึก 3 ไบต์ด้วย @ Adám

∧/⎕¨1e3⊥⍣¯1⊢⎕

ลองออนไลน์!

อย่างไร?

1e3⊥⍣¯1⊢⎕ - ใส่ตัวเลขและเข้ารหัสในฐาน 1,000

⎕¨ - ป้อนฟังก์ชั่นและนำไปใช้กับแต่ละ

∧/ - ลดด้วยตรรกะและ


บันทึก 3 ไบต์ด้วยการไปอย่างชัดเจน: ลองออนไลน์!
อดัม

@ Adámขอบคุณ! ฉันชอบอัลฟ่า - อัลฟาแม้ว่า ...
Uriel

แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่านี่เป็นความล้มเหลว
Asone Tuhid



4

C (gcc) , 66 58 48 ไบต์

-10 ไบต์ขอบคุณ @Neil!

t=1000;g(f,i)int f();{i=f(i%t)&(i<t||g(f,i/t));}

ลองออนไลน์!


45 ไบต์ g(f,i)int f();{i=!i||f(i%1000)&&g(f,i/1000);}
Neil


การแก้ไขที่ดีที่สุดที่ฉันสามารถทำได้ราคา 3 ไบต์: ลองออนไลน์!
Neil


3

JavaScript (ES6), 40 36 ไบต์

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))

รับฟังก์ชั่นและค่าด้วยการปิดและคืนค่า 0 หรือ 1 แก้ไข: บันทึก 4 ไบต์ด้วย @Shaggy


1000-> 1e3เพื่อบันทึกสองสามไบต์ และคุณสามารถแทนที่&&ด้วย&ไบต์อื่นได้หรือไม่
Shaggy

@Shaggy ใช่ฉันคิดว่ามันปลอดภัยพอ กันไปสำหรับคำตอบของ betseg?
Neil

ล้มเหลวสำหรับfunction_name(n=>n>0)(0)(ส่งคืนtrue)
Asone Tuhid

@AsoneTuhid ขอบคุณแก้ไขแล้ว
Neil

2

Pyth , 9 ไบต์

.AyMjQ^T3

ลองออนไลน์! (ใช้กรณีทดสอบที่สาม)

yถือว่าการทำงานของกล่องดำเป็นชื่อ คุณสามารถประกาศฟังก์ชั่นดังกล่าวโดยใช้L(อาร์กิวเมนต์b:) ดังที่แสดงใน TIO ฉันจะใช้กรณีทดสอบทั้งหมดในภายหลังถ้าฉันมีเวลา


2

Stax , 8 ไบต์

Vk|Eym|A

โปรแกรม Stax ไม่มีการเรียกใช้ฟังก์ชั่นหรือข้อโต้แย้งดังนั้นเราจึงจัดเก็บบล็อกในการYลงทะเบียนที่ใช้และสร้างค่าเดียว สิ่งนี้สามารถทำได้ก่อนรหัสโปรแกรม

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
    ym      map "digits" to array using y as mapping function
      |A    all elements are truthy?

นี่คือตัวอย่างการใช้ฟังก์ชั่นสแควร์ที่สมบูรณ์แบบ


2

ทำความสะอาด 54 ไบต์

import StdEnv
$n=if(n<1)True($(n/1000))&&f(n rem 1000)

ลองออนไลน์!

กำหนดฟังก์ชั่น$ :: Int -> Boolโดยคาดว่าจะมีฟังก์ชั่นf :: Int -> Boolที่จะกำหนดที่อื่น



@AsoneTuhid แก้ไขแล้ว
Marurous



1

05AB1E , 8 ไบต์

₄вεI.V}P

ลองออนไลน์!

คำอธิบาย

₄в         # convert first input to base-1000
  ε   }    # apply to each element
   I.V     # execute second input as code
       P   # product of the resulting list

รับจำนวนเป็นบรรทัดแรกของอินพุตและฟังก์ชันเป็นวินาที
เอาต์พุต1สำหรับความจริงและ0สำหรับความเท็จ


สิ่งนี้ไม่ได้รันรหัสในแต่ละองค์ประกอบ แต่อยู่ในรายการทั้งหมด
Erik the Outgolfer

@EriktheOutgolfer: ด้วย vectorization อัตโนมัติของ 05AB1E ส่วนใหญ่จะเป็น ฉันเพิ่งรู้ว่ามันจะไม่ทำงานQและÊแม้ว่า ฉันจะเปลี่ยนกลับเป็นเวอร์ชัน 8 ไบต์
Emigna

ถึงกระนั้นมันก็ไม่ได้เป็น.Vvectorizes มันไม่ได้ใช้รายการเป็นอาร์กิวเมนต์ตัวเองเพื่อเริ่มต้นด้วย
Erik the Outgolfer

@EriktheOutgolfer: ฉันไม่เคยบอกว่า.Vvectorizes Èในตัวอย่างในการเชื่อมโยงของฉันมันเป็น
Emigna

ที่จริงQและÊจะทำงานร่วมกับ vectorization แตกต่างจากที่ผมระบุไว้ก่อนหน้า แต่ใช้ vectorization อัตโนมัติจะทำให้คำสั่งเหล่านี้ map εในรายการทั้งที่รู้สึกนอกจิตวิญญาณของความท้าทายดังนั้นเราจึงจำเป็นที่จะต้อง
Emigna

1

Excel VBA ขนาด 79 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อ VBE ทันทีหน้าต่างที่ใช้เวลาการป้อนข้อมูลnเป็นชนิดจำนวนเต็มจากช่วง[A1]และชื่อของฟังก์ชั่นที่กำหนดไว้สาธารณะ VBA [B1]จากช่วง

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t

ตัวอย่างการใช้งาน

ในโมดูลสาธารณะฟังก์ชันอินพุตในกรณีนี้f()ถูกกำหนดไว้

Public Function f(ByVal n As Integer) As Boolean
    Let f = (n Mod 2 = 0)
End Function

ตัวแปรอินพุตถูกตั้งค่า

[A1]=2902414    ''  Input Integer
[B1]="f"        ''  input function

ฟังก์ชั่นหน้าต่างทันทีเรียกว่า

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t
 1              ''  Function output (truthy)

1

Ruby , 37 ไบต์

g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}

ลองออนไลน์!

แลมบ์ดาแบบเรียกซ้ำ, ใช้ฟังก์ชันและเลขจำนวนเต็มและส่งคืนบูลีน

36 ไบต์ (เฉพาะค่าบวก n)

g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}

รุ่นนี้กลับมา1เพื่อความจริงfalseสำหรับเท็จ น่าเสียดายที่มันสามารถล้มเหลวเมื่อn = 0

ลองออนไลน์!


ฉันคิดว่าคุณต้องนับg=ถ้ามันซ้ำ
Asone Tuhid

@AsoneTuhid โอ้นั่นสมเหตุสมผลแล้ว ฉันจะเพิ่มเข้าไป
benj2240

ลองนี้ (-1 ไบต์) มันจะกลับมา1เป็นค่าความจริง
Asone Tuhid

นั่นทำให้สมองของฉันเหี่ยวย่นเล็กน้อย ... ฉันต้องคนจรจัดไปรอบ ๆ เพื่อโน้มน้าวตัวเองว่ามันใช้ได้ในทุกกรณี ขอบคุณ!
benj2240

ฉันผิดรุ่นนี้ใช้ไม่ได้g[->n{n>0},0](ส่งคืนtrue) มันจะล้มเหลวหากอินพุตเป็น0แต่คำถามบอกว่า "ไม่เป็นลบ" ดังนั้นคุณควรกลับไปที่ 37 ขออภัย
Asone Tuhid

1

Appleseed , 51 ไบต์

(lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))

ฟังก์ชั่นแลมบ์ดานิรนามที่รับตัวเลขและฟังก์ชั่นและส่งกลับค่าบูลีน

ลองออนไลน์!

(lambda (n f)         ; Function with parameters n and f
 (all                 ; Return true if all elements of this list are truthy:
  (map f              ; Map the function f to each element of
   (or                ; This list if it is nonempty:
    (to-base 1000 n)  ; Convert n to a list of "digits" in base 1000
    (q (0))           ; Or if that list is empty (when n=0), then use the list (0) instead
   ))))

1

เพิ่ม ++ , 15 ไบต์

L,1000$bbbUª{f}

ลองออนไลน์!

ต้องการฟังก์ชั่น fที่จะประกาศในส่วนหัวของ TIO

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

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
		; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
		; Example argument: 		[25121]
	1000$bb	; Convert to base 1000	STACK = [[25 121]]
	bUª{f}	; Is 'f' true for all?	STACK = [1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.