Tantangan nol terkemuka

31

Tantangan

Diberi dua bilangan bulat sebagai input ( xdan y), output xsebagai string dengan sebanyak mungkin angka nol di depannya untuk menjadi ykarakter yang panjang tanpa tanda.

Aturan

  • Jika xmemiliki lebih dari ydigit, output xsebagai string tanpa modifikasi.

  • Output sebagai integer tidak diterima, bahkan jika tidak ada nol di depan.

  • Ketika xnegatif, pertahankan apa adanya -dan beroperasi pada nilai absolut.

  • Negatif yharus diperlakukan sebagai 0, artinya Anda menghasilkan xapa adanya (tetapi sebagai string)

Contoh:

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"

Kode terpendek dalam byte menang, celah standar berlaku.

Brian H.
sumber
1
Bisakah saya mengambil x sebagai string?
LiefdeWen
apa yang (-1,1)memberi?
Adm
@ Adám menambahkannya ke contoh.
Brian H.
1
Apakah +tanda terkemuka dapat diterima untuk angka positif?
Tom Carpenter

Jawaban:

4

Japt , 13 8 byte

Mengambil input pertama ( x) sebagai string.

®©ùTV}'-

Cobalah

Menyimpan 5 byte besar berkat produk ETH.


Penjelasan

Input string U=xdan integer tersirat V=y.

® }'-membelah Umenjadi array pada simbol minus, memetakan di atasnya dan bergabung kembali ke string dengan simbol minus.

©logis DAN ( &&) jadi jika elemen saat ini benar (string yang tidak kosong) maka pad kiri ( ù) dengan 0 ( T) memanjang V.

Shaggy
sumber
Yang bagus! Anda dapat menghemat sedikit dengan hanya memetakan sekitar -: ethproductions.github.io/japt/…
ETHproductions
@ ETProduksi: Panggilan bagus. Terima kasih. Sudah begitu lama sejak saya melakukannya, saya benar-benar lupa Anda dapat membagi, memetakan dan bergabung kembali dengan string semua dalam satu metode!
Shaggy
Ya, saya kira fungsionalitas harus dipindahkan ke q, yang kemudian akan q-_©ùTVmenghemat 1 byte :-)
ETHproduksi
@ ETHproductions, jika saya mengerti itu benar, Anda menyarankan bahwa jika suatu fungsi dilewatkan sebagai argumen kedua dari S.q()(memberi kami S.q(s,f)) maka Sakan dibagi s, dijalankan fdan bergabung kembali dengan s? Saya suka itu! :)
Shaggy
Ya, aku berbicara dengan Oliver dan tidak Anda tentang melakukan hal itu (jika disahkan fungsi, melakukan fungsi normal, jalankan melalui fungsi, dan membatalkan perubahan pertama; N.s, S/A.y, N.ìmelakukan hal ini sudah) dengan sekelompok metode? Saya memiliki percakapan dengan seseorang, saya tidak bisa mengingat siapa sekarang: s
ETHproduksi
8

Pyth , 12 byte

%"%0*d",+E>0

Coba di sini!

Tuan Xcoder
sumber
6

05AB1E , 11 10 byte

Masukan diberikan sebagai amount_of_digits, number

ÎIÄg-×ì'-†

Cobalah online!

Penjelasan

Î            # 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
Emigna
sumber
Sepertinya ini adalah jawaban yang menang sejauh ini, jika besok tidak lebih baik aku akan menerimanya.
Brian H.
Anda telah dikalahkan :(
Brian H.
@BrianH. Memang saya punya :)
Emigna
6

Python, 29 byte

Ambil input sebagai f(x,y). Menggunakan %operator Python .

lambda x,y:'%0*d'%(y+(x<0),x)

Cobalah online!

Colera Su
sumber
5

C #, 56 byte

Cobalah secara Online!

a=>b=>(a<0?"-":"")+((a<0?-a:a)+"").PadLeft(b<0?0:b,'0')
LiefdeWen
sumber
5

Java (OpenJDK 8) , 47 byte

x->y->"".format("%0"+((y<1?1:y)-(x>>31))+"d",x)

Cobalah online!

Pada awalnya saya pikir, mudah, 30 karakter maks (yang cukup pendek ketika memanipulasi string di Jawa). Kemudian pengecualian terjadi.

Olivier Grégoire
sumber
5

JavaScript (ES6), 42

Rekursif, parameter dalam urutan terbalik, pertama y kemudian x. Dan kari

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

Uji

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

edc65
sumber
Meskipun mengesankan, saya merasa jawaban ini mengecilkan aturan sedikit dengan mendefinisikan fungsi f(y)(x)alih-alih f(x,y).
styletron
Membaca tentang aturan "currying", saya ingin menambahkan bahwa keberatan saya lebih pada params terbalik dan bukan dengan kari itu sendiri.
styletron
1
@styletron urutan parameter tidak ditentukan dalam tantangan. Jadi saya bisa memanfaatkan ini
edc65
Dang, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)datang sangat dekat ...
ETHproduk
saya tidak punya masalah dengan orang-orang membalik urutan input.
Brian H.
5

Python 3.6 , 28 37 byte

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

Cobalah online! (Uji kasus dari jawaban Colera Su)

Mengambil keuntungan dari cara baru untuk memformat string dalam python 3.6

+9 byte untuk ditangani y<0

Lescurel
sumber
Sepertinya ini gagal ketika ynegatif: tio.run/##K6gsycjPM/…
Shaggy
Memang. Jadi saya siap dengan 37 byte.
Lescurel
5

bash, 27 , 25 bytes

-2 byte terima kasih kepada Bruce Forte

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

coba online

Nahuel Fouilleul
sumber
1
Anda dapat menyimpan dua byte dengan menggariskan panjang bantalan. Juga satu lagi yang menarik (28 bytes): printf %\ 0$[1+$1]d $2|xargs.
ბიმო
mungkin maksud Anda printf %\ 0$[1+$2]d $1|xargs, saya tidak ingat format ini untuk nomor yang ditandatangani dan trik xargs untuk menghapus ruang terdepan
Nahuel Fouilleul
5

Sekam , 12 byte

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

Cobalah online!

Penjelasan

Ö±Ω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.
Zgarb
sumber
5

R, 56 48 byte

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

Cobalah online!

-8 byte berkat djhurio

Penjelasan

  • sprintf("%0zd",x)kembali xsebagai string yang diisi dengan nol menjadi panjangz
  • paste0("%0",y+(x<0),"d")membangun string "%0zd", di mana zadalah y, ditambah 1 jika xkurang dari nol
  • Jika zkurang dari jumlah digit x, xdicetak sebagai string seperti apa adanya
duckmayr
sumber
48 bytesfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio
@ Djurio brilian! Saya pikir itu akan membutuhkan jawaban lain daripada suntingan saya, apa yang Anda katakan?
duckmayr
Anda dapat menjadikannya sebagai edit. Solusi ini tidak jauh berbeda, hanya menggunakan fungsi yang berbeda.
djhurio
4

Alice , 23 byte

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

Cobalah online!

Input harus dipisahkan dengan linefeed dengan nomor pada baris pertama dan lebar pada baris kedua.

Penjelasan

/...
\...@/

Ini adalah kerangka kerja biasa untuk program linier dalam mode Ordinal. Satu-satunya tangkapan dalam kasus ini adalah bit ini:

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

Hal ini menyebabkan IP untuk memasuki mode Kardinal secara vertikal dan menjalankan hanya &dalam mode Kardinal sebelum melanjutkan dalam mode Ordinal.

Membuka aliran kontrol zigzag kemudian memberikan:

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.

Berikut adalah dua alternatif, juga pada 23 byte, yang menggunakan Cardinal H( abs ) untuk menyingkirkan -:

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

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

Pada prinsipnya, ini adalah perintah yang lebih pendek, tetapi &tidak cocok dengan posisi di mana ada string 1-karakter pada stack, jadi kita perlu melewati itu dengan a #.

Martin Ender
sumber
4

C, 33 byte

f(x,y){printf("%0*d",y+(x<0),x);}

Cobalah online!

Steadybox
sumber
4

Arang , 16 13 byte

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

Cobalah online!

Ini adalah yang terpendek yang saya dapat menggunakan Charcoal tanpa mencetak spasi putih terdepan atau tambahan. Setidaknya saya sekarang mulai mengerti bagaimana menggunakan Modulofungsi untuk memformat string.

Kode deverbosed adalah sebagai berikut:

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 disimpan berkat Neil!
Charlie
sumber
1
Untuk mencetak -atau tidak sama sekali sangat mudah di Charcoal: Mencetak 1 cetakan -sambil mencetak 0 tidak menghasilkan apa-apa. Jadi, ternary itu berlebihan, menghemat 3 byte.
Neil
Jika Anda menukar InputNumber()dengan Cast(q), saya pikir Anda kemudian dapat beralih ke perbandingan string untuk menyimpan byte lain.
Neil
@Neil saya tahu bahwa saya bisa menyederhanakan Ternary!
Charlie
4

Retina , 39 byte

\d+$
$*0
((\d)*),(?<-2>-0+|0)*(0*)
$3$1

Cobalah online!

Input harus dipisahkan dengan koma dengan angka pertama dan lebar kedua.

Martin Ender
sumber
4

PHP, 45 byte

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

atau

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

Jalankan dengan -nratau coba online .

Titus
sumber
Mendapat kesalahan saat mengeksekusi kode di tautan itu.
Shaggy
@ Shaggy Versi kedua membutuhkan PHP 7.1
Titus
Saya terus dan terus tentang ini, dan saya tiba tepat jawaban ini. Saya percaya ini adalah versi optimal
Ismael Miguel
3

Mathematica, 118 byte

(j=ToString;If[#2<=0,j@#,If[(z=IntegerLength@#)>=#2,t=z,t=#2];s=j/@PadLeft[IntegerDigits@#,t];If[#>=0,""<>s,"-"<>s]])&


Cobalah online!

J42161217
sumber
3

Mathematica, 63 62 byte

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

Cobalah online!

MatjazGo
sumber
2
Selamat datang di PPCG! Saya pikir ini tidak cukup melakukan apa yang Anda inginkan. Anda mungkin bermaksud IntegerLengthbukannya IntegerDigits. Anda dapat menyimpan byte dengan menggunakan IntegerLength@#alih-alih IntegerLength[#].
Martin Ender
Terima kasih! Saya menyalin kode dari komputer lain dengan tangan di mana saya mengujinya dan saya memang salah mengetik IntegerDigits untuk IntegerLength. Itu seharusnya bekerja sekarang. Saya juga telah menambahkan tautan TIO dengan semua kasus uji dalam deskripsi tantangan (+1) yang menunjukkan bahwa itu berfungsi seperti yang diharapkan. Terima kasih juga atas sarannya untuk menyimpan byte tambahan! Saya tidak tahu bagaimana saya melewatkannya sebelumnya. :)
MatjazGo
2

Excel, 29 byte

Menggunakan TEXTfungsionalitas Excel ("Mengubah nilai menjadi teks dalam format angka tertentu").

xdi A1, ydi B1

=TEXT(A1,REPT("0",MAX(1,B1)))
Wernisch
sumber
Anda dapat menjatuhkan )))for -3 Bytes dengan mengonversi ke Google Sheets
Taylor Scott
2

Oktaf , 44 byte

@(x,y)fprintf(['%0',num2str(y+(x<0)),'d'],x)

Cobalah online!

Stewie Griffin
sumber
1
Untuk 31 byte
Tom Carpenter
Jika tanda + awal dibolehkan untuk angka positif (menunggu untuk mendengar dari op jika ok), ini bekerja untuk 28 .
Tom Carpenter
2

Haskell , 54 byte

x#y|s<-show$abs$x=['-'|x<0]++('0'<$[length s+1..y])++s

Cobalah online!

benar-benar manusiawi
sumber
2

Ruby , 31 28 byte

Terima kasih Carl untuk menghemat 3 byte menggunakan interpolasi.

->x,y{"%0#{y+(x<0?1:0)}d"%x}

Cobalah online!

Jérémie Bonal
sumber
2
28: -> x, y {"% 0 # {y + (x <0? 1: 0)} d"% x}
Carl
2

Japt , 14 12 byte

Disimpan 2 byte berkat produk @ETH

s r"%d+"_ù0V

Cobalah online

Oliver
sumber
Agak lebih murah untuk menyimpan tanda minus dan hanya mengacaukan angka: Uji secara online
ETHproduksi
@ ETHproductions: Atau ambil xsebagai string selama 10 byte .
Shaggy
@ ETHproduk terima kasih kawan. Saya akan memperbaruinya ketika saya kembali ke meja saya.
Oliver
@Shaggy Sepertinya Anda memposting jawaban Anda sendiri, jadi saya akan menggunakan trik ETHproduction. Terimakasih Meskipun.
Oliver
Oliver, yang 10-byter hanya @ solusi 12-byte @ ETHproduksi ditingkatkan menjadi Japt 2.0a0 dengan Usebagai string yang memungkinkan kita untuk bermain golf dari 2 karakter pertama.
Shaggy
2

PowerShell , 25 40 byte

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

Cobalah online!

Penjelasan

Ini memanggil .ToString()nomor dengan string format yang dihasilkan, tetapi mengalikannya dengan -1, 0, atau 1 berdasarkan apakah $b( y) negatif, 0, atau positif masing-masing; ini untuk menangani ynilai - nilai negatif yang format string tidak lakukan sendiri.

Ini tampaknya membutuhkan pembungkus angka negatif dalam substatemen ()agar berfungsi yang hanya merupakan kekhasan doa ketika menggunakan literal; jika melewati variabel tipe integer, tidak perlu itu.

briantis
sumber
Sepertinya keduanya gagal saat ynegatif.
Shaggy
@Shaggy ugh tangkapan bagus. Menghapus solusi kedua sekaligus dan memperbaiki yang pertama, terima kasih!
briantist
Aduh, 15 byte! Maaf!
Shaggy
@ Shaggy heh, suatu hari saya akan menulis bahasa golf berbasis PowerShell yang saya pikirkan. Ini benar-benar mendorong saya untuk meneliti sedikit lebih banyak dan lebih dekat untuk memulainya, jadi terima kasih untuk itu;)
briantist
2

C # 6.0, 35 byte

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

Solusi alternatif (51 byte)

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

Bersih , 90 86 83 byte

import StdEnv
@x y=if(y<0)"-"""+++{if(c>'-')c'0'\\c<-rjustify x[k\\k<-:toString y]}

Cobalah online!

Suram
sumber
1

C (gcc) , 45 byte

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

Cobalah online!

Penjelasan

printf memformat tiga argumen:

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

%smemformat string "-"+(x>=0). "-"benar-benar hanya sebuah alamat, sesuatu seperti 41961441. Di memori, ini terlihat seperti ini:

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

Ketika diformat menjadi string, C mengambil alamat (katakanlah 41961441) dan terus mendapatkan karakter sampai byte nol (0x00) terpenuhi. Ketika x kurang dari nol, nilainya "-"+(x>=0)memiliki alamat asli (41961441). Jika tidak, x>=0adalah 1, jadi ekspresi menjadi "-"+1, yang menunjuk byte nol setelahnya "-", yang tidak mencetak apa pun.

%0*imencetak bilangan bulat yang diisi dengan jumlah 0s yang ditentukan .ymenunjukkan angka ini. Kami abs(x)mendukung untuk menghindari yang negatif dalam beberapa argumen.

Conor O'Brien
sumber
1

Perl 5, 22 + 1 (- n) = 23 byte

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

Cobalah online

Nahuel Fouilleul
sumber
Putaran tak terhingga pada10,-1
Zaid
diperbaiki+5 bytes
Nahuel Fouilleul
menemukan solusi lain-5 bytes
Nahuel Fouilleul
Manis. Saya sedang mengerjakan satu juga ... tetap disini
Zaid
Saya mengelolanya dalam 26 byte
Zaid