Thử thách số 0 hàng đầu


31

Các thách thức

Cho hai số nguyên là đầu vào ( xy), đầu ra xdưới dạng một chuỗi có càng nhiều số 0 đứng đầu cần thiết để nó có yký tự dài mà không có dấu.

Quy tắc

  • Nếu xcó nhiều hơn ychữ số, xuất ra xdưới dạng chuỗi mà không sửa đổi.

  • Đầu ra dưới dạng số nguyên không được chấp nhận, ngay cả khi không có số 0 đứng đầu.

  • Khi xâm, giữ nguyên trạng -và hoạt động trên giá trị tuyệt đối.

  • Phủ định ynên được coi là 0, nghĩa là bạn xuất ra nguyên trạng x(nhưng dưới dạng chuỗi)

Ví dụ:

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"

Mã ngắn nhất trong byte thắng, áp dụng sơ hở tiêu chuẩn.



1
Tôi có thể lấy x làm chuỗi không?
LiefdeWen

không (-1,1)cho cái gì
Adám

@ Adám đã thêm nó vào các ví dụ.
Brian H.

1
Là một +dấu hiệu hàng đầu có thể chấp nhận cho các số dương?
Tom Carpenter

Câu trả lời:


4

Japt , 13 8 byte

Lấy đầu vào đầu tiên ( x) dưới dạng một chuỗi.

®©ùTV}'-

Thử nó

Đã lưu 5 byte lớn nhờ ETHproductions.


Giải trình

Đầu vào ngầm định của chuỗi U=xvà số nguyên V=y.

® }'-chia Uthành một mảng trên biểu tượng dấu trừ, ánh xạ lên nó và nối lại thành một chuỗi có biểu tượng dấu trừ.

©là logic AND ( &&) vì vậy nếu phần tử hiện tại là true (một chuỗi không trống) thì pad left ( ù) với 0 ( T) theo chiều dài V.


Đẹp quá Bạn có thể tiết kiệm được một chút bằng cách đơn giản là ánh xạ xung quanh -: ethproductions.github.io/japt/iêu
ETHproductions

@ETHproductions: Cuộc gọi tuyệt vời. Cảm ơn. Đã rất lâu kể từ khi tôi làm như vậy, tôi hoàn toàn quên bạn có thể tách, ánh xạ và nối lại một chuỗi tất cả trong một phương thức!
Shaggy

Có, tôi cho rằng chức năng nên được chuyển đến q, sau đó sẽ q-_©ùTVlưu 1 byte :-)
ETHproductions

@ETHproductions, nếu tôi hiểu đúng, bạn đang đề xuất rằng nếu một chức năng được thông qua như là một đối số thứ hai của S.q()(cho chúng tôi S.q(s,f)) thì Ssẽ được tách ra s, chạy qua fvà tham gia lại với s? Tôi thích nó! :)
Xù xì

Yeah, tôi lại nói chuyện với Oliver và không bạn về làm điều đó (nếu được thông qua một chức năng, thực hiện chức năng bình thường, chạy qua các chức năng, và lùi lại sự thay đổi đầu tiên; N.s, S/A.y, N.ìlàm điều này đã được) với một loạt các phương pháp? Tôi đã có một cuộc trò chuyện với ai đó, tôi chỉ không thể nhớ ai bây giờ: s
ETHproductions



6

05AB1E , 11 10 byte

Đầu vào được đưa ra là amount_of_digits, number

ÎIÄg-×ì'-†

Hãy thử trực tuyến!

Giải trình

Î            # 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

Có vẻ như đây là câu trả lời chiến thắng cho đến nay, nếu không tốt hơn vào ngày mai tôi sẽ chấp nhận nó.
Brian H.

bạn đã bị ruồng bỏ :(
Brian H.

@BrianH. Quả thực tôi có :)
Emigna




5

JavaScript (ES6), 42

Đệ quy, tham số theo thứ tự ngược lại, đầu tiên y sau đó x. Và cà ri

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

Kiểm tra

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)
})


Mặc dù ấn tượng, tôi cảm thấy câu trả lời này bỏ qua các quy tắc một chút bằng cách xác định chức năng f(y)(x)thay vì f(x,y).
styletron

Đọc về các quy tắc "cà ri", tôi muốn thêm rằng sự phản đối của tôi là nhiều hơn với các thông số đảo ngược chứ không phải với chính cà ri.
styletron

1
@styletron thứ tự của các tham số không được chỉ định trong thử thách. Vì vậy, tôi có thể tận dụng lợi thế này
edc65

Dang, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)đến rất gần ...
ETHproductions

tôi không có vấn đề với mọi người đảo ngược thứ tự đầu vào.
Brian H.


5

bash, 27 , 25 byte

-2 byte nhờ Bruce Forte

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

thử trực tuyến


1
Bạn có thể lưu hai byte bằng cách nội tuyến chiều dài đệm. Ngoài ra một điều thú vị khác (28 byte) : printf %\ 0$[1+$1]d $2|xargs.
ბიმო

có thể bạn có nghĩa là printf %\ 0$[1+$2]d $1|xargs, tôi đã không nhớ định dạng này cho các số đã ký cũng xargs lừa để xóa không gian hàng đầu
Nahuel Fouilleul

5

Husk , 12 byte

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

Hãy thử trực tuyến!

Giải trình

Ö±Ω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 byte

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

Hãy thử trực tuyến!

-8 byte nhờ djhurio

Giải trình

  • sprintf("%0zd",x)trả về xdưới dạng một chuỗi được đệm bằng các số không có độ dàiz
  • paste0("%0",y+(x<0),"d")xây dựng chuỗi "%0zd", nơi zy, cộng với 1 nếu xlà nhỏ hơn không
  • Nếu znhỏ hơn số chữ số trong x, xđược in dưới dạng chuỗi

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

@djhurio rực rỡ! Tôi nghĩ rằng sẽ đảm bảo một câu trả lời khác thay vì một bản chỉnh sửa của tôi, bạn nói gì?
duckmayr

Bạn có thể làm cho nó như là một chỉnh sửa. Giải pháp này không quá khác biệt, chỉ sử dụng chức năng khác nhau.
djhurio

4

Alice , 23 byte

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

Hãy thử trực tuyến!

Đầu vào phải được phân tách theo dòng với số trên dòng đầu tiên và chiều rộng trên dòng thứ hai.

Giải trình

/...
\...@/

Đây là khung thông thường cho các chương trình tuyến tính trong chế độ Ordinal. Cái bắt duy nhất trong trường hợp này là bit này:

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

Điều này khiến IP vào chế độ Cardinal theo chiều dọc và chỉ thực hiện &ở chế độ Cardinal trước khi tiếp tục ở chế độ Ordinal.

Mở ra luồng điều khiển ngoằn ngoèo sau đó đưa ra:

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.

Đây là hai lựa chọn thay thế, cũng ở mức 23 byte, sử dụng Cardinal H( abs ) để loại bỏ -:

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

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

Về nguyên tắc, đây là một lệnh ngắn hơn, nhưng &không phù hợp với vị trí có chuỗi 1 ký tự trên ngăn xếp, vì vậy chúng ta cần bỏ qua nó với a #.



4

Than , 16 13 byte

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

Hãy thử trực tuyến!

Đây là lần ngắn nhất tôi có thể sử dụng Than mà không cần in các khoảng trắng hàng đầu hoặc dấu. Ít nhất bây giờ tôi bắt đầu hiểu cách sử dụng Modulohàm để định dạng chuỗi.

Mã deverboses như sau:

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 byte được lưu nhờ Neil!

1
Để in -hoặc không có gì thực sự dễ dàng trong Than: In 1 bản in -trong khi in 0 bản in không có gì. Vì vậy, ternary là không cần thiết, tiết kiệm 3 byte.
Neil

Nếu bạn trao đổi InputNumber()với Cast(q), tôi nghĩ bạn có thể chuyển sang so sánh chuỗi để lưu một byte khác.
Neil

@Neil Tôi biết rằng tôi có thể đơn giản hóa Ternary!
Charlie


4

PHP, 45 byte

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

hoặc là

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

Chạy với -nrhoặc thử chúng trực tuyến .


Gặp lỗi khi thực thi mã trong liên kết đó.
Xù xì

@Shaggy Phiên bản thứ hai yêu cầu PHP 7.1
Titus

Tôi tiếp tục và về điều này, và tôi đã đi đến chính xác câu trả lời này. Tôi tin rằng đây là phiên bản tối ưu
Ismael Miguel


3

Toán học, 63 62 byte

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

Hãy thử trực tuyến!


2
Chào mừng đến với PPCG! Tôi nghĩ rằng điều này không hoàn toàn làm những gì bạn muốn. Bạn có thể có nghĩa là IntegerLengththay vì IntegerDigits. Bạn có thể lưu một byte bằng cách sử dụng IntegerLength@#thay vì IntegerLength[#]mặc dù.
Martin Ender

Cảm ơn bạn! Tôi đã sao chép mã từ một máy tính khác bằng tay, nơi tôi đang kiểm tra nó và tôi thực sự đã nhầm lẫn IntegerDigits cho IntegerLpm. Nó nên hoạt động ngay bây giờ. Tôi cũng đã thêm một liên kết TIO với tất cả các trường hợp thử nghiệm trong mô tả thử thách (+1) cho thấy rằng nó hoạt động như mong đợi. Cảm ơn bạn cũng đã gợi ý cho việc tiết kiệm thêm một byte! Tôi không biết làm thế nào tôi bỏ lỡ nó trước đây. :)
MatjazGo

2

Excel, 29 byte

Sử dụng TEXTchức năng của Excel ("Chuyển đổi giá trị thành văn bản theo định dạng số cụ thể").

xtrong A1, ytrong B1

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

Bạn có thể giảm )))-3 byte bằng cách chuyển đổi sang Google Sheets
Taylor Scott




2

Japt , 14 12 byte

Đã lưu 2 byte nhờ @ETHproductions

s r"%d+"_ù0V

Dùng thử trực tuyến


Nó rẻ hơn một chút để giữ dấu trừ và chỉ lộn xộn với các chữ số: Kiểm tra trực tuyến
ETHproductions

@ETHproductions: Hoặc lấy xdưới dạng chuỗi cho 10 byte .
Shaggy

@ETHproductions cảm ơn fellas. Tôi sẽ cập nhật nó khi tôi trở lại bàn làm việc của mình.
Oliver

@Shaggy Có vẻ như bạn đã đăng câu trả lời của riêng mình, vì vậy tôi sẽ sử dụng thủ thuật của ETHproduction. Cảm ơn mặc dù.
Oliver

Oliver, giải pháp 10 byte đó chỉ là giải pháp 12 byte của @ ETHproduction được nâng cấp lên Japt 2.0a0 với Utư cách là một chuỗi cho phép chúng ta đánh bại 2 ký tự đầu tiên.
Shaggy

2

PowerShell , 25 40 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này gọi .ToString()vào số có chuỗi định dạng được tạo, nhưng nhân nó với -1, 0 hoặc 1 dựa trên việc $b( y) tương ứng là âm, 0 hoặc dương; điều này là để xử lý các ygiá trị âm mà các chuỗi định dạng không tự tạo.

Điều này dường như đòi hỏi phải bọc các số âm trong một phần phụ ()để nó hoạt động, đó chỉ là một sự châm biếm của lời mời khi sử dụng chữ; nếu thông qua các biến của số nguyên kiểu, nó sẽ không cần điều đó.


Có vẻ như cả hai đều thất bại khi ytiêu cực.
Shaggy

@Shaggy ugh bắt tốt. Đã xóa giải pháp thứ hai hoàn toàn và sửa lỗi đầu tiên, cảm ơn!
nghĩa tự do

Ôi, 15 byte! Lấy làm tiếc!
Xù xì

@Shaggy heh, một trong những ngày này tôi sẽ thực sự viết ngôn ngữ chơi gôn dựa trên PowerShell mà tôi đã nghĩ đến. Điều này thực sự đã thúc đẩy tôi nghiên cứu thêm một chút và tiến gần hơn để bắt đầu nó, vì vậy cảm ơn vì điều đó;)
briantist

2

C # 6.0, 35 byte

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

Giải pháp thay thế (51 byte)

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


1

C (gcc) , 45 byte

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

Hãy thử trực tuyến!

Giải trình

printf định dạng ba đối số:

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

%sđịnh dạng chuỗi "-"+(x>=0). "-"thực sự chỉ là một địa chỉ, một cái gì đó như 41961441. Trong bộ nhớ, cái này trông giống như thế này:

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

Khi được định dạng thành một chuỗi, C lấy địa chỉ (giả sử là 41961441) và tiếp tục lấy các ký tự cho đến khi đáp ứng một byte null (0x00). Khi x nhỏ hơn 0, giá trị "-"+(x>=0)có địa chỉ gốc (41961441). Mặt khác, x>=0là 1, do đó biểu thức trở thành "-"+1, điểm byte rỗng sau "-", không in gì.

%0*iin một số nguyên được đệm với một số 0s cụ thể. ybiểu thị số này. Chúng tôi pad abs(x)để tránh tiêu cực trong một số đối số.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.