Pandigital ทวีคูณ


14

แรงบันดาลใจจากCMC นี้

รับจำนวนเต็มบวกมากกว่า 0 ดำเนินการดังต่อไปนี้:

  • หากทั้งสิบหลักเดียว ( 1234567890) อยู่ในจำนวนอย่างน้อยหนึ่งครั้งให้ส่งออกจำนวนและออกจากโปรแกรม
  • มิฉะนั้นเพิ่มจำนวนและทำซ้ำเพิ่มจำนวนการนับ

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

นี่คือสั้นที่สุดที่จะชนะ อินพุตอาจถูกใช้เป็นสตริงหากคุณต้องการ

กรณีทดสอบ

input => output

617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55

เราสามารถรับอินพุตเป็นสตริงได้หรือไม่?
Stephen

@ สตีเฟ่นคุณอาจจะใส่เป็นสตริง
caird coinheringaahing

3
มันรับประกันได้หรือไม่ว่าnมีผู้ใดบ้างkที่nkเป็น pandigital? ฉันชอบที่จะเห็นหลักฐาน
shooqie

1
@bfontaine แชทมินิชาเลนจ์
caird coinheringaahing

3
@ หลักฐาน shooqie! สำหรับ n ใด ๆ ซึ่งเป็น coprime ถึง 10 ก็ยัง coprime ถึง 10 ^ 10 และดังนั้นจึงมี k บางอย่างที่ nk คือ 1 mod 10 ^ 10 จากนั้น 1234567890 * nk = 1234567890 mod 10 ^ 10 ดังนั้นแต่ละหลักจะต้องปรากฏขึ้นอย่างน้อยหนึ่งครั้ง ถ้าไม่ใช่ให้คูณด้วย 2, 5, หรือ 25 ตามความจำเป็นเพื่อสร้างโคปรินต์ที่ไม่ใช่ศูนย์สุดท้ายด้วย 10 และตัวแปรของการพิสูจน์ด้านบน (อย่างเป็นทางการ, n = 10 ^ m * p โดยที่ p ตรงตามเงื่อนไขข้างต้น จากนั้น 1234567890 * p * k ดังกล่าวข้างต้นคือ pandigital ดังนั้น 1234567890 * p * k * 10 ^ m = 1234567890 * k * n คือ :)
B. เมห์

คำตอบ:



4

J , 24 23 ไบต์

(]1&(+$:)2**)10>#@~.@":

ลองออนไลน์!

คำอธิบาย

(]1&(+$:)2**)10>#@~.@":  Input: integer n
                     ":  Format as string
                  ~.@    Unique
                #@       Length
             10>         Less than 10
           *             Multiply, gives n if previous was true, else 0
         2*              Multiply by 2
 ]                       Get the previous condition
  1&(   )                Execute this if true on 2n, else return 0
      $:                   Recurse
  1  +                     Add 1

ดี ฉันติดอยู่กับการรวบรวมผลลัพธ์ไม่ได้คิดถึงการใช้ฟังก์ชั่นวนซ้ำนั้น
Conor O'Brien

4

05AB1E , 11 10 ไบต์

-1 ไบต์ขอบคุณscottinet

[D9ÝåË#·]N

ลองออนไลน์! หรือเป็นชุดทดสอบ

[          // Start infinity loop
 D         // Duplicate current value (or input)
  9Ý       // Push [0,1,2,3,4,5,6,7,8,9]
    å      // Does each exist in the current value
     Ë#    // Break if all equal (if every digit exists)
       ·   // Else double the current value
        ]N // End loop and print the number of times through the loop


@scottinet ขอบคุณ! ฉันไม่รู้ว่าฉันคิดถึงมันอย่างไร
Riley

@riley กำลังจะพูดuse xแต่นั่นคือ 10 เกินไป ... คำตอบที่ดี คิดว่าxจะกำจัดDแต่มันเป็นความคิดเดียวกัน
Magic Octopus Urn

3

เพิร์ล 6 ,วันที่ 31 28 ไบต์ (27 ตัวอักษร)

-3 ไบต์ขอบคุณ @Joshua

{($_,2×*...*.comb.Set>9)-1}

ลองออนไลน์!

คำอธิบาย:ยังคงโครงสร้างเดียวกันเพื่อสร้างรายการซ้ำ องค์ประกอบแรกคือตัวเลขที่กำหนด ( $_) แต่ละองค์ประกอบถัดไปคือ 2 เท่าของก่อนหน้า ( 2×*- เราใช้×, เพราะถึงแม้ว่าอักขระ 2 ไบต์จะยังคงราคาถูกกว่า 1 ไบต์2 * *) และเราทำเช่นนี้จนกว่าจะสิ้นสุดเงื่อนไขของ*.comb.unique>9ความพึงพอใจ คือเมื่อมีจำนวนอักขระที่ไม่ซ้ำกันมากกว่า 9 ตัว (โดยทางเทคนิคแล้วเราแบ่งสตริงลงไปที่รายการของตัวละครด้วย.combบังคับให้เป็นชุดที่มี.Set(แน่นอนชุดประกอบด้วยแต่ละองค์ประกอบเพียงครั้งเดียว) และเปรียบเทียบกับ 9 ซึ่งบังคับให้ชุดเป็นบริบทเชิงตัวเลขซึ่งจะช่วยให้ จำนวนองค์ประกอบ)

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


คุณสามารถใช้.Setแทน.uniqueการบันทึก 3 ไบต์
Joshua

@ โจชัวจุดดี! ขอขอบคุณ. ฉันไม่เคยคิดเรื่องนี้
Ramillies

3

JavaScript (ES6) + big.js , 84 74 73 70 ไบต์

ขอบคุณ@ ConorO'Brienสำหรับการบันทึก 10 ไบต์โดยแนะนำbig.jsแทน bignumber.js
ขอบคุณ@Rick Hitchcockสำหรับ -1 ไบต์
ขอบคุณ@Shaggyสำหรับ -3 ไบต์

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

รับอินพุตเป็นสตริง รองรับได้สูงสุดประมาณ 2 69อันเนื่องมาจากการแปลงสัญกรณ์ทางวิทยาศาสตร์อัตโนมัติที่เกิดขึ้นนอกเหนือจากจุดนั้น

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

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

;[617283945, 2, 66833, 1234567890, 100, 42].forEach(t=>console.log(`f(${t}) = `+f(t)))
<script src="https://cdn.rawgit.com/MikeMcl/big.js/c6fadd08/big.min.js"></script>

ช่วงไม่ จำกัด106 88 87 84 ไบต์

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


บางทีคุณสามารถทำให้BigNumberบิตสั้นลงโดยใช้big.js ได้ไหม
Conor O'Brien

@ ConorO'Brien นั่นจะช่วยได้แน่นอนโดยเฉพาะอย่างยิ่งเพราะnewเป็นตัวเลือกในอันนั้น จะอัปเดตขอบคุณ!
Justin Mariner

f=n=>[..."0123456789"].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))บันทึกหนึ่งไบต์ด้วย
Rick Hitchcock

เราไม่จำเป็นต้องจัดการจำนวนเต็มขนาดใหญ่เพื่อให้คุณสามารถวาง big.js ถ้าคุณต้องการนำคุณลงไปที่ 61 ไบต์ และคุณสามารถบันทึกได้ 3 ไบต์โดยแทนที่สตริงตัวเลขด้วย"4"+2**29: tio.run/##BcGxDkAwEADQb2GQO41LNBZDbX7AKgbhKkSu0jZSX1/…
Shaggy

2

เยลลี่ , 12 , 11 ไบต์

QLn⁵
ḤÇпL’

ลองออนไลน์!

ต้องไปเร็ว!

คำอธิบาย:

        # Helper link, takes one argument 'z'
Q       # The unique digits of 'z'
 L      # Length
  n     # Does not equal
   ⁵    # 10
        #
        # Main link
  п    # While <condition> is true, run <body> and return all intermediate results
        # Condition:
 Ç      #   The helper link
        # Body:
Ḥ       #   Double the input
        # Now we have a list of all the 'z's that we passed to the helper link
    L   # Return it's length
     ’  # minus one



2

J , 43 ไบต์

f=:(,$:@+:@{.)`[@.(9<[:#@~.10&#.inv)
<:@#@f

ลองออนไลน์!

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ รวบรวมผลลัพธ์ค่อนข้างช้า ตรวจสอบคำตอบที่เหนือกว่าของไมล์ได้ที่นี่!


ไม่จำเป็นต้องมีการเรียกซ้ำใช้^:a::1#@}.+:^:(10>#@~.@":)^:a:
FrownyFrog


2

Clojure, 115 89 82 ไบต์

-26 ไบต์โดยเพียงแค่ใช้สตริงเพื่อแสดงรายการของตัวละคร (duh, ในการหวนกลับ) และการเปลี่ยนจากการใช้การเรียกซ้ำเป็นloop, ซึ่งทำให้ฉันสามารถเพิ่มประสิทธิภาพสองสาม

-7 bigintไบต์โดยการกำจัดของการเรียกร้องให้ เห็นได้ชัดว่าเราต้องจัดการอินพุตที่จะไม่ทำให้เกิดการโอเวอร์โฟลว์

#(loop[n % c 0](if(empty?(remove(set(str n))"1234567890"))c(recur(* 2 n)(inc c))))

Pregolfed:

(defn pan [num]
  (loop [n num
         cnt 0]

    ; Remove all the characters from the stringified input
    ;  that are numeric. If the result is an empty list, all
    ;  the numbers were present.
    (if (empty? (remove (set (str n)) "1234567890"))
      cnt
      (recur (* 2 n) (inc cnt)))))

คุณสามารถบันทึกได้ 7 ไบต์โดยใช้every?แทนempty? (remove …:#(loop[n % c 0](if(every?(set(str n))"1234567890")c(recur(* 2 n)(inc c)))))
bfontaine

@bfontaine โอ้คุณพูดถูก! ขอบคุณ ฉันจะแก้ไขในภายหลัง ขอบคุณ
Carcigenicate

2

เรติน่า , 85 ไบต์

^\d*
$&¶$&
D`.(?=.*¶)
\d{10}¶\d+|\d*¶

[5-9]
#$&
T`d`EE
T`_d#`d_`\d#
#
1
}`\d\b
$&@
@

ลองออนไลน์! ลิงก์มีกรณีทดสอบ ปรับให้เหมาะสมเล็กน้อยสำหรับเวลาทำงาน คำอธิบาย:

^\d*
$&¶$&

ทำซ้ำหมายเลขอินพุต

D`.(?=.*¶)

ซ้ำตัวเลขในสำเนาแรก

\d{10}¶\d+|\d*¶

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

[5-9]
#$&

วาง#ก่อนหน้าตัวเลขขนาดใหญ่

T`d`EE

สองหลักแต่ละหลัก

T`_d#`d_`\d#

เพิ่มในการดำเนินการ

#
1

จัดการกับการพกพาชั้นนำ

}`\d\b
$&@

ต่อท้าย@และวนซ้ำจนกว่าจะพบ 10 หลักทั้งหมด

@

พิมพ์จำนวน@เพิ่ม


2

APL (Dyalog Unicode) , 19 + 2 = 21 ไบต์

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}

ลองออนไลน์!

นี่คือ dyadic Dfn( d irect unctio n ) การ 0 เป็นอาร์กิวเมนต์ซ้ายและจำนวนเต็มเป็นที่เหมาะสม เนื่องจากอินพุตควรเป็นจำนวนเต็มเท่านั้นฉันจึงเพิ่ม 2 ไบต์สำหรับอาร์กิวเมนต์0∘ไปยังจำนวนไบต์

f←ไม่ได้รวมอยู่ในจำนวนไบต์เพราะมันไม่จำเป็น มันทำให้การสร้างกรณีทดสอบง่ายขึ้น

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

ส่วนหัว: ฉันลบออกจากจำนวนไบต์หลังจากการแชทในห้อง APL เนื่องจากฟังก์ชั่นทำในสิ่งที่ควรทำและผลลัพธ์ไม่ถูกต้องเนื่องจากการตั้งค่าเริ่มต้นของ REPL ของ APL

⎕FR←1287ตั้งค่าการนำเสนอF loat Rเป็นทศนิยม 128 บิต (7 คือรหัสสำหรับทศนิยมใน REPL ของ APL) ⎕PP←34ตั้งค่าP rint P recision ถึง 34 หลัก ทั้งสองสิ่งนี้มีความจำเป็นเนื่องจาก APL ที่เป็นตัวแทนเริ่มต้นสำหรับตัวเลขจำนวนมากเปลี่ยนเป็นสัญลักษณ์ทางวิทยาศาสตร์ (เช่น 3.14159265359E15) ซึ่งทำให้โค้ดยุ่งเหยิงครั้งใหญ่

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}  Dyadic Dfn
0                      Fixes 0 as the left argument  
          :             If
     D                 String representation of all digits [0, 9]
                       "is in"
        ⍕⍵              String representation of the input
   ∧/                   AND-reduction. Yields 1 (true) iff all digits are in the right argument.
                       return the left argument
                       Else
                 2×⍵    Double the right arg
             ⍺+1        increment the left arg
                       Recursively call this function with the new arguments.

2

Java 8, 132 110 87 74 ไบต์

n->{int c=0;for(;(n+"").chars().distinct().count()!=10;n*=2)c++;return c;}

-57 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองที่นี่ (หมายเหตุ: กรณีทดสอบสำหรับ2ถูกปิดใช้งานเนื่องจากควรหยุดที่ 2 68แต่ขนาดของlongถูก จำกัด ไว้ที่ 2 63 -1)

n->          // Method with long parameter and integer return-type
  int c=0;   //  Count-integer, starting at 0
  for(;(n+"").chars().distinct().count()!=10;
             //  Loop (1) as long as the unique amount of digits in the number are not 10
    n*=2)    //    After every iteration: multiply the input by 2
   c++;      //   Increase the count by 1
             //  End of loop (1) (implicit / single-line body)
  return c;  //  Return the counter
}            // End of method

132 ไบต์เก่าตอบโดยใช้Stringอินพุตและ regex:

n->f(n,0)int f(String n,int c){String t="";for(int i=0;i<10;t+="(?=.*"+i+++")");return n.matches(t+".*")?c:f(new Long(n)*2+"",c+1);}

ลองที่นี่ (หมายเหตุ: กรณีทดสอบสำหรับ2ถูกปิดใช้งานเนื่องจากทำให้ StackOverflowException เกิดขึ้นเนื่องจากการเรียกซ้ำมากเกินไปเล็กน้อย)

regex ทั้งหมดเพื่อตรวจสอบว่า String มีตัวเลข 9 หลักทั้งหมด^(?=.*0)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9).*$หรือไม่ซึ่งใช้การมองล่วงหน้าเป็นบวกสำหรับ String ทั้งหมด


1
111 bytes (yup, จำนวนไบต์เป็น "uni-digital" ;-)
Olivier Grégoire

หมายเหตุที่ 2 จะไม่ทำงานเพราะเราคาดหวัง2^68เป็นจำนวน Pandigital แรก แต่ปรารถนาใน Java จะถูก จำกัด 2^63-1ให้
Olivier Grégoire

1
87 ไบต์ ขอบคุณreduce\ o /
Olivier Grégoire

1
74 ไบต์ หยุดที่นี่ ;-)
Olivier Grégoire

1
@KevinCruijssen ฉันรู้ว่าคุณกำจัดวิธีการเก่าของคุณ แต่เพียงต้องการชี้ให้เห็นว่าคุณสามารถใช้ regex ต่อไปนี้เพื่อจับคู่ 10 หลักทั้งหมด:(?:.*?(\d)(?!.*\1)){10}
jaytea

1

Huskขนาด 10 ไบต์

←Vö>9Lud¡D

ลองออนไลน์!

คำอธิบาย

        ¡D    Repeatedly double the input, collecting results in a list
 V            Return the first index where the following is true
     L          The length of
       d        the digits
      u         with duplicates removed
  ö>9           is greater than 9
←             Decrement (as Husk uses 1-indexing)

1

Mathematica, 59 48 47 46 38 ไบต์

-9 ไบต์ขอบคุณ Jenny_mathy

If[!FreeQ[DigitCount@#,0],#0[2#]+1,0]&

ลองใช้งานออนไลน์โดยใช้ Mathics!


2
46 ไบต์: ถ้า [Tr [1 ^ Union @ IntegerDigits @ #] <10, # 0 [2 #] + 1,0] &
J42161217

Mathematica อนุญาตให้มีฟังก์ชั่นวนซ้ำแบบไม่ระบุชื่อ : o ขอบคุณ!
มนุษย์

2
38 ไบต์: ถ้า [! FreeQ [DigitCount @ #, 0], # 0 [2 #] + 1,0] &
J42161217

โอ้ขอบคุณ! BTW สามารถใช้รหัส `` ได้ แต่ไม่อนุญาตให้ใช้ช่องว่างนำหน้า aจะทำงานได้ แต่จะไม่เป็น
มนุษย์

แน่นอน! BTW คุณสามารถใช้ส่วนท้ายนี้ใน TIO Print/@f/@{617283945,2,66833,1234567890,100,42}
J42161217

1

R , 74 ไบต์

function(x){while(!all(0:9%in%el(strsplit(c(x,""),"")))){F=F+1;x=2*x};F*1}

ลองออนไลน์! โปรดทราบว่า R จะให้คำตอบที่ผิดf(2)เนื่องจากข้อ จำกัด ของวิธีการที่ภาษาเก็บจำนวนเต็มขนาดใหญ่

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

ตัวนับใช้ F ซึ่งเริ่มต้นเป็น FALSE เพื่อให้แน่ใจว่ามันถูกบังคับให้เป็นตัวเลขเราคูณหนึ่งก่อนที่จะกลับมา


การใช้c(x,"")เป็นเคล็ดลับเรียบร้อยสำหรับel(strsplit(...))
Giuseppe

1

PowerShell , 70 69 ไบต์

for($n=[bigint]$args[0];([char[]]"$n"|group).count-le9;$n*=2){$i++}$i

ลองออนไลน์!

(เกือบสองเท่าตราบเท่าที่คำตอบของ Python: - \)

จะเข้า$args[0]ดุจเป็นบันทึกไว้เพื่อ[bigint] $nเข้าสู่forลูป แต่ละซ้ำที่เราตรวจสอบกับว่า$nสีน้ำตาลไหม้แปลงสตริงไปแล้วchar-array เมื่อGroup-Object'วันที่ร่วมกันมี.count -lESS กว่าหรือequal 9ไป ความหมายเพียงวิธีเดียวที่มันเท่ากับ 10 ถ้าอย่างน้อยหนึ่งหลักของจำนวนทุก1234567890ที่เป็นปัจจุบัน ถ้าใช่เราออกจากลูป ถ้าไม่เรา$n*=2และดำเนินการต่อ $iย้ำภายในแต่ละวงเราเพียงแค่การเพิ่ม $iเมื่อเราออกจากวงเราก็เอาท์พุท

โปรดทราบว่าสำหรับการป้อนข้อมูลเช่น1234567890ที่ทุกหลักคือการคิดแล้วสำหรับการนี้จะไม่มีอะไรส่งออกซึ่งเป็นค่า falsey ใน PowerShell และเทียบเท่ากับเมื่อหล่อเป็น0 [int]หากนั่นไม่เป็นไรเราก็สามารถวาง+เอาท์พุทไว้ด้านหน้า$iเพื่อทำการแปลงมันเป็นจำนวนเต็มอย่างชัดเจน

บันทึกเป็นไบต์ขอบคุณ Roland Heath


คุณสามารถใช้ le9 แทน ne10 ได้ไหม? ฉันไม่คุ้นเคยกับ PowerShell แต่นั่นอาจช่วยประหยัดไบต์ได้
Roland Heath

@RolandHeath แน่นอน; โทรดี ขอบคุณ!
AdmBorkBork



0

Perl, 43 + 1 ไบต์

for$x(0..9){$_*=2,++$\,redo LINE if!/$x/}}{

การใช้-pธง สิ่งนี้สร้างขึ้นบนโซลูชันที่จัดหาโดย Xcali ด้านบน


0

Swift 4 , 111 bytes

func p(_ x:Int,_ c:Int=0)->Int{if !(String(Set(String(x)).sorted())=="0123456789"){return p(x*2,c+1)};return c}

หมายเหตุ: จะไม่ทำงานสำหรับ x = 2 เนื่องจากมีมากเกินไป

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


1
มันไม่ได้กระทะเพราะ var เป็น 64 บิต มีคำตอบอื่น ๆ อีกมากมายที่มีปัญหาเดียวกัน
Naresh


หากคุณคิดว่าสิ่งนี้ควรได้รับอนุญาตนำขึ้นมาด้วย OP อาจเป็นเรื่องธรรมดา แต่ OP ไม่อนุญาตให้เฉพาะเจาะจงและชุดทดสอบดูเหมือนจะแนะนำให้คุณต้องสนับสนุน 2
โพสต์ Rock Garf Hunter

1
@FunkyComputerMan ที่จริงฉันอนุญาตให้คำตอบที่ไม่สามารถจัดการกับตัวเลขนอกขอบเขตของภาษาได้ แต่ดูเหมือนว่า Shaggy ได้ลบความคิดเห็นที่ถามเกี่ยวกับเรื่องนี้แล้ว คำตอบนี้ใช้ได้
caird coinheringaahing

0

ทับทิม, 46 45 39 38 ไบต์

def f n;n.digits.uniq[9]?0:1+f(n*2)end

ลองออนไลน์!

ปรับปรุง:

  1. -1 โดยใช้แทนdef f n;def f(n);
  2. -6 โดยใช้…[9]แทน….size==10
  3. -1 โดยการลบเครื่องหมายอัฒภาค

0

Japt 15 ไบต์

LÆ*2pXÃbì_â Ê¥A

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

LÆ    Ã

สร้างอาร์เรย์ของจำนวนเต็มจาก0ถึง99และผ่านแต่ละฟังก์ชันที่Xเป็นองค์ประกอบปัจจุบัน

*2pX

Uคูณด้วย 2 Xยกกำลังของ

b

รับดัชนีองค์ประกอบแรกที่คืนค่าเป็นจริงเมื่อส่งผ่านฟังก์ชันต่อไปนี้

ì_â

แยกเป็นจำนวนหลักและลบรายการที่ซ้ำกัน

Ê¥A

10ได้รับความยาวของอาร์เรย์และตรวจสอบเพื่อความเท่าเทียมกันด้วย


ทางเลือก 15 ไบต์

@*2pX)ìâ sÊ¥A}a

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

@            }a

เริ่มต้นด้วย0ส่งคืนหมายเลขแรกที่ส่งกลับค่าจริงเมื่อส่งผ่านฟังก์ชันต่อไปนี้โดยXเป็นหมายเลขปัจจุบัน

*2pX)

ข้างต้นคูณUโดย 2 Xถึงอำนาจของ

ìâ

แยกออกเป็นอาเรย์ของตัวเลขลบข้อมูลที่ซ้ำกันและเข้าร่วมเป็นจำนวนเต็ม

แปลงเป็นสตริงรับความยาวและแปลงกลับเป็นจำนวนเต็ม

¥A

10ตรวจสอบเพื่อความเท่าเทียมกันด้วย


0

QBIC , 48 ไบต์, nc

{q=1[z|q=q*instr(!:$,!a-1$)]~q>0|_Xp\p=p+1┘b=b*2

ทฤษฎีนี้ควรใช้งานได้จริง อย่างไรก็ตามในทางปฏิบัติสิ่งนี้ล้มเหลวเพราะ QBasic ใช้ตัวเลขสิบหลัก (อย่างน้อยต้องมีตัวเลขทั้งหมด) เพื่อสัญกรณ์ทางวิทยาศาสตร์ ... ฉันทำเครื่องหมายว่าไม่ใช่การแข่งขันเพราะสิ่งนั้น

คำอธิบาย

{             DO ad infinitum
q=1           set q to 1
[z|           FOR a = 1 to 10
q=q*instr     multiply q by the position
(!:$             - in 'b' (read from cmd line at start) cast to string (! ... $)
,!a-1$)          - of the number a-1 [0-9] cast to string
]             NEXT
~q>0          IF any character was not found, instr gave a 0. If q != 0 all digits were present
|_Xp          THEN quit, printing  p (is 0 at start)
\p=p+1        ELSE increase step counter p
┘b=b*2        and double 'b'

0

GNU dc, 61 ไบต์

อินพุตถูกคัดลอกมาจากด้านบนของสแต็ก (ซึ่งต้องว่างเปล่า); เอาต์พุตถูกส่งไปที่ด้านบนสุดของสแต็ก

[I~1r:ad0<s]ss[d1+r;a1=p]sp[d2*lfx]sh[0Sadlsxlpx11!=h]dsfxz1-

คำอธิบาย

เราใช้ตัวแปรอาเรย์aโดยการจัดเก็บ 1 a[d]หากมีตัวเลขdอยู่มิฉะนั้นจะลดลงเหลือ 0 เราใช้ส่วนขยาย GNU ~เพื่อรับความฉลาดทางและส่วนที่เหลือในคำสั่งเดียว

# populate a[0-9] from the digits
[I~1r:ad0<s]ss

# check pandigit
# return 1 more than lowest unset element of a[]
# start with stack=0
[d1+r;a1=p]sp

# Test for pandigit; double and repeat if needed
[dd+lfx]sh
[0Sadlsxlpx11!=h]dsfx

# We left one value on the stack for each doubling, plus the original
z1-

เป็นโบนัสสิ่งนี้จะทำงานในฐานของจำนวนโดยพลการ (ไม่ใช่แค่ทศนิยม): เพียงแค่ตั้งค่า radix อินพุตตามต้องการ (ค่าคงที่11ในนิยามของfจะอ่านโดยใช้ฐานจำนวนนั้นดังนั้นถูกต้องโดยอัตโนมัติ)

ทดสอบ

for i in 617283945 2 66833 1234567890 100 42
do
    printf '%s => ' $i
    dc -e $i \
       -e '[I~1r:ad0<s]ss[d1+r;a1=p]sp[dd+lfx]sh[0Sadlsxlpx11!=h]dsfxz1-' \
       -e p
done
617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55


0

q / kdb + , 33 ไบต์

วิธีการแก้:

(#)1_{x*2 1 min!:[10]in 10 vs x}\

ตัวอย่าง:

q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[100]
51
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[1234567890]
0
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[42]
55

คำอธิบาย:

ไบต์ทั้งหมดอยู่ในความเท่าเทียมกันอาจสามารถตีกอล์ฟนี้ลงอีกเล็กน้อย ใช้scanคำวิเศษณ์ของ q :

count 1_{x*2 1 min til[10] in 10 vs x}\ / ungolfed solution
        {                            }\ / scan over this lambda until it yields same result
                              10 vs x   / convert to base 10
                           in           / left list in right list, returns boolean list
                   til[10]              / range 0..9
               min                      / return the minimum of the list, 0 or 1
           2 1                          / list (2;1) indexed into with 0 or 1
         x*                             / return x multiplied by either 2 or 1
      1_                                / 1 drop, drop one element from front of list
count                                   / count the length of the list

หมายเหตุ:

ถ้าเราไปที่kพรอมต์เราก็จะได้สารละลาย 25 ไบท์ แปลงตัวเลขเป็นรายการอักขระ:

q)\
  #1_{x*2 1@&/($!10)in$$x}\[100]
51
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.