ฉันต้องการกระดาษแข็งกี่หลัก?


32

ฉันต้องเตรียมตัวเลขที่ทำจากกระดาษแข็งเพื่อแสดงตัวเลข ( ตัวอย่าง ) ผมไม่ทราบว่าก่อนซึ่งจำนวนที่ฉันควรแสดง - nสิ่งเดียวที่ฉันรู้ก็คือว่ามันไม่เกิน

ฉันควรเตรียมกระดาษแข็งกี่หลัก

ตัวอย่าง: n = 50

ในการแสดงตัวเลขใด ๆ ในช่วง 0 ... 50 ฉันต้องการตัวเลขต่อไปนี้:

  1. ศูนย์สำหรับการแสดงหมายเลข 0 หรือหมายเลขรอบอื่น ๆ
  2. สำเนาสองชุดของตัวเลข 1, 2, 3 และ 4 เพื่อแสดงตัวเลขที่เกี่ยวข้อง
  3. สำเนาหนึ่งชุดของตัวเลข 5, 6, 7 และ 8 สำหรับกรณีที่ปรากฏเป็นเลขนัยสำคัญน้อยที่สุดในจำนวนนั้น
  4. ไม่จำเป็นต้องใช้เลข 9 เพราะฉันสามารถใช้เลข 6 กลับด้านแทนได้

รวม: 13 หลัก

กรณีทดสอบ (แต่ละบรรทัดเป็นกรณีทดสอบในรูปแบบ "อินพุต; เอาท์พุท")

0 1
1 2
9 9
11 10
50 13
99 17
100 18
135 19
531 22
1,000 27
8192 34
32767 38

2
สามารถหมุนตัวเลขอื่น ๆ นอกเหนือจาก 6/9 ได้หรือไม่?
feersum

ไม่ (ดูตัวอย่าง)
Anatolyg

ดังนั้นสอง 1 ไม่สามารถซ้อนทับเพื่อสร้าง 7 ในขณะนั้น
user253751

2
... และเลขศูนย์สองตัวไม่สามารถสร้าง 8. นั่นน่าเกลียด
Anatolyg

อาจเป็นคำถามที่น่าอึดอัดใจ แต่เนื่องจากตัวเลขเหล่านี้เป็น 'กระดาษแข็ง' จึงสามารถพิมพ์สองด้านเพื่อประหยัดค่าใช้จ่ายตามที่ต้องการทั้งหมดได้หรือไม่? ในตัวอย่างคุณไม่จำเป็นต้องมี 6 และ 0 ร่วมกันตัวอย่างเช่น
Weckar E.

คำตอบ:


16

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

‘ḶDœ|/ḟ9L

ลองออนไลน์!

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

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length

14
เร็วเกินไป>. <ฉันสาบานคุณมีคำตอบของ Jelly สำหรับทุกความท้าทายที่รู้จักในจักรวาลและคุณมีบอทที่จะโพสต์พวกเขาทันทีหลังจากการท้าทาย : P คำตอบที่ดี
HyperNeutrino

10
@HyperNeutrino ฉันคิดว่าบอตสกัดการทดสอบจากความท้าทายและลองใช้โปรแกรมเยลลี่ทุกอย่างที่เป็นไปได้ด้วยซูเปอร์คอมพิวเตอร์
NieDzejkob

1
@HyperNeutrino คุณจะรู้ว่าความรู้สึก ... 0rDŒr€ẎQṪÞẎḟ9ĠẎLโดยเฉพาะอย่างยิ่งถ้าการแก้ปัญหาของคุณ
Erik the Outgolfer

ฉันสงสัยความถูกต้องของส่วนḟ9สักครู่จากนั้นฉันก็ตระหนักถึง 6 <9 ดังนั้นจำนวน 6s จึงต้องไม่น้อยกว่าจำนวน 6s และ 9 ที่เป็นไปได้ทั้งหมดที่รวมกันในการรวมกัน
Nader Ghanbari

7

Python 2 , 49 ไบต์

lambda n:9*len(`n`)-9+(n*9+8)/10**len(`n`)+(n<10)

ลองออนไลน์!

สูตรเลขคณิตเงอะงะ สมมติว่าnเหมาะสมภายในintเพื่อที่Lไม่ได้ถูกผนวกเข้าด้วยกัน

ขอบคุณ Neil สำหรับการบันทึก 5 ไบต์โดยการชี้ให้เห็นว่าการไม่ได้ใช้งานของ 9 นั้นสามารถทำได้โดยการทำn*9+8แทนแทนที่จะn*9+9บอกว่า999*9+8=8999จะไม่หมุนไปถึง 9000


@ovs มันใช้งานไม่ได้มันยังไม่พอที่จะรู้เลขตัวแรก ตัวอย่างเช่น33333ต้องการห้า 3 แต่22222ต้องการเพียงสี่ n*9[0] เป็นที่ดึงดูด แต่ล้มเหลวสำหรับตัวเลขเริ่มต้นด้วยและน้อยกว่าที่1 111..
xnor

โดยการคำนวณของฉัน (ดูคำตอบชุดของฉัน) คุณอาจจะสามารถใช้หลีกเลี่ยงการใช้(n*9+8)/10**len(`n`) min
Neil

7

Haskell , 117 114 108 95 89 88 87 84 82 63 ไบต์

บันทึกได้ 6 ไบต์ขอบคุณ Laikoni

1 4 6 ไบต์ได้รับการบันทึกขอบคุณ nimi

g x=sum[maximum[sum[1|u<-show y,d==u]|y<-[0..x]]|d<-['0'..'8']]

ลองออนไลน์!


3
1. ) เป็นเช่นเดียวกับmaximum[a,b] max a b2. ) รายการความเข้าใจมักสั้นกว่าfilter:max d$sum[1|x<-show a,x==b]
Laikoni

1
คุณสามารถแทนที่gด้วยฟังก์ชั่นที่แท้จริง sum.(#[-9..])pointfree:
nimi

@nimi ฉันไม่ทราบว่าฟังก์ชั่น pointfree คืออะไร แต่ฉันคิดว่าฉันเห็นสิ่งที่คุณกำลังแนะนำ บอกฉันถ้าฉันผิด
ข้าวสาลีตัวช่วยสร้าง

1
... และเป็นlength[x|x<-...] sum[1|x<-...]
nimi

1
สามารถยกเลิกการตั้งชื่อฟังก์ชั่นได้ดังนั้นจึงไม่จำเป็นต้องใช้g=(แต่คุณอาจต้องการรวมไว้ในเวอร์ชั่น TIO)
nimi


5

JavaScript (ES6), 60 53 ไบต์

f=(n,i=9)=>n>(i%9+1+"e"+(i/9|0))/9-1?1+f(n,-~i):n>9^1

วิธีแก้ปัญหาแบบเรียกซ้ำ สิ่งนี้จะสร้างตัวเลขที่ต้องเพิ่มตัวเลข:

1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 22, 33, 44, 55, 66, 77, 88, 100, 111, 222, ...

แล้วนับว่ามีจำนวนน้อยกว่าอินพุท ด้วยปาฏิหาริย์ที่มีความสุขการลบตัวเลข9นั้นจะลบหลายไบต์ออกจากฟังก์ชันเนื่องจากลำดับนั้นสามารถสร้างขึ้นได้เช่นนั้น (สมมติว่าการหารจำนวนเต็ม):

1e1 / 9 = 1, 2e1 / 9 = 2, ..., 8e1 / 9 = 8, 9e1 / 9 = 10, 1e2 / 9 = 11, 2e2 / 9 = 22, ...

เราต้องคำนึงถึงความจริงที่ว่าตัวเลขที่ต่ำกว่า 10 ยังคงต้องการศูนย์ แต่นี่เป็นเรื่องง่ายเหมือนการเพิ่มn > 9 ? 0 : 1ไปยังผลลัพธ์

กรณีทดสอบ


n>9^1สามารถเป็นได้n<10
CalculatorFeline

@CalculatorFeline ดีที่ให้trueสำหรับการป้อนข้อมูล0ดังนั้นฉันลังเลที่จะทำเช่นนั้น
ETHproductions

0>9เป็นเท็จfalse^1คือ 1 ...
CalculatorFeline

@CalculatorFeline ใช่ฉันพูดฉันลังเลที่จะเอาท์พุทบูลในสถานที่ของจำนวนtrue 1
ETHproductions

4

แบตช์ 67 ไบต์

@if %1 geq 10%2 %0 %1 0%2 -~%3
@cmd/cset/a(%1*9+8)/10%2+9*%30+!%30

ในการกำหนดมาตรฐานของปัญหานี้คุณต้องแยก6และ9ตัวเลข 0แต่คุณไม่จำเป็นต้องแสดงผล เมื่อค่าสูงสุดที่nต้องการเพิ่มขึ้นจำนวนของตัวเลขที่ต้องการจะเพิ่มขึ้นทุกครั้งที่คุณไปถึง repdigit (เพราะคุณมีตัวเลขไม่เพียงพอ) และทุกครั้งที่คุณมีกำลังถึง10(เมื่อคุณต้องการศูนย์พิเศษ) โดยรวมแล้วแต่ละกำลังของ10ความต้องการ10ตัวเลขมากกว่าจำนวนก่อนหน้านี้ซึ่งสามารถนำมาคำนวณfloor(log10(n))*10ได้ สำหรับค่าnระหว่างอำนาจของ 10 จำนวน repdigits กลางนั้นจะสามารถคำนวณเป็นหรืออีกวิธีหนึ่งfloor(n/((10**floor(log10(n))*10-1)/9))floor(n*9/(10**floor(log10(n))*10-1))

ฉันคำนวณfloor(log10(n))โดยใช้ลูปในบรรทัดแรก แต่ละครั้ง%2จะได้รับเพิ่ม0และ%3ได้รับเพิ่ม-~ขึ้น ซึ่งหมายความว่า10%2เป็น10*10**floor(log10(n))และเป็น%30floor(log10(n))

ซ้ำของ6และ9มีผลสองประการคือประการแรกมีเพียง9เลขที่จำเป็นสำหรับการใช้พลังงานของแต่ละ10และประการที่สองความต้องการการตรวจสอบ repdigit ที่จะไม่สนใจ9repdigits โชคดีที่พวกเขาเป็นหนึ่งในน้อยกว่าพลังของ 10 floor((n*9+8)/(10**floor(log10(n))*10))นี้สามารถทำได้โดยการปรับเปลี่ยนสูตรที่จะทำให้เกิด

การจัดการกับศูนย์คือเหตุผลง่ายๆ: เพียงแค่นี้ต้องมีเลขพิเศษเมื่อคือn<10floor(log10(n))==0




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