ตัวเลขหารด้วยผลรวมและผลคูณของตัวเลข


24

Xใช้เป็นจำนวนเต็มบวก จำนวนนี้เป็นส่วนหนึ่งของลำดับที่เรามีความสนใจในถ้าผลรวมของตัวเลขทั้งหมดของXเป็นของตัวหารXและถ้าสินค้าของตัวเลขทั้งหมดของเป็นตัวหารของXX

ตัวอย่าง135เช่นเป็นจำนวนเพราะ1 + 3 + 5 = 9สิ่งที่หาร135 = 9 * 15และ1 * 3 * 5 = 15หาร135ด้วย

นี่คือลำดับA038186ใน OEIS

งานของคุณ:รับจำนวนเต็มN, ส่งออกNจำนวนเต็มบวกที่ th ด้วยคุณสมบัติดังกล่าว

อินพุตและเอาต์พุต

  • ตัวเลขอาจเป็น0-exexed หรือ1-exexed โปรดระบุคำตอบที่คุณใช้

  • อินพุตอาจถูกนำมาใช้STDINเป็นอาร์กิวเมนต์ฟังก์ชันหรือสิ่งอื่นที่คล้ายคลึงกัน

  • เอาต์พุตอาจถูกพิมพ์ไปยังSTDOUTส่งคืนจากฟังก์ชันหรือสิ่งอื่นที่คล้ายคลึงกัน

กรณีทดสอบ

กรณีทดสอบด้านล่างเป็น1-exexed

Input        Output

1            1
5            5
10           12
20           312
42           6912
50           11313

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


มันจะโอเคที่จะพิมพ์ตัวเลขแต่ละตัวในขณะที่คุณคำนวณมันไปทาง n = infinity
บลู

@BlueEyedBeast ไม่คุณต้องป้อนข้อมูลและส่งกลับหมายเลขที่เกี่ยวข้อง
ทำให้เสียชีวิต

เมื่อตรวจสอบ 10 ผลิตภัณฑ์ของเลข 0 หรือ 1 คืออะไร?
จอร์จ

2
@george 0ผลิตภัณฑ์ของตนคือ
ทำให้เสียชีวิต

ฉันสามารถ จำกัด ช่วงของอินพุตโดยพลการได้หรือไม่ถ้าขีด จำกัด สูงสุดของช่วงนั้นไม่สามารถคำนวณได้ก่อนที่ความร้อนจากเอกภพยังคงอยู่?
แมว

คำตอบ:


11

05AB1E , 13 12 ไบต์

ขอบคุณEmigna ที่บันทึกไบต์!

µNNSONSP‚ÖP½

คำอธิบาย:

µ          ½   # Get the nth number for which the following holds:
  NSO          #   The sum of digits of the current number
     NSP       #   And the products of digits of the current number
 N      ‚ÖP    #   Divides the current number
               # If the nth number has been reached, quit and implicitly print N

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


µNNSONSP‚ÖP½ทำงานได้ดีหรือไม่
Emigna

@Emigna Nice! ขอบคุณ :)
Adnan

5

Pyke, 14 ไบต์ (ไม่มีการแข่งขัน) (ทำดัชนี 1 รายการ)

~1IY'sB]im%X)@

ลองที่นี่!

พระเจ้าของฉันมีคุณสมบัติใหม่มากมาย

~1             -   infinite list of natural numbers
  IY'sB]im%X)  -  filter(^, V) - remove if any truthiness
   Y           -      digits(i)
    'sB]       -     [sum(^), product(^)]
        im%    -    map(^, %i)
           X   -   splat(^)
             @ - ^[input]

ซึ่งไม่ใช่การแข่งขัน

  • แก้ไขข้อบกพร่องในIที่ที่มันจะตรวจสอบว่ารายการแรกในสแต็คเป็นความจริง
  • digits - ส่งคืนรายการตัวเลขในจำนวน
  • @ ใช้เพื่อรับรายการที่ n ของรายการที่ไม่มีที่สิ้นสุด

ซึ่งถูกใช้เป็นครั้งแรก:

  • ทั้งหมดข้างต้น
  • รายการไม่มีที่สิ้นสุด

ลบ 2 ไบต์สุดท้ายเพื่อรับหมายเลขเหล่านี้ทั้งหมด


4

C #, 118 ไบต์

n=>{int x=0,c=0;for(;;){int s=0,p=1,i=++x;while(i>0){s+=i%10;p*=i%10;i/=10;}if((c+=p>0&&x%s+x%p<1?1:0)==n)return x;}};

โปรแกรมเต็มรูปแบบพร้อมฟังก์ชั่น ungolfed และกรณีทดสอบ:

using System;

public class Program
{
    public static void Main()
    {
        // x - output number
        // c - counter
        // s - sum
        // p - product
        // i - iterator
        Func<int,int>f= n=>
        {
            int x=0, c=0;
            for ( ; ; )
            {
                int s=0, p=1, i=++x;
                while (i > 0)
                {
                    s += i%10;
                    p *= i%10;
                    i /= 10;
                }
                if ( (c += p> 0&& x%s+x%p<1 ? 1 : 0) == n)
                    return x;
            }
        };

        // tests:
        Console.WriteLine(f(1));  //1
        Console.WriteLine(f(5));  //5
        Console.WriteLine(f(10)); //12
        Console.WriteLine(f(20)); //312
        Console.WriteLine(f(42)); //6912
        Console.WriteLine(f(50)); //11313
    }
}

1
for(int x=0,c=0;;)ช่วยให้คุณ 1 ไบต์
raznagul

4

เยลลี่ขนาด 13 ไบต์

DµP;SðḍȦ
1Ç#Ṫ

ตาม 1
TryItOnline!

อย่างไร?

DµP;SðḍȦ - Link 1, test a number
D        - convert to a decimal list
 µ       - monadic chain separation
   ;     - concatenate the
  P      -     product, and the
    S    -     sum
     ð   - dyadic chain separation
      ḍ  - divides n?
       Ȧ - all (i.e. both)

1Ç#Ṫ - Main link, get nth entry, 1-based: n
1 #  - find the first n matches starting at 1 of
 Ç   - the last link (1) as a monad
   Ṫ - tail (the ultimate result)

4

Perl 6 , 44 ไบต์ (จัดทำดัชนี 0)

{grep({$_%%(.comb.sum&[*] .comb)},1..*)[$_]}

คำอธิบาย:

{                                          }  # A function, with an argument n (`$_`)
 grep(                           ,1..*)       # Filter the infinite list
      {$_                       }             # Check that the function's argument
         %%(                   )              # is divisible by
                     &                        # both:
            .comb.sum                         # - the sum of the digits
                      [*] .comb               # - the product of the digits
                                       [$_]   # Get the n-th value

รายการที่ไม่มีที่สิ้นสุด ftw!


@ โจชัวขอบคุณ แต่คำอุปมาเหล่านี้จำเป็นสำหรับการมาก่อน นอกจากนี้การใช้สัญลักษณ์แปลก ๆ แทนที่จะ*หมายถึงจำนวนไบต์ที่มากขึ้น
Ven

Dangit ฉันลืมตรวจสอบว่ามีคำตอบ Perl 6 ก่อนโพสต์หรือไม่ นอกจากนี้ฉันจะจัดการกับความล้มเหลวโดยใช้//0ในgrepบล็อก
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills อย่าลังเลที่จะโพสต์รุ่นที่ดีกว่า! ฉันไม่ได้ใช้//0เพราะปกติจะยอมรับใน codegolf เพื่อพิมพ์ไปยัง stderr
Ven

แท้จริงแล้วมันก็เหมือนกันยกเว้น//0
Brad Gilbert b2gills

3

ที่จริงแล้ว 20 ไบต์

การดำเนินการที่ไร้เดียงสาของการกำหนดลำดับ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! ลองออนไลน์!

u`;;$♂≈;Σ(%@π(%|Y`╓N

Ungolfing

         Implicit input n.
u        Increment n, so that we don't accidentally include 0 in the sequence.
`...`╓   Starting with x=0, return the first n+1 values of x where f(x) is truthy.
  ;;       Duplicate x twice.
  $♂≈      str(x) and convert each char (each digit) into an int. Call this digit_list.
  ;        Duplicate digit_list.
  Σ        Get sum(digit_list).
  (%       Get x % sum(digit_list), which returns 0 if sum is a divisor of x.
  @        Swap the other duplicate of digit_list to TOS.
  π        Get prod(digit_list).
  (%       Get x % prod(digit_list), which returns 0 if prod is a divisor of x.
  |        Get x % sum(digit_list) OR x % prod(digit_list).
  Y        Logical negate, which only returns 1 if both are divisors, else 0.
N        Return the last value in the list of x where f(x) is truthy,
          that is, the nth value of the sequence.

3

แมงกะพรุน 45 ไบต์

p
\Ai
\&
>(&]&|0
  <*&d
 &~bN
  10
 ( )/+
 /*

ลองออนไลน์!

คำอธิบาย

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

แมงกะพรุนเป็นผู้ให้บริการการทำซ้ำที่ค่อนข้างทั่วไป\ซึ่งช่วยได้มากในการ "ค้นหาสิ่งที่ Nth " หนึ่งในความหมายของมันคือ "วนซ้ำฟังก์ชันบนค่าจนกว่าฟังก์ชันทดสอบแยกจะให้ความจริง" (อันที่จริงฟังก์ชั่นทดสอบได้รับทั้งองค์ประกอบปัจจุบันและองค์ประกอบสุดท้าย แต่เราจะทำให้ดูองค์ประกอบปัจจุบันเท่านั้น) . เราสามารถใช้ฟังก์ชันนี้เพื่อใช้ฟังก์ชั่น "หมายเลขที่ถูกต้องต่อไป" การโอเวอร์โหลดอีกอัน\คือ "ทำซ้ำฟังก์ชันบนค่าเริ่มต้น N คูณ" เราสามารถใช้ฟังก์ชั่นก่อนหน้าของเราและวนซ้ำใน0เวลา N โดยที่ N คืออินพุต ทั้งหมดนี้ได้รับการเซ็ตอัพอย่างรัดกุมกับส่วนนี้ของรหัส:

p
\Ai
\&
>     0

(เหตุผลว่าทำไม0อินพุตที่แท้จริงของฟังก์ชันที่ได้นั้นมีความซับซ้อนเล็กน้อยและฉันจะไม่เข้าไปที่นี่)

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

 (&]&|
  <*&d
 &~bN
  10
 ( )/+
 /*

(เป็นเอกเบ็ดซึ่งหมายความว่ามันเรียกฟังก์ชั่นด้านล่าง ( f) กับการป้อนข้อมูลของตน (ค่าปัจจุบันx) แล้วผ่านทั้งสองของพวกเขาไปยังฟังก์ชั่นการทดสอบไปทางขวา ( g) g(f(x), x)นั่นคือมันคำนวณ

ในกรณีของเราเป็นอีกหนึ่งฟังก์ชั่นคอมโพสิตที่ได้รับคู่กับหลักผลิตภัณฑ์และหลักผลรวมของf(x) xนั่นหมายความว่าgจะเป็นฟังก์ชั่นที่มีทั้งสามค่าเพื่อตรวจสอบว่าxถูกต้อง

เราจะเริ่มต้นโดยดูที่การfคำนวณผลรวมหลักและผลิตภัณฑ์หลัก นี่คือf:

 &~b
  10
 ( )/*
 /+

&ยังเป็นองค์ประกอบ (แต่วิธีอื่น ๆ รอบ) ~เป็นความดีความชอบเพื่อ10~bช่วยให้การทำงานที่คำนวณตัวเลขทศนิยมของตัวเลขและเนื่องจากเรากำลังผ่านที่จากขวานั่นคือสิ่งแรกที่จะเกิดขึ้นกับการป้อนข้อมูล& xส่วนที่เหลือใช้รายการตัวเลขนี้เพื่อคำนวณผลรวมและผลิตภัณฑ์

ในการคำนวณจำนวนเงินที่เราสามารถพับ/+นอกจากมากกว่านั้นซึ่งเป็น /*ในทำนองเดียวกันการคำนวณสินค้าที่เราพับคูณมากกว่านั้นด้วย ที่จะรวมทั้งผลเหล่านี้เป็นคู่ที่เราใช้คู่ของตะขอ, และ( )โครงสร้างของสิ่งนี้คือ:

()g
f

(ที่ไหนfและgเป็นผลิตภัณฑ์และผลรวมตามลำดับ.) ลองที่จะคิดออกว่าทำไมนี้จะช่วยให้เราคู่และf(x) g(x)โปรดทราบว่าเบ็ดขวา)มีเพียงหนึ่งอาร์กิวเมนต์ ในกรณีนี้ข้อโต้แย้งอื่น ๆ ก็ส่อให้เห็นว่า;สิ่งใดที่ล้อมข้อโต้แย้งเป็นคู่ นอกจากนี้ hooks ยังสามารถใช้เป็นฟังก์ชันไบนารี (ซึ่งจะเป็นกรณีที่นี่) ซึ่งในกรณีที่พวกเขาเพียงแค่ใช้ฟังก์ชั่นภายในเพียงหนึ่งอาร์กิวเมนต์ ดังนั้นจริงๆ)ในฟังก์ชั่นเดียวให้ฟังก์ชั่นที่คำนวณg [x, g(y)]ใช้ในเบ็ดซ้ายร่วมกับเราได้f [f(x), g(y)]ในทางกลับกันนี่ถูกใช้ในบริบทที่เป็นเอกภาพซึ่งหมายความว่ามันถูกเรียกด้วยจริงๆx == yและเราก็จบลงด้วย[f(x), g(x)]ความต้องการ วุ้ย.

gที่ใบเพียงสิ่งเดียวซึ่งเป็นฟังก์ชั่นการทดสอบก่อนหน้านี้ของเรา จำได้ว่ามันจะถูกเรียกว่าเป็นg([p, s], x)ที่ที่xยังคงเป็นค่าอินพุตปัจจุบันpเป็นผลิตภัณฑ์หลักและsเป็นผลรวมหลักของมัน นี่คือg:

  &]&|
  <*&d
    N

เพื่อทดสอบการหารเราจะใช้โมดูโลอย่างชัดเจน|ในแมงกะพรุน ค่อนข้างผิดปกติมันใช้โอเปอเรเตอร์ทางขวามือโมดูโลของมันโอเปอเรเตอร์ซ้ายมือซึ่งหมายความว่าอาร์กิวเมนต์gมีอยู่แล้วในลำดับที่ถูกต้อง (ฟังก์ชั่นทางคณิตศาสตร์เช่นนี้จะเธรดโดยอัตโนมัติผ่านรายการ . หมายเลขของเราหารด้วยทั้งผลิตภัณฑ์และผลรวมถ้าผลลัพธ์คือเลขศูนย์ เพื่อตรวจสอบว่าเป็นกรณีนี้หรือไม่เราถือว่าทั้งคู่เป็นรายการของเลขฐาน 2 ( d) ผลลัพธ์ของสิ่งนี้คือศูนย์เฉพาะเมื่อองค์ประกอบทั้งคู่ของทั้งคู่เป็นศูนย์ดังนั้นเราจึงสามารถลบล้างผลลัพธ์ของสิ่งนี้ ( N) เพื่อรับค่าความจริงว่าค่าทั้งสองแบ่งการป้อนเข้าหรือไม่ โปรดทราบว่า|, dและNทั้งหมดนั้นประกอบไปด้วยคู่ของ&s

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

เราสามารถแก้ไขได้โดยการคูณผลหารหารของเราด้วยผลิตภัณฑ์หลัก (ดังนั้นหากผลิตภัณฑ์หลักเป็นศูนย์มันจะเปลี่ยนค่าความจริงของเราให้เป็นศูนย์เช่นกัน) มันจะง่ายกว่าที่จะคูณผลลัพธ์การหารด้วยคู่ของผลิตภัณฑ์และผลรวมและแยกผลลัพธ์จากผลิตภัณฑ์ในภายหลัง

ในการทวีคูณผลลัพธ์ด้วยคู่เราต้องกลับไปที่ค่าก่อนหน้า (คู่) วิธีนี้ใช้ส้อม ( ]) ส้อมเป็น kinda เหมือน hooks บนเตียรอยด์ ถ้าคุณให้พวกเขาทั้งสองฟังก์ชั่นfและพวกเขาเป็นตัวแทนของฟังก์ชั่นไบนารีซึ่งคำนวณg f(a, g(a, b))ในกรณีของเราaคือคู่ผลิตภัณฑ์ / ผลรวมbคือค่าอินพุตปัจจุบันgคือการทดสอบการหารของเราและfเป็นการคูณ [p, s] * ([p, s] % x == [0, 0])ดังนั้นทุกคำนวณนี้

สิ่งที่เหลืออยู่ตอนนี้คือการดึงค่าแรกของสิ่งนี้ซึ่งเป็นค่าสุดท้ายของฟังก์ชั่นทดสอบที่ใช้ในตัววนซ้ำ นี่เป็นเรื่องง่ายเหมือนการเขียน ( &) ทางแยกที่มีฟังก์ชั่นส่วนหัว<ซึ่งจะส่งกลับค่าแรกของรายการ


ในฐานะผู้สร้างแมงกะพรุนฉันอนุมัติข้อความนี้ (จริง ๆ แล้วฉันจะหมดความอดทนลงครึ่งหนึ่งผ่านการแก้ปัญหานี้ในแมงกะพรุน)
Zgarb

3

R, 132 115 ไบต์

รุ่นใหม่ขอบคุณ @Billywob ความคิดเห็นที่ดี!

n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b

Ungolfed:

n=scan()
b=i=0

while(i<n)
    b=b+1;
    d=strtoi(el(strsplit(c(b,""),""))) #Splitting the number into its digits

    if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))
        i=i+1
b

ตั้งแต่Rทำงานกับ strangley NAฉันต้องเพิ่มifelse(is.na(...))ส่วนทั้งหมด!
หรือใช้na.omit(...)


1
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};bบันทึกไม่กี่ไบต์โดย: el(...)แทนการ[[1]]ใช้c(b,"")แทนการpaste(b)ปฏิเสธการแสดงออกทางตรรกะโดย!แทน==0และข้ามวงเล็บปีกกาในifคำสั่ง ฉันเดาว่าควรจะมีวิธีการจัดการNAปัญหาที่ง่ายขึ้นแต่ไม่สามารถเข้าใจสิ่งที่ฉลาด
Billywob

1
กลับกลายเป็นว่าเราสามารถหลีกเลี่ยงได้โดยผนวก a 0ไปยังนิพจน์ที่ประเมินในifคำสั่ง 0แต่ผลตอบแทนที่นี้คำเตือนเมื่อสินค้าไม่เท่ากับ n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
Billywob

@Billywob ขอบคุณมาก! ฉันไม่รู้เกี่ยวกับel(...)!
Frédéric

2

Brachylogขนาด 22 ไบต์

:1yt
#>=.@e+:I*.@e*:J*

ลองออนไลน์!

คำอธิบาย

:1y                    Evaluate the first N valid outputs to the predicate below given the
                         main input as input
   t                   The output is the last one


#>=.                  Output is a strictly positive integer
    @e+               The sum of its digits…
       :I*.           …multiplied by an integer I results in the Output
           @e*        The product of its digits…
              :J*     …multiplied by an integer J results in the Output

2

JavaScript (ES6), 78

n=>eval("for(i=0;n;!p|i%s|i%p||n--)[...++i+''].map(d=>(s-=d,p*=d),s=0,p=1);i")

น้อย golfed

n=>{
  for(i=0; n; !p|i%s|i%p || n--)
    s=0,
    p=1,
    [...++i+''].map(d=>(s-=d, p*=d));
  return i
}  

2

Pyth, 18 ไบต์

e.f!.xs%LZsM*FBsM`

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

e.f!.xs%LZsM*FBsM`ZZQ1   implicit variables at the end
e                        print the last number of the 
 .f                 Q1   first Q (input) numbers Z >= 1, which satisfy:
                 `Z         convert Z to a string, e.g. "124"
               sM           convert each digits back to a number, e.g. [1, 2, 4]
            *FB             bifurcate with product, e.g. [[1, 2, 4], 8]
          sM                take the sum of each, e.g. [7, 8]
       %LZ                  compute the modulo of Z with each number, e.g. [5, 4]
      s                     and add both numbers, e.g. 9
    .x             Z        if an exception occurs (mod 0), use number Z instead
   !                        test, if this number is zero

2

JavaScript (ES6), 72 ไบต์

k=>eval("for(n=0;(E=o=>n%eval([...n+''].join(o))!=0)`+`|E`*`||--k;)++n")

การสาธิต

มันมีแนวโน้มที่จะช้าสำหรับค่าที่สูงขึ้นดังนั้นฉันจึง จำกัด ให้อยู่ที่ 20 ที่นี่


2

Haskell, 94 85 72 71 ไบต์

([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)

1 การจัดทำดัชนี

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

ขอบคุณ @nimi ที่บันทึกไบต์!


(==)=<<map(gcd n)$[sum k,product k]ควรบันทึกบางไบต์
Zgarb

และในขณะที่เรากำลังทำอยู่นั้นสามารถ[sum k,product k] map($read.pure<$>show n)[sum,product]
Zgarb

อีกหนึ่งไบต์:([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
nimi

1

MATL , 21 ไบต์

`@tFYAtswph\~?@]NG<]&

ยาวและไม่มีประสิทธิภาพ ...

ลองออนไลน์!

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

`        % Do...while
  @      %   Push current iteration index (1-based)
  tFYA   %   Duplicate. Convert number to its digits
  ts     %   Duplicate. Sum of digits
  wp     %   Swap. Product of digits
  h\     %   Concatenate. Modulo. This gives a length-2 array
  ~?     %   If the two values are zero: we found a number in the sequence
    @    %     Push that number
  ]      %   End if
  NG<    %   True if number of elements in stack is less than input
]        % End do...while. If top of the stack is true: next iteration. Else: exit
&        % Specify only one input (top of stack) for implicit display

1

JavaScript (ES6), 70 ไบต์

k=(b,n=1,f=c=>n%eval([...n+''].join(c))!=0)=>f`+`|f`*`||--b?k(b,n+1):n

นี่กลับกลายเป็นเหมือนคำตอบของ @ Arnauld แต่การเรียกซ้ำนั้นสั้นกว่า 2 ไบต์ ใช้งานได้ใน Chrome แม้ว่ามันจะช้ามากในการป้อนข้อมูลมากกว่า 30 หรือมากกว่านั้น (50 ใช้เวลา 6 วินาที)


1

Python 2, 122 110 Bytes

def a(m,i=1,k=1):n=map(int,`i`);p=reduce(lambda x,y:x*y,n);k+=p and 1>i%sum(n)+i%p;return(k>m)*i or a(m,i+1,k)

1 การจัดทำดัชนีคุณจะต้องใช้ Python interpreter กับการ จำกัด การเรียกซ้ำที่ค่อนข้างสูง


1

สงสัย 33 ไบต์

@:^#0(!>@!(| %#0sum#0)%#0prod#0)N

ศูนย์การจัดทำดัชนี การใช้งาน:

(@:^#0(!>@!(| %#0sum#0)%#0prod#0)N)9

คำอธิบาย

อ่านเพิ่มเติมได้:

@
  iget #0 
    (fltr@
      not (or % #0 sum #0) % #0 prod #0
    ) N

โดยทั่วไปจะได้รับรายการที่ไม่มีที่สิ้นสุดของตัวเลขหารด้วยผลรวมดิจิตอลและผลิตภัณฑ์โดยการกรองรายการที่ไม่มีที่สิ้นสุดของตัวเลขทั้งหมดผ่านภาคแสดง จากนั้นnรายการ th จะถูกหยิบออกจากรายการ


1

Julia, 81 ไบต์

n->(i=c=1;while c<n d=digits(i+=1);all(d.>0)&&i%sum(d)==i%prod(d)<1&&(c+=1)end;i)

นี่เป็นฟังก์ชั่นนิรนามที่รับจำนวนเต็มและคืนค่าจำนวนเต็ม หากต้องการเรียกใช้ให้ตั้งชื่อ วิธีการคือสิ่งที่ชัดเจน: ตรวจสอบหมายเลขทุกตัวจนกว่าเราจะเจอnเงื่อนไขของลำดับ การallตรวจสอบเป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าเราจะไม่ได้รับDivisionErrorจาก%เมื่อผลิตภัณฑ์ของตัวเลขเป็น 0

Ungolfed:

function f(n)
    i = c = 1
    while c < n
        d = digits(i += 1)
        all(d .> 0) && i % sum(d) == i % prod(d) < 1 && (c += 1)
    end
    return i
end

ลองออนไลน์! (รวมถึงกรณีทดสอบทั้งหมด)


คุณสามารถบันทึกไบต์ที่สองโดยการกำหนดprod(d)ไปpหรือบางสิ่งบางอย่างแล้วแทนที่ด้วยall(d.>0) p>0และคุณสามารถบันทึกอื่นโดยการย้ายi%sum(d)ไปยังด้านอื่น ๆ ของคือ1 p<1>i%sum(d)
Martin Ender

1

C89, 381 226 195 170 169 ไบต์

มีการจัดทำดัชนี 1 รายการ (คำตอบที่แน่นอนเหมือนกับในการท้าทาย)

ถือว่า4 ไบต์ (32 บิต)int (สถาปัตยกรรมที่ทันสมัยที่สุด)

ฉันเชื่ออย่างแท้จริงว่านี่จะไม่สั้นไปกว่านี้อีกแล้ว

x,c,*b,m,t,i,a;g(n){for(b=malloc(0);c<n;b[c-1]=x++,t=1){char s[9];for(i=m=0;i<sprintf(s,"%d",x);m+=a,t*=a)a=s[i++]-48;b=m*t?x%m+x%t?b:realloc(b,4*++c):b;}return b[c-1];}

ฟังก์ชั่นการint g (int)รั่วไหลของหน่วยความจำและเข้าถึงหน่วยความจำครั้งแรกต่อการโทร แต่ไม่ได้ segfault และส่งกลับหมายเลขที่ถูกต้อง

โปรแกรมเต็มรูปแบบที่รับอินพุตเป็น unary ( ./prog $(seq 1 10)ต่อ 10) ด้วย ungolfed (kinda):

x, c, * b, m, t, i, a;

g(n) {
 for (b = malloc(0); c < n; b[c - 1] = x++, t = 1) {
  char s[9];
  i = m = 0;
  for (; i < sprintf(s, "%d", x); m += a, t *= a) a = s[i++] - 48;
  b = m * t ? x % m + x % t ? b : realloc(b, 4 * ++c) : b;
 }
 return b[c - 1];
}

main (j) {
  printf("%d\n", g(--j));
}

คำตอบเก่า:

C99, 381 ไบต์

#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#define U uint64_t
#define S size_t
S f(S n){U x=0;S c=1,l;U*b=malloc(sizeof(U));while(c<=n){char s[21];snprintf(s,20,"%"PRIu64,x);U m=0,t=1;l=strnlen(s,21);for(S i=0;i<l;i++){U a=(U)s[i]-48;m+=a,t*=a;}if(m*t?(!(x%m))&&(!(x%t)):0){b=realloc(b,sizeof(U)*++c);b[c-1]=x;}++x;}U o=b[n];free(b);return o;}

นี่อาจเป็นเรื่องของกอล์ฟมากกว่า

โปรแกรมเต็มรูปแบบ:

#include <stdio.h>
#include <limits.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

bool qualifies (const uint64_t);
size_t       f (const size_t);


int main(const int argc, const char* const * const argv) {
  (void) argc;
  size_t arg = strtoull(argv[1], NULL, 10);
  uint64_t a = f(arg);
  printf("a: %" PRIu64 "\n", a);
  return 0;
}

bool qualifies (const uint64_t num) {
  char s[21];
  snprintf(s, 20, "%" PRIu64 "", num);

  uint64_t sum  = 0,
           mult = 1;
  size_t    len = strnlen(s, 400);

  for (size_t i = 0; i < len; i++) {
    uint64_t a = (uint64_t) s[i] - 48;
    sum += a, mult *= a;
  }

  //printf("sum: %" PRIu64 "\nmult: %" PRIu64 "\n", sum, mult);
  return sum * mult ? (! (num % sum)) && (! (num % mult)) : false;
}

size_t f (const size_t n) {
  uint64_t x = 0;
  size_t s_len = 1;
  uint64_t* nums = malloc(sizeof (uint64_t) * s_len);

  while (s_len <= n) {
    if (qualifies(x)) {
      ++s_len;
      //printf("len: %zu\n", s_len);
      nums = realloc(nums, sizeof (uint64_t) * s_len);
      nums[s_len - 1] = x;
    }
    ++x;
  }

  uint64_t o = nums[n];
  free(nums);
  return o;
}

tio.run/nexus/…สร้างการเตือนเล็กน้อย แต่ก็เทียบเท่ากัน อย่างไรก็ตามฉันคิดว่ามันใช้ได้ดีintสำหรับทุกอย่างเนื่องจากเป็นประเภทจำนวนเต็มเริ่มต้น
Dennis

@Dennis ฉันไม่คุ้นเคยกับการละเว้นส่วนหัวและเพิกเฉยต่อคำเตือนนอก C89 ดังนั้นฉันจึงเล่นกอล์ฟโดยมีคำเตือนทั้งหมดเปิดใช้งานและเป็นข้อผิดพลาด: P ฉันจะเขียนใหม่ใน C89
แมว

@Dennis คงที่: D
แมว

1

C, 110 ไบต์

p;s;i;j;f(n){j=0;while(n){i=++j;p=1;s=0;do p*=i%10,s+=i%10;while((i/=10)>0);if(p>0&&j%p+j%s==0)--n;}return j;}

Ungolfed และการใช้งาน:

p;s;i;j;
f(n){
 j=0;
 while(n){
  i=++j;
  p=1;
  s=0;
  do
   p*=i%10,   //product
   s+=i%10;   //sum
  while((i/=10)>0);
  //check if product is not zero since floating point exception
  if(p>0 && j%p + j%s == 0)--n;
 }
 return j;
}

int main(){
 int n;
 scanf("%d",&n);
 printf("\n%d\n", f(n));
}

1

Python3, 134 80 ไบต์

เวอร์ชั่นใหม่ต้องขอบคุณFlp.Tkc

t=input();h=k=0;p=int
def g(x,q=0,w=1):
    for i in x:X=p(x);I=p(i);q+=I;w*=I
    return w!=0and X%q+X%w<1
while h<p(t):k+=1;h+=g(str(k))

รหัสใหม่ฉันจำวิธีการเล่นกอล์ฟเพื่อทำแฟคทอเรียล

f,t=lambda x:0**x or x*f(x-1),0
for i in str(f(int(input()))):t+=int(i)
print(t)

รหัสนั้นไม่เหมือนกอล์ฟมากนักเหมือนกับสนามกอล์ฟดุร้าย

def g(x):
    q=0;w=1;X=int(x)
    for i in x:I=int(i);q+=I;w*=I
    return (w!=0+ X%q==0and X%w==0)
t=input();h=k=0
while h<int(t):
    k+=1
    if g(str(k))is True:h+=1

g (x) เป็นฟังก์ชันที่ส่งกลับค่า True ถ้า x ตรงกับเกณฑ์


ในอนาคตใช้แทน<1 ==0คุณไม่ต้องการis True, จุดของคำสั่ง if คือการตรวจสอบว่าเงื่อนไขเป็นจริงหรือไม่ คุณสามารถใช้ทางลัด backtick ของ Python 2 สำหรับstr/reprการโกนจำนวนไบต์ นอกจากนี้ยังมีพื้นที่ว่างที่ไม่จำเป็นจำนวนมากที่นี่
FlipTack

นอกจากนี้คุณสามารถใช้ booleans เป็นค่าจำนวนเต็ม: h+=g(str(k))เพิ่ม 1 ถ้าจริง, 0 ถ้าเท็จ
FlipTack

@ Flp.Tkc คุณสามารถอธิบายเคล็ดลับ backtick ฉันพยายามจะใช้มันแล้วมันเกิดข้อผิดพลาดทางไวยากรณ์
george

Doing (backtick) x(backtick) ใน Python 2 เหมือนกันrepr(x)หรือstr(x)ใน Python 3 :)
FlipTack

@ Flp.Tkc ใช้งานได้เฉพาะใน Python 3 ก่อนมันถูกลบออกใน 3.0
george

0

PHP, 96 ไบต์

ใช้nเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

แข็งแรงเล่นกอล์ฟ

for(;$i<$argv[1];)!($p=array_product($d=str_split(++$j)))|$j%array_sum($d)||$j%$p?:$i++;echo $j;

Ungolfed

for (; $i < $argv[1];)                             // Loop until we've found the nth number as pass by command line
    !($p = array_product($d = str_split(++$j))) || // Split our current number into its digits and assign that to a variable, then assign the product of that array to another variable.
                                                   // As well, we're checking if the product equals 0, to prevent an error from trying to mod by 0 later. The condition short circuits before it happens.
    $j % array_sum($d) ||                          // Check if the sum of the array is a divisor
    $j % $p                                        // Check if the product is a divisor
    ?: $i++;                                       // Increment the number of found instances only if all conditions are met.
echo $j;                                           // Output to screen.

0

PowerShell v2 +, 84 ไบต์

param($n)for(;$n){$n-=!(++$a%(($b=[char[]]"$a")-join'+'|iex)+$a%($b-join'*'|iex))}$a

โซลูชั่นซ้ำ รับอินพุต$nและป้อนการforวนซ้ำตราบใดที่$nไม่ใช่ศูนย์ การวนซ้ำแต่ละครั้งเราลบออกจาก$nผลลัพธ์ของคำสั่งบูลีนแยกออกมาด้านล่าง

!(++$a%(($b=[char[]]"$a")-join'+'|iex)+$a%($b-join'*'|iex))
!(                                                        ) # Encapsulate in a NOT
  ++$a%                                                     # Increment $a and take mod ...
        ($b=[char[]]"$a")                                   # Turn $a into char-array, store in $b
                         -join'+'                           # Join the char-array together with +
                                 |iex                       # and eval it
                                      $a%($b-join'*'|iex)   # Similar for *
                                     +                      # Addition

ดังนั้นถ้าทั้งสอง$a%(sum)และ$a%(product)มีค่าเท่ากับศูนย์การเพิ่มจะเป็นศูนย์เช่นกันดังนั้นบูลีน - ไม่จะเป็นจริงดังนั้นจึงลดลง$n

เมื่อเราออกจากลูป (เช่นเราไปถึงคำที่n ) เราก็วาง$aบนไพพ์ไลน์และเอาท์พุทก็เป็นนัย

ตัวอย่าง

หมายเหตุ: นี่โยนพวงของ "หารด้วยศูนย์พยายาม" ข้อผิดพลาดในการ STDERR ซึ่งจะถูกละเว้นโดยค่าเริ่มต้น ฉันได้เพิ่ม2>$nullตัวอย่างด้านล่างเพื่อล้างผลลัพธ์ นอกจากนี้ยังค่อนข้างช้าเมื่อถึง30หรือประมาณและ50ใช้เวลาประมาณ 45 วินาทีในเครื่องของฉัน

PS C:\Tools\Scripts\golfing> 1,5,10,20,30,42,50|%{"$_ --> "+(.\numbers-divisible-by-sum-and-product.ps1 $_ 2>$null)}
1 --> 1
5 --> 5
10 --> 12
20 --> 312
30 --> 1344
42 --> 6912
50 --> 11313

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