Задача ведущих нулей


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
Могу ли я взять х в качестве строки?
LiefdeWen

что (-1,1)дает?
Адам

@ Adám добавил это к примерам.
Брайан Х.

1
+Приемлем ли ведущий знак для положительных чисел?
Том Карпентер

Ответы:


4

Japt , 13 8 байт

Принимает первый input ( x) как строку.

®©ùTV}'-

Попытайся

Сохранено 5 байтов благодаря ETHproductions.


объяснение

Неявный ввод строки U=xи целого числа V=y.

® }'-разбивается Uна массив с символом минус, отображает его и объединяет в строку с символом минус.

©является логическим AND ( &&), поэтому, если текущий элемент - truey (непустая строка), тогда pad left ( ù) с 0 ( T) в длину V.


Хороший! Вы можете сэкономить немного, просто нанеся на карту -: ethproductions.github.io/japt/…
ETHproductions

@ETHproductions: Отличный звонок. Спасибо. Прошло так много времени с тех пор, как я это сделал, я совершенно забыл, что вы можете разделить, отобразить и снова соединить строку одним способом!
Лохматый

Да, я полагаю, что функциональность должна быть перенесена 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

Похоже, что это победный ответ до сих пор, если не завтра, я приму его.
Брайан Х.

Вы были вне игры :(
Брайан Х.

@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

Читая о правилах «карри», я хотел добавить, что мое возражение было больше связано с измененными параметрами, а не с самим карри.
styletron

1
@styletron порядок параметров не указан в вызове. Так что я могу воспользоваться этим
edc65

Данг, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)так близко ...
ETHproductions

У меня нет проблем с людьми, меняющими порядок ввода.
Брайан Х.

5

Python 3.6 , 28 37 байт

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

Попробуйте онлайн! (Тестовый пример из ответа Колеры Су)

Воспользовавшись новым способом форматирования строк в Python 3.6

+9 байт для обработки y<0


Похоже, что это не удается, когда yотрицательный: tio.run/##K6gsycjPM/…
Shaggy

Верно. Итак, у меня 37 байтов.
Lescurel

5

bash, 27 , 25 байт

-2 байта благодаря Брюсу Форте

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

попробуйте это онлайн


1
Вы можете сохранить два байта , указав длину отступа. Также еще один интересный один (28 байт): printf %\ 0$[1+$1]d $2|xargs.
მოიმო

может быть, вы имеете в виду printf %\ 0$[1+$2]d $1|xargs, я не запомнил этот формат для чисел со знаком, а также трюк XARGS для удаления пробела
Науэль Фуйе


5

R, 56 48 байтов

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

Попробуйте онлайн!

-8 байт благодаря джурио

объяснение

  • sprintf("%0zd",x)возвращается xкак строка, дополненная нулями, чтобы иметь длинуz
  • paste0("%0",y+(x<0),"d")создает строку "%0zd", где zесть y, плюс 1, если xменьше нуля
  • Если zколичество цифр меньше x, xпечатается в виде строки как есть

48 байтовfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio

@djhurio блестящий! Я думаю, что это потребует другого ответа, а не моего редактирования, что вы скажете?
Duckmayr

Вы можете сделать это как редактирование. Это решение не так сильно отличается, просто используется другая функция.
Джурио

4

Алиса , 23 байта

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

Попробуйте онлайн!

Ввод должен быть разделен переводом строки с номером в первой строке и шириной во второй.

объяснение

/...
\...@/

Это обычная структура для линейных программ в обычном режиме. Единственный улов в этом случае - этот бит:

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

Это заставляет IP переходить в кардинальный режим по вертикали и выполнять только &в кардинальном режиме, прежде чем возобновить в обычном режиме.

Развернув зигзагообразный поток управления, вы получите:

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 символа, поэтому мы должны пропустить ее с помощью символа a #.



4

Древесный уголь , 16 13 байт

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

Попробуйте онлайн!

Это самое короткое, что я мог получить, используя древесный уголь без печати начальных или конечных пробелов. По крайней мере, сейчас я начинаю понимать, как использовать Moduloфункцию для форматирования строк.

Развернутый код выглядит следующим образом:

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 байта сохранены благодаря Нейлу!

1
Печатать -или ничего не очень легко в древесном угле: печать 1 печатает, -а печать 0 печатает ничего. Итак, троичная избыточна, экономя 3 байта.
Нил

Если вы поменяете местами InputNumber()с Cast(q), я думаю, что вы можете переключиться на сравнение строк, чтобы сохранить еще один байт.
Нил

@ Нил Я знал, что могу упростить 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 Вторая версия требует PHP 7.1
Titus

Я продолжал и продолжал об этом, и я пришел именно к этому ответу. Я считаю, что это оптимальная версия
Исмаэль Мигель


3

Mathematica, 63 62 байта

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

Попробуйте онлайн!


2
Добро пожаловать в PPCG! Я думаю, что это не совсем то, что вы хотите. Вы, вероятно, имели в виду, IntegerLengthа не IntegerDigits. Вы можете сохранить байт, используя IntegerLength@#вместо этого IntegerLength[#].
Мартин Эндер

Спасибо! Я копировал код с другого компьютера вручную, где я тестировал его, и я действительно набрал опечатки IntegerDigits для IntegerLength. Это должно работать сейчас. Я также добавил ссылку TIO со всеми тестовыми примерами в описании вызова (+1), показывающую, что он работает, как и ожидалось. Спасибо также за предложение сохранить дополнительный байт! Я не знаю, как я пропустил это раньше. :)
MatjazGo

2

Excel, 29 байт

Использование TEXTфункциональности Excel («Преобразует значение в текст в определенном числовом формате»).

xв A1, yв B1

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

Вы можете отбросить )))байты на -3, преобразовав их в Google Sheets
Тейлор Скотт,




2

Japt , 14 12 байт

Сохранено 2 байта благодаря @ETHproductions

s r"%d+"_ù0V

Попробуйте онлайн


Немного дешевле держать знак минус и просто возиться с цифрами: протестируйте его онлайн
ETHproductions

@ETHproductions: или взять xв качестве строки для 10 байтов .
Лохматый

@ETHproductions спасибо ребята. Я обновлю его, когда вернусь к своему столу.
Оливер

@ Shaggy Похоже, вы отправили свой собственный ответ, поэтому я буду использовать трюк ETHproduction. Спасибо хоть.
Оливер

Оливер, этот 10-байтовый код - это просто 12-байтовое решение @ ETHproduction, обновленное до Japt 2.0a0 Uв виде строки, позволяющей нам играть в гольф первыми двумя символами.
Лохматый

2

PowerShell , 25 40 байт

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

Попробуйте онлайн!

объяснение

Это вызывает .ToString()номер с сгенерированной форматной строкой, но умножает его на -1, 0 или 1 в зависимости от того , отрицателен ли $b( y), 0 или положителен соответственно; это должно обрабатывать отрицательные yзначения, которые строки формата не делают сами по себе.

Кажется, это требует обертывания отрицательных чисел в подзаголовке, ()чтобы это работало, что является просто причудой вызова при использовании литералов; если бы передал переменные типа integer, это бы не понадобилось.


Похоже, что оба они терпят неудачу, когда yотрицательно.
Лохматый

@ Шэгги тьфу, хороший улов. Полное удаление второго решения и исправление первого, спасибо!
Бриантист

Ой, 15 байтов! Сожалею!
Лохматый

@ Шэгги хе, на днях я напишу язык игры в гольф на основе 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)чтобы избежать негатива в некоторых аргументах.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.