ศูนย์รวมความท้าทายชั้นนำ


31

ความท้าทาย

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

กฎระเบียบ

  • หากxมีมากกว่าyตัวเลขเอาท์พุทxเป็นสตริงโดยไม่มีการดัดแปลง

  • ไม่ยอมรับเอาต์พุตเป็นจำนวนเต็มแม้ว่าจะไม่มีเลขศูนย์นำหน้า

  • เมื่อxใดที่เป็นลบให้รักษา-ตามที่เป็นและดำเนินการกับค่าสัมบูรณ์

  • ค่าลบyควรถือเป็น 0 ซึ่งหมายความว่าคุณแสดงผลxตามที่เป็น (แต่เป็นสตริง)

ตัวอย่าง:

IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"

รหัสที่สั้นที่สุดในการชนะไบต์ใช้ช่องโหว่มาตรฐาน



1
ฉันสามารถใช้ x เป็นสตริงได้หรือไม่?
LiefdeWen

อะไร(-1,1)ให้
อดัม

@ Adámเพิ่มไว้ในตัวอย่าง
Brian H.

1
+เครื่องหมายนำหน้าเป็นที่ยอมรับสำหรับจำนวนบวกหรือไม่
Tom Carpenter

คำตอบ:


4

Japt , 13 8 ไบต์

รับอินพุตแรก ( x) เป็นสตริง

®©ùTV}'-

ลองมัน

บันทึกขนาดใหญ่ 5 ไบต์ด้วย ETHproductions


คำอธิบาย

การป้อนข้อมูลโดยนัยของสตริงและจำนวนเต็มU=xV=y

® }'-แยกออกUเป็นอาเรย์บนสัญลักษณ์ลบแผนที่เหนือมันและเข้าร่วมอีกครั้งกับสตริงที่มีสัญลักษณ์ลบ

©เป็นตรรกะและ ( &&) ดังนั้นหากองค์ประกอบปัจจุบันเป็น truthy (สตริงไม่ว่างเปล่า) แล้วแผ่นซ้าย ( ù) 0 ( T) Vความยาว


ทำได้ดีนี่! คุณสามารถบันทึกได้ไม่ยากเพียงแค่ทำแผนที่รอบ ๆ-: ethproductions.github.io/japt/…
ETHproductions

@ETHproductions: เยี่ยมมาก ขอบคุณ นานมาแล้วตั้งแต่ฉันทำไปแล้วฉันลืมไปเลยว่าคุณสามารถแยกแผนที่และเข้าร่วมสตริงได้ในวิธีเดียว!
Shaggy

ใช่ฉันคิดว่าควรย้ายการทำงานไปqที่ซึ่งจะเป็นการq-_©ùTVบันทึก 1 ไบต์ :-)
ETHproductions

@ ETHproductions ถ้าฉันเข้าใจถูกต้องคุณแนะนำว่าถ้าฟังก์ชั่นถูกส่งผ่านเป็นอาร์กิวเมนต์ที่สองของS.q()(ให้เราS.q(s,f)) แล้วSจะถูกแยกออกsวิ่งผ่านfและเข้าร่วมด้วยsหรือไม่ ฉันชอบมัน! :)
Shaggy

ใช่ฉันไม่พูดคุยกับโอลิเวอร์และไม่เกี่ยวกับการทำนั้น (ถ้าผ่านฟังก์ชั่นการทำงานที่ทำปกติวิ่งผ่านฟังก์ชั่นและยกเลิกการเปลี่ยนแปลงครั้งแรก; N.s, S/A.y, N.ìทำเช่นนี้แล้ว) กับพวงของวิธีการหรือไม่? ฉันได้สนทนากับใครบางคนฉันจำไม่ได้ว่าตอนนี้ใคร: s
ETHproductions



6

05AB1E , 11 10 ไบต์

อินพุตที่ได้รับเป็น amount_of_digits, number

ÎIÄg-×ì'-†

ลองออนไลน์!

คำอธิบาย

Î            # push 0 and first input
 IÄ          # push the absolute value of the second input
   g         # length
    -        # subtract, (input1-len(abs(input2))
     ×       # repeat the zero that many times
      ì      # prepend to the second input
       '-†   # move any "-" to the front

ดูเหมือนว่านี่คือคำตอบที่ชนะถ้าไม่ได้ดีขึ้นในวันพรุ่งนี้ฉันจะยอมรับมัน
Brian H.

คุณได้รับการ outgolfed :(
Brian H.

@BrianH แน่นอนฉันมี :)
Emigna




5

JavaScript (ES6), 42

วนซ้ำพารามิเตอร์ตามลำดับย้อนกลับก่อนอื่น y แล้ว x และแกงกะหรี่

y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

ทดสอบ

var F=
y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

;`IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"`
.split(`\n`).map(r => r.match(/[-\d]+/g))
.forEach(([x,y,k])=>{
  o = F(y)(x)
  ok = o == k
  console.log(ok?'OK':'KO',x,y,'->', o)
})


ในขณะที่ที่น่าประทับใจผมรู้สึกว่าคำตอบนี้กระโปรงกฎเล็กน้อยด้วยการกำหนดฟังก์ชั่นแทนf(y)(x) f(x,y)
styletron

การอ่านกฎ "การแกง" ฉันต้องการเพิ่มว่าการคัดค้านของฉันมีมากขึ้นด้วย params ที่กลับด้านและไม่ใช่การแกง
styletron

1
@styletron ลำดับของพารามิเตอร์ไม่ได้ระบุไว้ในการท้าทาย ดังนั้นฉันสามารถใช้ประโยชน์จากสิ่งนี้
edc65

แดงเข้าy=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)มาใกล้แล้ว ...
ETHproductions

ฉันไม่มีปัญหากับคนที่ย้อนกลับคำสั่งซื้อ
Brian H.

5

Python 3.6 , 28 37 bytes

lambda x,y:f'{x:0{(y,0)[y<0]+(x<0)}}'

ลองออนไลน์! (กรณีทดสอบจากคำตอบของ Colera Su)

การใช้ประโยชน์จากวิธีใหม่ในการจัดรูปแบบสตริงใน python 3.6

+9 ไบต์เพื่อจัดการ y<0


ดูเหมือนว่าสิ่งนี้จะล้มเหลวเมื่อyมีค่าเป็นลบ: tio.run/##K6gsycjPM/…
Shaggy

จริง ดังนั้นฉันจึงมีขนาด 37 ไบต์
Lescurel

5

bash, 27 , 25 ไบต์

-2 ไบต์ต้องขอบคุณ Bruce Forte

printf %0$[$2+($1<0)]d $1

ลองออนไลน์


1
คุณสามารถบันทึกสองไบต์ได้โดยการกำหนดความยาวของช่องว่างภายใน ยังมีอีกหนึ่งที่น่าสนใจ (28 printf %\ 0$[1+$1]d $2|xargsไบต์):
იოო

บางทีคุณอาจหมายความว่าprintf %\ 0$[1+$2]d $1|xargsฉันจำรูปแบบนี้ไม่ได้สำหรับหมายเลขที่เซ็นชื่อและเคล็ดลับ xargs ในการลบพื้นที่นำ
Nahuel Fouilleul

5

Huskขนาด 12 ไบต์

Ö±Ωo≥⁰#±:'0s

ลองออนไลน์!

คำอธิบาย

Ö±Ωo≥⁰#±:'0s  Inputs are y=4 and x=-20
           s  Convert x to string: "-20"
        :'0   Prepend '0'
  Ω           until
      #±      the number of digits
   o≥⁰        is at least y: "00-20"
Ö±            Sort by is-digit: "-0020"
              Print implicitly.

5

R, 56 48 ไบต์

function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)

ลองออนไลน์!

-8 ไบต์ขอบคุณdjhurio

คำอธิบาย

  • sprintf("%0zd",x)ส่งคืนxเป็นสตริงที่เติมด้วยศูนย์ที่มีความยาวz
  • paste0("%0",y+(x<0),"d")สร้างสตริง"%0zd"ที่zเป็นyบวก 1 ถ้าxน้อยกว่าศูนย์
  • ถ้าzน้อยกว่าจำนวนของตัวเลขในx, xมีการพิมพ์เป็นสตริงเป็นเป็น

48 bytesfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio

@djhurio ยอดเยี่ยม! ฉันคิดว่าจะรับประกันคำตอบอื่นมากกว่าการแก้ไขของฉันคุณจะพูดว่าอย่างไร
duckmayr

คุณสามารถแก้ไขได้ วิธีนี้ไม่แตกต่างกันมากเพียงแค่ใช้ฟังก์ชั่นต่าง
djhurio

4

อลิซ 23 ไบต์

/oRe./'+Ao
\I*tI&0-R$@/

ลองออนไลน์!

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

คำอธิบาย

/...
\...@/

นี่เป็นกรอบปกติสำหรับโปรแกรมเชิงเส้นในโหมด Ordinal สิ่งเดียวที่จับได้ในกรณีนี้คือบิตนี้:

.../...
...&...

นี่ทำให้ IP เข้าสู่โหมด Cardinal ในแนวตั้งและทำงาน&ในโหมด Cardinal ก่อนที่จะกลับมาทำงานในโหมด Ordinal

แฉการควบคุมการไหลของซิกแซกจะให้

IRt.&'-A$o*eI/&/0+Ro@

I    Read the first line of input (the value) as a string.
R    Reverse the string.
t.   Split off the last character and duplicate it.
&    Fold the next command over this string. This doesn't really do anything,
     because the string contains only one character (so folding the next
     command is identical to executing it normally).
'-   Push "-".
A    Set intersection. Gives "-" for negative inputs and "" otherwise.
$o   If it's "-", print it, otherwise it must have been a digit which we
     leave on the stack.
*    Join the digit back onto the number. If the number was negative, this
     joins the (absolute value of the) number to an implicit empty string,
     doing nothing.
e    Push an empty string.
I    Read the width W.
/&/  Iterate the next command W times.
0    Append a zero. So we get a string of W zeros on top of the absolute
     value of the input number.
+    Superimpose. This takes the character-wise maximum of both strings
     and appends extraneous characters from the longer string. Since the
     string of zeros can never be larger than the digits in the input,
     the input itself will be uneffected, but extraneous zeros are appended,
     padding the string to the required length.
R    Reverse the result.
o    Print it.
@    Terminate the program.

ต่อไปนี้เป็นทางเลือกสองทางเช่น 23 ไบต์ซึ่งใช้ Cardinal H( abs ) เพื่อกำจัด-:

/R.I&0-RoH
\Ie#\'+Ao\@/

/R.H#/.+Xo
\Ie\I&0QRo@/

ในหลักการเหล่านี้เป็นคำสั่งสั้น แต่&ไม่พอดีกับตำแหน่งที่มีสตริง 1 #ตัวในกองดังนั้นเราจึงจำเป็นที่จะข้ามมันด้วย



4

ถ่าน , 16 13 ไบต์

‹N⁰﹪⁺⁺%0ηd↔Iθ

ลองออนไลน์!

นี่เป็นระยะสั้นที่สุดที่ฉันสามารถใช้ Charcoal ได้โดยไม่ต้องพิมพ์ whitespaces นำหน้าหรือต่อท้าย อย่างน้อยตอนนี้ฉันเริ่มเข้าใจวิธีใช้Moduloฟังก์ชันเพื่อจัดรูปแบบสตริง

รหัส deverbosed เป็นดังนี้:

Print(Less(InputNumber(),0));    # Prints a - if the first input is less than 0
Print(Modulo(Add(Add("%0",h),"d"),Abs(Cast(q))));   # q: first input;  h: second input
  • บันทึกขนาด 3 ไบต์ด้วย Neil!

1
หากต้องการพิมพ์-หรือไม่มีอะไรง่ายใน Charcoal: การพิมพ์ 1 ภาพ-ในขณะที่พิมพ์ 0 ไม่พิมพ์ภาพใด ๆ ดังนั้น ternary จึงไม่จำเป็นต้องบันทึก 3 ไบต์
Neil

หากคุณสลับInputNumber()กับด้วยCast(q)ฉันคิดว่าคุณสามารถเปลี่ยนไปใช้การเปรียบเทียบสตริงเพื่อบันทึกไบต์อื่น
Neil

@ ไม่มีฉันรู้ว่าฉันสามารถทำให้ง่ายขึ้นTernary!
ชาร์ลี


4

PHP, 45 ไบต์

printf("%0".($argv[2]+(0>$n=$argv[1])).d,$n);

หรือ

[,$n,$e]=$argv;printf("%0".($e+(0>$n)).d,$n);       # requires PHP 7.1 or later

ทำงานด้วย-nrหรือลองพวกเขาออนไลน์


รับข้อผิดพลาดเมื่อรันโค้ดในลิงค์นั้น
Shaggy

@Shaggy เวอร์ชันที่สองต้องการ PHP 7.1
Titus

ฉันเดินหน้าต่อไปเรื่อย ๆ และฉันก็มาถึงคำตอบนี้ ฉันเชื่อว่านี่เป็นรุ่นที่ดีที่สุด
Ismael Miguel


3

Mathematica, 63 62 ไบต์

If[#<0,"-",""]<>IntegerString[#,10,Max[#2,IntegerLength@#,1]]&

ลองออนไลน์!


2
ยินดีต้อนรับสู่ PPCG! ฉันคิดว่ามันไม่ได้ทำในสิ่งที่คุณต้องการ คุณอาจมีความหมายแทนIntegerLength IntegerDigitsคุณสามารถบันทึกไบต์โดยใช้IntegerLength@#แทนIntegerLength[#]แม้ว่า
Martin Ender

ขอขอบคุณ! ฉันกำลังคัดลอกรหัสจากคอมพิวเตอร์เครื่องอื่นด้วยมือที่ฉันทำการทดสอบและฉันก็เข้าใจผิดว่า IntegerDigits สำหรับ IntegerLength แน่นอน มันควรจะใช้งานได้แล้ว ฉันได้เพิ่มลิงก์ TIO พร้อมกับกรณีทดสอบทั้งหมดในคำอธิบายการท้าทาย (+1) ซึ่งแสดงว่าทำงานได้ตามที่คาดไว้ ขอบคุณสำหรับข้อเสนอแนะสำหรับการบันทึกไบต์พิเศษ! ฉันไม่รู้ว่าฉันคิดถึงมันมาก่อน :)
MatjazGo

2

Excel, 29 ไบต์

การใช้TEXTฟังก์ชันของ Excel ("แปลงค่าเป็นข้อความในรูปแบบตัวเลขเฉพาะ")

xใน A1 yใน B1

=TEXT(A1,REPT("0",MAX(1,B1)))

คุณสามารถปล่อย)))-3 ไบต์ได้โดยแปลงเป็น Google ชีต
Taylor Scott




2

Japt , 14 12 ไบต์

บันทึก 2 ไบต์ด้วย @ETHproductions

s r"%d+"_ù0V

ลองออนไลน์


มันถูกกว่านิดหน่อยที่จะเก็บเครื่องหมายลบและแค่ยุ่งกับตัวเลข: ทดสอบออนไลน์
ETHproductions

@ETHproductions: หรือจะxเป็นสตริงสำหรับ10 ไบต์
Shaggy

@ ETHproductions ขอบคุณเพื่อน ฉันจะอัปเดตเมื่อฉันกลับไปที่โต๊ะทำงานของฉัน
โอลิเวอร์

@Shaggy ดูเหมือนว่าคุณโพสต์คำตอบของคุณเองดังนั้นฉันจะใช้เคล็ดลับของ ETHproduction ขอบคุณ
โอลิเวอร์

Oliver นั้นตัว 10 byter นั้นเป็นโซลูชั่น 12 ไบต์ของ @ ETHproduction ที่ได้รับการอัพเกรดเป็น Japt 2.0a0 ด้วยUสายอักขระที่ช่วยให้เราสามารถปิดตัวอักษร 2 ตัวแรก
Shaggy

2

PowerShellขนาด25 40 ไบต์

param($a,$b)$a|% *g $("D$b"*($b|% *o 0))

ลองออนไลน์!

คำอธิบาย

สิ่งนี้จะเรียก.ToString()หมายเลขที่มีสตริงรูปแบบที่สร้างขึ้น แต่คูณด้วย -1, 0 หรือ 1 โดยพิจารณาว่า$b( y) เป็นลบ, 0 หรือบวกตามลำดับ นี่คือการจัดการyค่าลบซึ่งสตริงรูปแบบไม่ได้ด้วยตัวเอง

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


ดูเหมือนว่าทั้งสองล้มเหลวเมื่อyเป็นลบ
Shaggy

@ Shaggy จับไงดี นำโซลูชันที่สองออกพร้อมกันและแก้ไขปัญหาแรกขอบคุณ!
นักเทศน์

อุ๊ย 15 ไบต์! ขออภัย!
Shaggy

@Shaggy heh หนึ่งวันนี้ฉันจะเขียนภาษาการเล่นกอล์ฟที่ใช้ PowerShell อย่างที่ฉันคิด ที่จริงแล้วสิ่งนี้ผลักดันให้ฉันค้นคว้ามากขึ้นและเริ่มเข้าใกล้มากขึ้นดังนั้นขอขอบคุณสำหรับสิ่งนั้น)
briantist

2

C # 6.0, 35 ไบต์

(x,y)=>(x.ToString($"D{y<0?0:y}"));

ทางเลือกอื่น ๆ (51 ไบต์)

(x,y)=>(x.ToString(string.Format("D{0}",y<0?0:y)));


1

C (gcc) , 45 ไบต์

f(x,y){printf("%s%0*i","-"+(x>=0),y,abs(x));}

ลองออนไลน์!

คำอธิบาย

printf รูปแบบสามข้อโต้แย้ง:

%s      ->    "-"+(x>=0)
%0*i    ->    y
        ->    abs(x)

%s"-"+(x>=0)รูปแบบสตริง เป็นจริงเพียงที่อยู่บางอย่างเช่น"-" 41961441ในหน่วยความจำนี้จะมีลักษณะดังนี้:

MEMORY ADDRESS | 41961441  41961442 ...
VALUE          | 45 ('-')  0 (0x00) ...

เมื่อจัดรูปแบบเป็นสตริง C จะใช้ที่อยู่ (พูด 41961441) และรับตัวอักษรต่อไปจนกว่าจะมีค่าว่างเป็นไบต์ (0x00) เมื่อ x น้อยกว่าศูนย์ค่า"-"+(x>=0)จะมีที่อยู่เดิม (41961441) มิฉะนั้นx>=0จะเท่ากับ 1 ดังนั้นนิพจน์จะกลายเป็น"-"+1ซึ่งจะให้คะแนนเป็นโมฆะหลังจาก"-"นั้นซึ่งไม่ได้พิมพ์อะไรเลย

%0*iพิมพ์จำนวนเต็มเบาะกับจำนวนที่ระบุ0s yหมายถึงหมายเลขนี้ เราใส่abs(x)เพื่อหลีกเลี่ยงการลบในการโต้แย้ง



1

Perl 5, 22 + 1 (- n) = 23 ไบต์

printf"%0*d",<>+/-/,$_

ลองออนไลน์


ลูปอนันต์เมื่อ10,-1
Zaid

คงที่+5 bytes
Nahuel Fouilleul

พบวิธีแก้ปัญหาอื่น-5 bytes
Nahuel Fouilleul

หวาน. ฉันกำลังทำอยู่เช่นกัน ... คอยติดตาม
Zaid

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