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.



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.


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



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

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




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


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

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.

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

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



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!

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

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 .


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!


3

Mathematica, 63 62 byte

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

Cobalah online!


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

Anda dapat menjatuhkan )))for -3 Bytes dengan mengonversi ke Google Sheets
Taylor Scott




2

Japt , 14 12 byte

Disimpan 2 byte berkat produk @ETH

s r"%d+"_ù0V

Cobalah online


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.


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


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.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.