สร้างตัวเลขที่ใหญ่ที่สุดและเล็กที่สุด


13

แรงบันดาลใจจากโพสต์นี้ใน Puzzling สปอยเลอร์สำหรับจิ๊กซอว์นั้นอยู่ด้านล่าง

กำหนดจำนวนเต็มบวกสามค่าเป็นอินพุต(x, y, z)สร้างช่วงที่รวม[x, y]กันเชื่อมช่วงนั้นเข้าด้วยกันจากนั้นลบzตัวเลขที่ไม่จำเป็นต่อเนื่องเพื่อสร้างจำนวนเต็มบวกที่ใหญ่ที่สุดและเล็กที่สุดเท่าที่จะเป็นไปได้ ไม่อนุญาตเลขนำหน้า (เช่นตัวเลขต้องขึ้นต้นด้วย[1-9]) เอาท์พุทตัวเลขทั้งสองในลำดับใด

ยกตัวอย่างเช่นจากการโพสต์น่าสงสัยสำหรับการป้อนข้อมูล(1, 100, 100)จำนวนที่ใหญ่ที่สุดที่เป็นไปได้99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100,
และจำนวนที่น้อยที่สุดคือ10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100,
ต่อไปด้านล่างตรรกะจากjafe ของคำตอบโพสต์ที่นั่น

  • เราไม่สามารถมีอิทธิพลต่อความยาวของตัวเลข (มีจำนวนหลักคงที่) ดังนั้นเพื่อเพิ่มค่าสูงสุดที่เราใช้กับตัวเลขสูงสุดแรกจากนั้นก็เป็นตัวเลขหลักที่สองเป็นต้น
  • ลบ 84 ไม่ใช่ nonines แรก (เหลือ 16 หลักเพื่อลบ): 999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • ตัวเลขที่ใหญ่ที่สุดใน 17 หลักถัดไปคือ 7 ดังนั้นจากที่นี่ตัวเลขถัดไปในคำตอบสามารถมีได้สูงสุด 7 (เราไม่สามารถลบมากกว่า 16 หลัก) ดังนั้นลบ 15 non-7's ... (เหลือ 1 หลักเพื่อลบ):999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • จากที่นี่ตัวเลขถัดไปสามารถมีได้สูงสุด 8 หลักดังนั้นลบหนึ่ง non-8 ออกจากตรงกลาง 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • ตรรกะที่คล้ายกัน แต่กลับด้าน (เช่นเราต้องการลีดเดอร์1s แทน9ลีดเดอร์) สำหรับจำนวนที่น้อยที่สุด

(1, 10, 5)นี่เป็นตัวอย่างที่มีขนาดเล็กลง

เราสร้างช่วง12345678910และกำหนดว่า5เราสามารถลบตัวเลขใดที่มีจำนวนมากที่สุด เห็นได้ชัดว่านั่นหมายความว่าเราต้องการเพิ่มตัวเลขนำหน้าให้ได้มากที่สุดเนื่องจากเราไม่สามารถมีอิทธิพลต่อความยาวของเอาต์พุต ดังนั้นถ้าเราลบ12345เราจะเหลือ678910และนั่นคือสิ่งที่ใหญ่ที่สุดที่เราสามารถทำได้ การทำให้สิ่งที่เล็กที่สุดนั้นเป็นเรื่องที่ยากขึ้นเพราะเราสามารถถอนตัวเลขออกจากตรงกลางแทน123410ได้

สำหรับ(20, 25, 11)ผลที่ได้คือค่อนข้างน่าเบื่อเป็นและ51

สุดท้ายที่จะออกกฎคำตอบที่พยายามศูนย์ชั้นนำ(9, 11, 3)ให้91011ซึ่งอัตราผลตอบแทนในการเปิด91และ10เป็นที่ใหญ่ที่สุดและมีขนาดเล็กที่สุด

I / O และกฎ

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

รายการตัวเลขเป็นที่ยอมรับในฐานะเอาท์พุท?
ร็อด

กรณีทดสอบที่จะให้ค่าต่ำสุดปลอมเมื่อประเมินผู้ที่มีเลขศูนย์นำหน้าอาจคุ้มค่า - ฉันคิดว่า9, 11, 3น่าจะทำ
โจนาธานอัลลัน

@ Rod Yep รายการของตัวเลขเป็นเรื่องปกติสำหรับการส่งออก
AdmBorkBork

@ เร็วฉันไม่รู้สิ่งที่คุณกำลังพูดถึง ;-)
AdmBorkBork

@ JonathanAllan โทรดีมาก ที่เพิ่ม
AdmBorkBork

คำตอบ:


5

Haskell , 162 ไบต์

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

ลองออนไลน์!

ใช้อัลกอริทึมที่อธิบายโดย jafe อาจสั้นกว่านี้เพื่อใช้วิธีที่มีประสิทธิภาพน้อยลง แต่นี่สนุกกว่าการเขียน :)

การ%ดำเนินการใช้เวลา 4 ข้อโต้แย้ง (จริง 3 แต่อะไรก็ตาม): mซึ่งเป็นฟังก์ชั่นที่เลือกสมาชิก "ดีที่สุด" จากรายการ (อย่างใดอย่างหนึ่งmaximumหรือminimumขึ้นอยู่กับสิ่งที่เราต้องการ); fซึ่งเป็นฟังก์ชั่น "ตัวกรอง"; nจำนวนหลักที่เหลือเพื่อดรอป และsสตริง ก่อนอื่นเราตรวจสอบว่า n เท่ากับจำนวนตัวเลขที่เหลือในสตริง (ฉันใช้>=เพื่อความปลอดภัย) และวางส่วนที่เหลือsถ้าเป็นเช่นนั้น มิฉะนั้นเราจะตรวจสอบว่าเรายังต้องวางตัวเลข ( n>0) จากนั้นเราใช้spanเพื่อแยกสตริงของเราออกเป็นสามส่วน: pตัวเลขที่จะลดลงตัวเลขcที่เข้าถึงได้ดีที่สุดและrสตริงที่เหลือ เราทำสิ่งนี้โดยการส่งคำกริยาที่ตรวจสอบความเท่าเทียมกันกับตัวเลขที่ดีที่สุดของเรา ในการค้นหาตัวเลขนั้นเราใช้n+1ตัวเลขตัวแรกของสตริงกรองจากนั้นส่งผ่านไปยังฟังก์ชัน "ตัวเลือก" ของเรา ตอนนี้เราก็ให้ผลผลิตหลักที่ดีที่สุดและการกลับของเราลบความยาวของp(จำนวนตัวเลขลดลง) nจาก แจ้งให้ทราบว่าเราไม่ได้ผ่านฟังก์ชั่นการกรองของเราที่จะโทร recursive idและแทนเราแทนที่ด้วย นั่นเป็นเพราะตัวกรองอยู่ที่นั่นเพียงเพื่อหลีกเลี่ยงการเลือก 0 นำในminimumกรณีที่เกี่ยวข้องเฉพาะในการทำซ้ำครั้งแรก หลังจากนั้นเราไม่ต้องการตัวกรองอีกต่อไป

%เป็นจริงเท่านั้นฟังก์ชั่นช่วยสำหรับการ#ซึ่งเป็นของเรา "ของจริง" ฟังก์ชั่นการx, และy zเราใช้ความเข้าใจในรายการเพียงเพื่อหลีกเลี่ยงการทำซ้ำซ้ำ ๆ ทำซ้ำสิ่งอันดับฟังก์ชั่นของเราและส่งพวกเขาไป%พร้อมกับzและสตริงที่ต่อกัน สตริงที่สร้างขึ้นโดยใช้ผู้ประกอบการ monad มายากลซึ่งในบริบทนี้ทำงานเหมือน(=<<)concatMap


3

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

r/VDœcL_¥¥ḷ/ƇVṢ.ị

ลองออนไลน์!

คำนวณความเป็นไปได้ทั้งหมดจากนั้นให้ใหญ่ที่สุดและเล็กที่สุด

อาร์กิวเมนต์ซ้าย: x,yเพื่อสร้างช่วง อาร์กิวเมนต์ที่ถูกต้อง: zตัวเลขที่จะลบ

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.

2

Python 2 , 143 ไบต์

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

ลองออนไลน์!

วิธีนี้ใช้งานได้โดยการคำนวณชุดค่าผสมทั้งหมดของขนาดเป้าหมาย (ลำดับขององค์ประกอบจะได้รับการเก็บรักษาไว้) และรับจำนวนที่น้อยที่สุด / มากที่สุด


โอ้ ... ฉันเดาว่ามันใช้ได้นะ ฉันพยายามอย่างหนักจริงๆในการสร้างโปรแกรมที่คำนวณได้จริง
Don Thousand

@RushabhMehta การคำนวณกำลังของสัตว์เดรัจฉานยังคงช้าอยู่
dylnan

2

Charcoal , 56 ไบต์หรือ 21 + 46 35 = 67 56 ไบต์

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

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

≔⪫…·NNωθ

ใส่xและyสร้างช่วงรวมและเข้าร่วมตัวเลขลงในสตริง

FN

วนหนึ่งครั้งเพื่อลบแต่ละหลัก

≔⌈EθΦθ⁻λνθ

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

θ

พิมพ์ผลลัพธ์

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

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

≔⪫…·NNωθ

ใส่xและyสร้างช่วงรวมและเข้าร่วมตัวเลขลงในสตริง

F⊕N⊞υω

ใส่zและเพิ่มมัน จากนั้นฉันจะสร้างรายการความยาวนั้น: ฉันต้องสามารถเพิ่มขึ้นzภายในตัวกรองต่อไปนี้ แต่อนุญาตเฉพาะคำสั่งเพื่อเพิ่มตัวแปรเท่านั้น มีช่องโหว่ในการPushOperatorเพิ่มความยาวของรายการ

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

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

อัลกอริทึมที่เร็วกว่าคือ 30 ไบต์เมื่อใช้เพื่อคำนวณจำนวนที่เป็นไปได้มากที่สุด:

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: ฉันได้รวมสองรายการด้านบนเข้ากับโซลูชัน 56 ไบต์ที่สองซึ่งสร้างผลลัพธ์ทั้งสอง:

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

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

≔⪫…·NNωθ

สร้างสตริงเริ่มต้น

F⊕N⊞υω

แสดงz+1เป็นความยาวของรายการ

≔⮌υη

ย้อนกลับรายการจึงทำการโคลนและบันทึกผลลัพธ์

พิมพ์ผลลัพธ์สองรายการในบรรทัดแยกกัน (อีกวิธีหนึ่งในการทำเช่นนี้คือการแยกผลลัพธ์ด้วย\rอักขระตามตัวอักษร)

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

สร้างจำนวนมากที่สุดที่เป็นไปได้

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

zสร้างจำนวนน้อยที่สุดโดยใช้รายการโคลนในการติดตาม



1

05AB1E , 16 ไบต์

ŸSDg³-.Æʒ¬Ā}{Ć`‚

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ, การอ่านปัจจัยการผลิตในลำดับนี้: Y, X, Z ส่งออกรายการอักขระสองรายการ

คำอธิบาย

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)

โอ้Ć`‚เป็นคนฉลาดคำตอบที่ดี!
Kevin Cruijssen

0

Matlab, 95 ไบต์

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

ลองออนไลน์!

ส่งคืนเมทริกซ์ 1x2 ที่มีค่า min และ max

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

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.