ทำให้รวมเป็น 10,000


26

เราเพิ่งจะถึงเกณฑ์ 10,000 คำถามเกี่ยวกับ PPCG ไชโย! มาฉลองกันด้วยความท้าทายที่เรียบง่าย

อินพุต

สองจำนวนเต็มและBทั้งใน[ 1..9999 ]เช่นว่า+ B < 10000AB[1..9999]A+B<10000

งาน

งานของคุณคือการเพิ่มหนึ่งหลักเดียวกับหนึ่งของจำนวนเต็มเหล่านี้หรืออย่างใดอย่างหนึ่งเป็นเลขหลักเดียวทั้งสองคนดังกล่าวว่า+ B = 10000 หากเพิ่มตัวเลขลงในทั้งAและBก็ไม่จำเป็นต้องเป็นตัวเลขเดียวกันA+B=10000AB

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

ตัวอย่าง:

สำหรับA=923การแปลงต่อไปนี้ถูกต้อง:

192392739238

แต่สิ่งเหล่านี้ไม่ถูกต้อง :

09231092394273

เมื่อพิจารณาA=923และB=72มีวิธีแก้ปัญหาที่เป็นไปได้สองวิธี:

9238+762=100009273+727=10000

เอาท์พุต

คุณต้องพิมพ์หรือแสดงรายการวิธีแก้ไขที่เป็นไปได้ทั้งหมด

[[9238,762],[9273,727]]สำหรับตัวอย่างข้างต้นส่งออกคาดว่าจะเป็น

กฎระเบียบ

  • I / O สามารถดำเนินการได้ในรูปแบบที่สมเหตุสมผลและไม่คลุมเครือ คุณสามารถใช้สตริงรายการตัวเลข ฯลฯ แทนจำนวนเต็ม
  • อินพุตรับประกันว่ามีทางออกอย่างน้อยหนึ่งรายการ
  • คุณได้รับอนุญาตไม่ให้ซ้ำซ้อนผลลัพธ์ อย่างไรก็ตามมันจะได้รับการชื่นชมหากรหัสทดสอบซ้ำซ้อนกับการโพสต์การประมวลผลตัวอย่างเช่นในส่วนท้ายของ TIO
  • นี่คือความท้าทาย

กรณีทดสอบ

Input    --> Output

934, 654 --> [[9346,654]]

737, 628 --> [[7372,2628]]

9122, 88 --> [[9122,878]]

923, 72  --> [[9238,762],[9273,727]]

998, 3   --> [[9968,32],[9987,13]]

900, 10  --> [[9900,100],[9090,910]]    NB: solutions such as [9000,1000] are NOT valid
                                            (more than one digit added to 10)

363, 632 --> [[3673,6327],[3638,6362]]

288, 711 --> [[2881,7119],[2882,7118],[2883,7117],[2884,7116],[2885,7115],[2886,7114],
              [2887,7113],[2888,7112],[2889,7111]]

365, 635 --> [[365,9635],[1365,8635],[2365,7635],[3365,6635],[4365,5635],[5365,4635],
              [6365,3635],[7365,2635],[8365,1635],[9365,635],[3065,6935],[3165,6835],
              [3265,6735],[3465,6535],[3565,6435],[3665,6335],[3765,6235],[3865,6135],
              [3965,6035],[3605,6395],[3615,6385],[3625,6375],[3635,6365],[3645,6355],
              [3655,6345],[3675,6325],[3685,6315],[3695,6305],[3650,6350]]

4
มันไม่ใช่เรื่องง่ายหากฉันไม่สามารถพิมพ์ออกมาและมั่นใจได้ว่ามันทำงานได้ในขณะที่อยู่ในรถ ; p
Quintec

16
@Quintec ฉันไม่แนะนำให้พิมพ์อะไรในขณะที่คุณอยู่ในรถ : p
Arnauld

1
@Annauld เขาไม่ได้บอกว่าเขาเป็นคนขับ ;-) (หมายเหตุที่จริงจัง: 4 ความคิดเห็นนอกหัวข้อจนถึงแฮนดิแคป 3 ความคิดเห็นของฉันสำหรับจุดประสงค์เหล่านั้นดังขึ้นดัง: P)
Erik the Outgolfer

1
เมื่อสารละลายวุ้นใช้เวลามากกว่า 20 ไบต์มันเป็นความท้าทายที่ยาก!
Regis Portalez

output a list of all possible solutionsโอ้คนเกียจคร้าน นั่นคงเป็นเรื่องยากสำหรับภาษารูนของฉัน ฉันอาจจะเขียนโปรแกรมที่สามารถส่งออกแก้ปัญหา!
Draco18s

คำตอบ:


12

Haskell , 99 97 82 81 ไบต์

-16 ไบต์ขอบคุณDelfad0r (รับอินพุตเป็นรายการโดยใช้การเหยียดหยามซึ่งเราไม่จำเป็นต้องขจัดข้อมูลซ้ำซ้อน -> n สามารถอยู่ใน[0,4]และใช้การจัดรูปแบบอินพุตที่ชาญฉลาดและap)!

filter((==1e4).sum).mapM([read.(take n<>(c:).drop n)|c<-['0'..'9'],n<-[0..4]]<*>)

ลองออนไลน์!



8

R , 96 ไบต์

function(a,b)(w<-grep(gsub("",".?",a?b),1:1e4?9999:0)?r<-1e4-w)[w+a<2&r+b<2]
"?"=paste
"+"=adist

ลองออนไลน์!

คำอธิบาย (ungolfed)

function(a,b){
    # Regex inserting ".*": (998,3) => ".?9.?9.?8.? .?3.?"
  regex <- gsub("",".?",paste(a,b)) 
    # Positions matching in the whole vector of strings that add to 10K ("1 9999", "2 9998", "3 9997", "4 9996", ...)
  w <- grep(regex,paste(1:1e4,9999:0)) 
    # 10K minus these matching positions
  r <- 1e4-w 
    # Form position-string vector of ('pos1 10K-pos1', 'pos2 10K-pos2', ...)
  paste(w,r)[
  # Filter only those positions where the edit distance between the matched numbers and the originals are less than 2
    adist(w,a)<2 & adist(r,b)<2 
  ]
}

เรากำหนดไป? pasteที่ช่วยให้เราทำอะไรบางอย่างเย็น: a<-b?c<-dไม่ได้รับมอบหมายอินไลน์ภายในpasteโทรซึ่งเราไม่สามารถทำอะไรกับผู้ประกอบการอื่น ๆ ที่ไม่ใช่?เพราะมันมีความสำคัญต่ำ<-กว่า

ขณะนี้เป็น @JoKing ออกแหลมกรุณาอาจมีกรณีเช่นที่สองแทรกอาจเกิดขึ้นเช่น900 10 9100 8100ดังนั้นเราจึงกรองการจับคู่ที่จำนวนตัวละครในจำนวนใดจำนวนหนึ่งเพิ่มขึ้นมากกว่า 1 วิธีที่รวดเร็วในการทำเช่นนี้คือระยะทางแก้ไข Levenshtein adistที่เราผูก+ไว้


ขอบคุณสำหรับการตรวจสอบ! ตอนนี้ฉันกรองการแข่งขันที่มีการแทรกมากกว่าหนึ่งต่อหมายเลข
J.Doe

7

Pyth, 28 27 25 24 22 20 ไบต์

fq^;4sT*FmvsmXLkdThl

ลองออนไลน์ได้ที่นี่หรือตรวจสอบทุกกรณีทดสอบที่นี่ - ชุดทดสอบ deduplicates ผลโดย prepending{

อินพุตเป็นรายการของสตริง

fq^;4sT*FmvsmXLkdThldQ   Implicit: Q=eval(input()), T=10
                         Trailing d, Q inferred
         m           Q   Map each input string, as d, using:
                   ld      Take the length of d
            m     h        Map 0 to the above (inclusive), as k, using:
             X  d            Insert into d...
               k             ... at position k...
              L  T           ... each number [0-9]
           s               Flatten the result
          v                Convert each back to an integer
       *F                Take the cartesian product of the result
                         (this generates all possible pairs of mutated numbers)
f                        Keep the pairs, as T, where...
     sT                  ... the sum of the pair...
 q                       ... is equal to...
  ^;4                    ... 10,000 (; == 10 here, so this is 10^4)

แก้ไข 4: บันทึกอีก 2 ไบต์ขอบคุณ Mr Xcoder - vเวกเตอร์ตามค่าเริ่มต้นและLใช้mด้านล่างดังนั้นการทำแผนที่ในช่วงช่วงจะเป็นการบอกเป็นนัยทำให้Uไม่จำเป็นเช่นกัน

แก้ไข 3: แนะนำให้รู้จักกับการใช้งานทั่วโลกของ;โอเปอเรเตอร์เพื่อรักษาสิทธิ์ในการเข้าถึง 10 เพื่อบันทึก 2 ไบต์ด้วย FryAmTheEggman และ issacg:

fq^T4sT*FmvMsmXLkdUThl

แก้ไข 2: ฉันลืมโอเปอเรเตอร์ผลรวมที่มีอยู่วิธีที่น่าอาย ...

แก้ไข 1: เวอร์ชันก่อนหน้ายอมรับรายการจำนวนเต็มเป็นอินพุตดำเนินการแปลงสตริงด้วยตนเองเป็นเวลา 27 ไบต์:

fq10000+FT*FmvMsmXLk`dUThl`

1
@KevinCruijssen มันทำจริง ๆ แล้ว 10 ปกติTแต่ในฟังก์ชั่นบล็อกตัวแปรจะถูกกำหนดให้ทำหน้าที่เป็นตัวแปรการทำซ้ำแทน - ในบล็อกตัวกรองตัวแปรการทำซ้ำจึงเกิดขึ้นTดังนั้นจึงไม่สามารถใช้งานได้ ซึ่งหมายความว่า10 ^ 4จะเป็น^10 4ซึ่งมีความยาว 5 ไบต์ดังนั้นจึงไม่น่าเสียดายที่สั้นลง
Sok

1
@Sok Ah ตกลง ดังนั้นTในUTยังคงเป็น 10 สำหรับ[0,10)ช่วง แต่ในได้กลายเป็นตัวแปรซ้ำสำหรับตัวกรอง ขอบคุณสำหรับคำอธิบายที่เหมาะสม! และทำก่อนหน้านี้บันทึกไว้ในตัวแปรและการใช้ตัวแปรนั้นในตัวกรองคืออย่างน้อย 5 ไบต์เช่นกัน f...TTT4^
Kevin Cruijssen

2
คุณสามารถแทนที่ด้วย10000 ^;4
FryAmTheEggman

2
;มักจะมีค่าของตัวแปรการวนซ้ำในบริบทโลกในกรณีนี้ 10 ดังนั้น^;4สิ่งที่คุณกำลังมองหา
isaacg

1
20 fq^;4sT*FmvsmXLkdThlไบต์: ( Pyth beats Jelly? oO Hooray )
Mr. Xcoder

4

Perl 6 , 64 ไบต์

->\a{grep {all (a Z~$_)X~~/^(.*)(.*)$0.?$1$/},(^1e4 Z(1e4...1))}

ลองออนไลน์!

นี่เป็นพอร์ตของคำตอบของ GBโดยใช้ regex เพื่อตรวจสอบว่าหมายเลขนั้นถูกต้องหรือไม่ ขอบคุณnwellnhofสำหรับการพอร์ต

คำตอบเก่า127 110 , 88 ไบต์

-22 ไบต์ขอบคุณ nwellnhof!

->\a{grep {all ~<<a Z∈.map:{.comb.combinations(.comb-1..*)>>.join}},(^1e4 Z(1e4...1))}

ลองออนไลน์!

บล็อกโค้ดแบบไม่ระบุชื่อที่ใช้ในรายการของตัวเลขสองตัวและส่งกลับรายการคู่ของตัวเลข

แทนที่จะทำตัวกลมกลืนไปกับการแทรกตัวเลขเข้าไปการแก้ปัญหานี้จะตรวจสอบการรวมกันของตัวเลขที่รวมกันที่ 10,000 และตัวกรองที่ตัวเลขที่กำหนดเป็นส่วนหนึ่งของคู่

คำอธิบาย:

->\a{  # Anonymous code block that takes an argument a
     grep ... ,(^1e4 Z(1e4...1))    # Filter from all pairs that add to 10000
         {      ~<<a     # Stringify the contents of a
                     .map:{      # Map the pair to
                           .comb  # The digits of the number
                           .combinations(.comb-1..*)  # The combinations of the digits
                           >>.join  # Each combination joined
                           # Note that combinations preserve order
                           # "123" -> (12,13,123)
                          }
          all       Z   # Zip that each element of a is an element of the combination
         }
}

เพียงแค่อยากรู้: คุณไม่สามารถใช้ความจริงที่ว่าทั้งคู่สามารถเขียน(i,1e4-i)แทนการวนซ้ำ(i,j)และกรองพวกมันได้?
Eric Duminil

3

R , 179 161 150 144 ไบต์

function(a,b,w=g(a),r=rep(g(b),e=1e4))paste(w,r)[w+r==1e4]
g=function(x,n=sum(x|1)){for(i in 0:n)for(j in 0:9)F=c(F,append(x,j,i)%*%10^(n:0));F}

ลองออนไลน์!

บันทึก 35 ไบต์โดย @JayCe และ @Giuseppe

คำอธิบาย

ฟังก์ชันผู้ช่วย g รับการแทรกที่เป็นไปได้ทั้งหมด

g <- function(x,            # Input vector of digits
              n=sum(x|1)    # Length of x
              ) {
  for(i in 0:n)             # i is the insertion point
    for(j in 0:9)           # j is a digit from 0 to 9
      # Dot product of vector of digits with insert and 10^(n:0) performs the
      # conversion to integer (and gets rid of the leading 0s)
      F=c(F,append(x,j,i)%*%10^(n:0))  # F is a non-reserved built-in alias to FALSE (numerically 0)
  F
}

ฟังก์ชั่นหลัก.

f <- 
function(a,                 # Input vectors of digits
         b,
         w=g(a),            # Get all possible insertions for a
         r=rep(g(b),e=1e4)  # Insertions for b replicated 1e4 times each
         )
  paste(w,r)[w+r==1e4]      # paste and w+r recycle w to match length of r
                            # Lots of duplication!

ฉันสังเกตุหลังจากที่ความจริงแล้วนี่เป็นตรรกะเดียวกันกับคำตอบของPyth



@JayCe บันทึกมากกว่า 10 ไบต์! การคัดลอกซ้ำสามารถทำได้นอกรหัสการท้าทาย
ngm


ลองฆ่าอีกไบต์ - ไม่ต้องการด้านนอกตัวแทนก็เพียงพอ
JayCe

ฉันคิดว่าเราใกล้จะแยกส้อมในอันนี้แล้ว!
ngm

3

Ruby , 93 91 ไบต์

->a,b{(1..r=10000).map{|x|/^(.*)(.*:)\1.?\2(.*)(.*):\3.?\4$/=~[a,x,b,y=r-x]*?:&&[x,y]}-[p]}

ลองออนไลน์!

ลองทุกหมายเลขมากถึง 10,000 และใช้ regex เพื่อตรวจสอบว่าหมายเลขตรงกันหรือไม่


2

เยลลี่ 30 ไบต์

DµJṬ€k€jþ9Ż¤;9R¤;€$ḌF)ŒpS=ȷ4ƊƇ

ลองออนไลน์!

ชนิดของเงอะงะเพราะวุ้นไม่มีการแทรก

คำอธิบาย

                                   Given [a, b].
Dµ                   )             Get [digits(a), digits(b)] then map:
  JṬ€k€jþ9Ż¤;9R¤;€$ḌF                Generate all the insertions.
                      Œp           Cartesian product: get all pairs.
                        S=ȷ4ƊƇ     Filter for: sum equal to ȷ4 (10000).

                       Given e.g. [6,3,5]:
J                      Get [1,2,3].
 Ṭ€                    Get [[1], [0,1], [0,0,1]].
   k€                  Split input with these: gets us
                         [[6],[3,5]] , [[6,3],[5]] , [[6,3,5],[]]
     jþ9Ż¤             Join table-wise with [0..9]
                         → [[[6,0,3,5], [6,3,0,5], [6,3,5,0]],
                            [[6,1,3,5], [6,3,1,6], [6,3,5,1]], …]
          ;9R¤;€$      Append the prefixings of the input by [1..9].
                           [[1,6,3,5], [2,6,3,5], [3,6,3,5]]…
                 ḌF    Undigits all, and flatten.

2

PHP, 162 159 ไบต์

ตัวอย่างที่น่ารักสำหรับฟังก์ชั่นเครื่องกำเนิดไฟฟ้า!

function f($n){for($n+=.1;$n>=1;$n/=10)for($d=-1;$d++<9;)yield strtr($n,".",$d)/10|0;}foreach(f($argv[1])as$x)foreach(f($argv[2])as$y)$x+$y-1e4||print"$x+$y\n";

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง พิมพ์ซ้ำ ทำงานด้วย-nr '<code>หรือลองออนไลน์


2

Pyth, 18 ไบต์

fqsT^;4*FsMvXLRRTT

สาธิต , ชุดทดสอบ (ชุดทดสอบจะซ้ำกับผู้นำ{)

อินพุตอยู่ในรูปแบบของรายการสองสตริง

XLRRTT: L และ R ดำเนินการแผนที่ซ้อนกัน เนื่องจากมี 3 ของพวกเขาเราจะดำเนินการแผนที่ซ้อนกัน triply ของXฟังก์ชั่น ในกรณีนี้Xฟังก์ชั่นจะแทรกตัวละครที่ตำแหน่งที่กำหนดลงในสตริง

Rสตริงคือการใส่ซึ่งเป็นนัยและวางไว้โดยครั้งแรก ตัวละครช่วงกว่าดังนั้นเราจึงมีตัวเลขแทรกเป็นไปได้ทั้งหมดและจะอยู่โดย0 ... 9 Lช่วงที่จะได้รับจากTที่มีการตั้งค่าโดยปริยายซึ่งได้รับการปฏิบัติโดยปริยายเป็น10 [0 ... 9]ตำแหน่งอยู่ในช่วง0 ... 9ซึ่งเพียงพอเพราะการแทรกตัวเลขหลังจากตำแหน่งที่ 10 จะไม่มีประโยชน์ ผลลัพธ์ซ้ำกันได้ดี ช่วงที่ถูกวางไว้โดยที่สองและได้รับโดยที่สองRT

v: สตริงการคาสต์ซ้อนไปยัง ints

sM: แผ่รายการระดับที่สองออกจากรายการหมายเลขที่เป็นไปได้ทั้งหมดหลังจากการแทรกหลักสำหรับแต่ละหมายเลขที่ป้อน

*F: นำผลิตภัณฑ์คาร์ทีเซียนของทั้งสองรายการของตัวเลขที่เป็นไปได้

fqsT^;4: 10000กรองคู่ผลิตภัณฑ์ที่มีคือ ;ใช้ค่าของ10ที่นี่ตามที่Tใช้เป็นตัวแปรตัวกรองและ;เป็นค่าของตัวแปรที่ใช้งานอยู่เสมอ


2

Japt , 30 29 25 23 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริงเอาต์พุตอาร์เรย์ของสตริง

£L²ôs f_à øX
rï k@L²aXx

ลองมัน


คำอธิบาย

£L²ôs f_à øX
£                :Map each X
 L               :  100
  ²              :  Squared
   ô             :  Range [0,L²]
    s            :  Convert each to a string
      f_         :  Remove elements that return false
        à        :    All combinations of current element
          øX     :    Contains X?
rï k@L²aXx
r                :Reduce by
 ï               : Cartesian product
   k@            :Remove each X that returns true (not 0)
     L²          :  100 squared
      a          :  Absolute difference with
        Xx       :   X reduced by addition

2

Javascript (Node) - 183 136 123 Bytes

123 Bytes ขอบคุณ Shaggy

a=>b=>(o={},g=(s,h)=>[...s+0].map((y,x)=>{for(y=10;y--;)h(s.slice(0,x)+y+s.slice(x))}))(a,x=>g(b,y=>1e4-x-y?0:o[+x]=+y))&&o

136 Bytes ขอบคุณ Arnauld

e=(h,c,i=h.length+1,j)=>{for(;i--;)for(j=10;j--;)c(h.slice(0,i)+j+h.slice(i))}
f=(a,b,c=[])=>e(a,n=>e(b,m=>1E4-n-m||c.push([+n,+m])))||c

รหัสเก่า

ไม่ภูมิใจกับมัน แต่คิดว่าฉันจะส่งต่อไป สร้างฟังก์ชั่นต้นแบบสตริงคล้ายกับแผนที่ซึ่งใช้เวลาเป็นจำนวนมากของไบต์ ฟังก์ชั่นวนซ้ำทั้งการเปลี่ยนลำดับและพบว่าเมื่อ 1,000-ab เท่ากับ 0 ใช้อินพุตเป็นสตริง

String.prototype.e=function(c){let h=this,L=h.length,i,j;for(i=0;i<=L;i++)for(j=0;j<=9;j++)c(h.slice(0,i)+j+h.slice(i,L));}
f=(a,b,c=[])=>a.e(n=>b.e(m=>1E4-n-m?c:c.push([+n,+m])))?c:c

ลองออนไลน์!

Ungolfed

String.prototype.e=function(c) {
  let h=this,L=h.length,i,j;
  for(i=0;i<=L;i++)
    for(j=0;j<=9;j++)
      c(h.slice(0,i)+j+h.slice(i,L));
}
f=(a, b, c=[]) =>
  a.e(n =>
    b.e(m =>
      1E4-n-m ? c : c.push([+n,+m])
    )
  ) ? c : c

นี่คือบางส่วนชัยชนะอย่างรวดเร็ว นี้นั้นเป็นรหัสเดียวกันโดยไม่ต้องงบ 'กอล์ฟที่ไม่เป็นมิตร ( String.prototype, function, let, this) และมีการเพิ่มประสิทธิภาพอื่น ๆ ไม่กี่
Arnauld

จากตรงนั้นคุณสามารถบันทึก4 ไบต์ได้มากขึ้นโดยใช้map()การforวนรอบนอกแทน NB: เหตุผลเดียวที่เราใช้jเป็นพารามิเตอร์ที่ 1 ของฟังก์ชั่นการโทรกลับคือเราต้องการให้มันถูกกำหนดไว้ในขอบเขตนี้
Arnauld

@ Arnauld ขอบคุณฉันขอบคุณจริงๆคุณเป็นคนในตำนาน โพสต์คำตอบของคุณสรรพสิ่งฉันไม่ต้องการที่จะเอาของคุณฉันแค่ทำเพื่อความสนุก
Asleepace

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

ข้อเสนอแนะของ Knocked @ Arnauld ลดลงเหลือ123 ไบต์
Shaggy

1

เยลลี่ 23 ไบต์

œcL’$$€ċ"⁹o⁼"Ạ
ȷ4ḶṚĖDçƇ

ลิงก์ monadic ยอมรับรายการของตัวเลข
(เช่นตัวอย่างของ 923 และ 72 อินพุต[[9,2,3],[7,2]])

ลองออนไลน์! (ส่วนท้ายทำให้เป็นดังนั้น I / O คือคู่ของจำนวนเต็มสองจำนวนในและรายการ [จัดรูปแบบ] ของจำนวนเต็มคู่ออกไป)

หรือดูการทดสอบในตัว

อย่างไร?

ตรวจสอบคู่ทั้งหมดของ "หมายเลข" (รายการของตัวเลข) ซึ่งรวมถึง 10,000 เพื่อความถูกต้องโดยสร้างทุกวิธีในการเลือก n-1 หลักจาก "ตัวเลข" เหล่านั้นเพื่อรักษาลำดับ และเก็บรักษาสิ่งที่ถูกต้อง (ในกรณีที่ความถูกต้องยังอนุญาตให้ "หมายเลข" ภายใต้การทดสอบเท่ากับ "หมายเลข" ดั้งเดิม)

œcL’$$€ċ"⁹o⁼"Ạ - Link 1, is piar valid?: pairToCheck, originalInputPair
      €        - for each list of digits in pairToCheck: e.g. [9,2,3]
     $         -   last two links as a monad:
    $          -     last two links as a monad:
  L            -       length                                 3
   ’           -       decremented                            2
œc             -     choices of that many items               [[9,2],[9,3],[2,3]]
         ⁹     - chain's right argument (originalInputPair)
        "      - zip with: (i.e. apply the following f(x,y) *respectively* across the results above and the originalInputPair)
       ċ       -   count occurrences
            "  - zip with (this time with an implicit right argument of originalInputPair)
           ⁼   -   equal (non-vectorising version)
          o    - locgical OR (vectorising version) i.e. we now have: [OR(isOneDigitLonger(item1),isEqual(item1)), OR(isOneDigitLonger(item2),isEqual(item2))]
             Ạ - all?

ȷ4ḶṚĖDçƇ - Main Link: list (pair) of lists of digits
ȷ4       - literal 10^4 -> 10000
  Ḷ      - lowered range -> [0,1,2,...,9998,9999]
   Ṛ     - reversed -> [9999,9998,...,2,1,0]
    Ė    - enumerate -> [[1,9999],[2,9998],...,[9998,2],[9999,1],[10000,0]] (N.B. last is redundant, but this does not matter)
     D   - to decimals -> [[[1],[9,9,9,9]],[[2],[9,9,9,8]],...,[[9,9,9,8],[2]],[[9,9,9,9],[1]],[[1,0,0,0,0],[0]]]
       Ƈ - filter keep those for which this is truthy:
      ç  -   call last link as a dyad (with a right argument of the pair of lists of digits)


1

ถ่าน 33 ไบต์

ΦE×χφI⟦ι⁻×χφι⟧⌊Eι№E⊕LλΦλ⁻ξρ§⟦θη⟧μ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

   χ                                10
    φ                               1000
  ×                                 Multiply
 E                                  Map over implicit range
       ι    ι                       Current value
        ⁻×χφ                        Subtract from 10000
      ⟦      ⟧                      Pair of values
     I                              Cast to string
Φ                                   Filter
                ι                   Current pair
               E                    Map
                     λ              Current value
                    L               Length
                   ⊕                Increment
                  E                 Map over implicit range
                       λ            Current value
                      Φ             Filter over characters
                         ξ          Range value
                          ρ         Character index
                        ⁻           Subtract
                            ⟦θη⟧    Original inputs as a list
                                μ   Index of current value
                           §        Get input at that index
                 №                  Count matching values
              ⌊                     Minimum
                                    Implicitly print each pair double-spaced

ในกรณีที่คุณไม่เข้าใจว่าจะมีคู่ของค่าทั้งหมดที่เพิ่มไปที่ 10,000 (เป็นสตริง) จากนั้นนับจำนวนแต่ละอินพุตที่ตรงกับผลลัพธ์ของการลบอักขระสูงสุด 1 ตัวจากค่าที่เกี่ยวข้อง หากการนับขั้นต่ำไม่ใช่ศูนย์ดังนั้นทั้งสองอินพุตจับคู่และนี่เป็นวิธีแก้ปัญหาที่เป็นไปได้


1

Python 3, 165 160 153 125 117 ไบต์

  • บันทึก 5 ไบต์ด้วยคำแนะนำ @JackBrounstein เพื่อลบออกsetจากค่าส่งคืนเนื่องจากเอาต์พุตสามารถมีรายการซ้ำได้
  • ที่บันทึกไว้ 7 โดยการแทนที่ด้วย range(len(s))range(5)
  • บันทึกแล้ว 23 ไบต์ด้วยคำแนะนำของ @Eric Duminil เพื่อแทนที่itertoolsด้วยความเข้าใจในรายการแบบซ้อน (และการลบช่องว่าง)
  • บันทึก 8 ขอบคุณคำแนะนำของ @Jo King เพื่อแทนที่ความเข้าใจในรายการแบบซ้อนด้วยตัววนซ้ำและตัวดำเนินการโมดูลัส

การใช้itertoolsและฟังก์ชั่นตัวช่วยอย่างง่าย ยอมรับสตริงเป็นอินพุตส่งคืนชุดของ int เป็นเอาต์พุต

c=lambda s:[int(s[:i%5]+str(i//5)+s[i%5:])for i in range(50)]
lambda a,b:{(i,j)for i in c(a)for j in c(b)if i+j==1e4}

1
เนื่องจากเอาต์พุตสามารถรวมรายการที่ซ้ำกันคุณจึงไม่จำเป็นต้องโทรsetในบรรทัดสุดท้ายเป็น -5 ไบต์
Jack Brounstein

@ JackBrounstein ขอบคุณ ฉันพลาดกฎส่วนนั้นไป
2699

@EricDuminil ขอบคุณ ฉันไม่รู้เกี่ยวกับเซตความเข้าใจนั่นเป็นกลลวงที่เรียบร้อย
user2699


1
@JoKing Clever หลังจากคำแนะนำเหล่านี้การแก้ปัญหาแทบจะไม่คล้ายกับสิ่งที่ฉันเริ่มต้นด้วย
2699

1

Ruby , 110 ไบต์

ยอมรับสตริงเป็นอินพุตส่งคืนอาร์เรย์ของจำนวนเต็ม

อ้างอิงจากเวอร์ชั่นไพธ อน สำหรับจำนวนเต็มที่กำหนดให้Cสร้างอาร์เรย์ของตัวเลขที่สามารถสร้างได้โดยการเพิ่มตัวเลข

แลมบ์ดาวนซ้ำทุกคู่ที่เป็นไปได้และเลือกอันที่มีผลรวมเท่ากับ 10,000

C=->n{(0..49).map{|i|([n[0...i%5],i/5,n[i%5..-1]]*'').to_i}}
->(a,b){C[a].product(C[b]).select{|i,j|i+j==1e4}}

ลองออนไลน์!


1

05AB1E (ดั้งเดิม) , 36 ไบต์

0ìε.œʒg3‹}εU9ÝεXDgiìësý}}}˜}`âʒOT4mQ

สามารถเล่นกอล์ฟได้อย่างไม่ต้องสงสัยอย่างมาก .. โดยเฉพาะการใส่ตัวเลข

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด (êในส่วนท้ายคือ Uniquify & เรียงลำดับ)

คำอธิบาย:

0ì                            # Prepend a 0 before each of the input numbers
  ε                        }  # Map each to:
                            #  Take all possible partitions
     ʒg3‹}                    #  Only keep those of length 1 or 2
          ε              }    #  Map each partition to:
           U                  #   Pop and store the partition in variable `X`
            9Ý                #   List in the range [0, 9]
              ε         }     #   Map each of those digits to:
               X              #    Get the variable `X`
                Dgi           #    If it's a single number (length == 1):
                   ì          #     Prepend `X` before this digit
                  ë           #    Else (length == 2):
                   sý         #     Join both numbers in `X` with the current digit
                  }           #    Close the if-else
                          ˜   #   Flatten the list of lists
`                             # Now push both lists to the stack
 â                            # Create all possible pairs (cartesian product)
  ʒ                           # Filter this list of pairs by:
   O                          #  Take the sum of the two numbers
    T4m                       #  Push 10000 (10^4)
       Q                      #  And check if they are equal

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