Держаться подальше от нуля

41

задача

Учитывая неотрицательное целое число n, выход , 1если nесть 0, и вывести значение в nпротивном случае.

вход

Неотрицательное целое число.

  • Если вы хотите принять строку в качестве входных данных, строка будет соответствовать следующему регулярному выражению:, /^(0|[1-9][0-9]*)$/то есть она не должна иметь начальных нулей, кроме случаев, когда это так 0.
  • Если вы принимаете действительное целое число в качестве входных данных, вы можете предположить, что целое число находится в пределах возможностей обработки языка.

Выход

Целое положительное число, указанное выше. Ведущие нули не допускаются. Ваш вывод должен соответствовать регулярному выражению /^[1-9][0-9]*$/.

Testcases

input output
    0      1
    1      1
    2      2
    3      3
    4      4
    5      5
    6      6
    7      7

счет

Это , поэтому выигрывает самый короткий ответ в байтах.

Применяются стандартные лазейки .

Дрянная Монахиня
источник
1
Вероятно, вам следует поместить ссылку на CMC TNB , поскольку именно здесь возникла эта проблема.
mbomb007
Должен ли ответ быть полноценной функцией, или это может быть тело?
Калеб Клеветер
1
@CalebKleveter Правило по умолчанию в PPCG гласит, что ответом является либо функция, либо полная программа, но не фрагменты.
Утренняя монахиня
Можем ли мы напечатать вывод с начальным нулем?
MD XF
@MDXF да, ты можешь.
Утренняя монахиня

Ответы:

18

C (gcc), 14 13 байтов

f(n){n=n?:1;}

Спасибо @betseg за напоминание об n?:1уловке в комментариях к другому ответу C!

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

C, 17 байтов

f(n){return!n+n;}

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

C, 16 байтов

#define f(n)!n+n

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

Steadybox
источник
1
@betseg Это потому что это макрос. Компилятор видит это как 3*!n+nравное 3*0+5.
Steadybox
1
Я знаю, но я думаю, что вы должны иметь возможность применять арифметические операторы непосредственно к «возвращаемым» значениям, поэтому принято ставить круглые скобки вокруг макросов. Я просто не думаю, что макрос действителен.
betseg
4
@betseg Я не думаю, что это требование в коде гольф. Я никогда не видел, чтобы кодовый гольф-ответ с C-макросами делал это.
Steadybox
1
@hucancode Смотрите ссылки на TIO. Вам нужно добавить mainиз которого fвызывается функция / макрос . По умолчанию решение не обязательно должно быть полной программой. Специфичная для gcc версия может компилироваться или не компилироваться на другом компиляторе, и она может работать или не работать правильно при компиляции на другом компиляторе.
Steadybox
17

Japt , 2 байта

ª1

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

объяснение

ªэто ярлык для ||оператора JS . Japt имеет неявный ввод, поэтому эта программа вычисляет input||1, и результат неявно отправляется в STDOUT.

w1будет работать так же, принимая максимум ввода и 1.

ETHproductions
источник
16

Алиса , 7 байт

1/s
o@i

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

объяснение

1   Push 1. Irrelevant.
/   Reflect to SE. Switch to Ordinal.
i   Read all input as a string.
    Reflect off bottom right corner. Move back NW.
/   Reflect to W. Switch to Cardinal.
1   Push 1.
    IP wraps around to last column.
s   Sort swap: implicitly convert the input to an integer. Then, if the top stack 
    element is less than the one below, the two are swapped. It basically computes
    min and max of two values at the same time, with max on top.
/   Reflect to NW. Switch to Ordinal.
    Immediately reflect off the top boundary. Move SW.
o   Implicitly convert the result to a string and print it.
    Reflect off bottom left corner. Move back NE.
/   Reflect to S. Switch to Cardinal.
@   Terminate the program.
Мартин Эндер
источник
15

JavaScript (ES6), 7 байт

n=>n||1
Arnauld
источник
5
Альтернатива: n=>n+!n(по крайней мере, я так думаю)
Мэтью Ро
@SIGSEGV Да, это действительно сработает. (Это также может быть n|!n, хотя этот ограничен 31-разрядным количеством.)
Арно
это можно упростить до n || 1. Единственное, что оценивается как ложное, это 0.
ansiart
1
@ansiart Если вы считаете, что это n=>n||1можно упростить n||1, то нет. Приемлемыми ответами являются либо полные программы, либо функции. n=>do_something_with(n)является функцией стрелка в синтаксисе ES6.
Арно
1
@StanStrum Мы должны вернуть исходное значение, nесли оно не равно нулю. Побитовое ИЛИ будет изменяться nвсякий раз, когда младший значащий бит не установлен (например (4|1) === 5).
Арно
12

Сетчатка , 4 байта

^0
1

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

Если вход начинается с нуля, замените его на 1. (Работает, потому что вход гарантированно не будет иметь начальных нулей для ненулевых значений.)

Мартин Эндер
источник
12

V , 4 байта

é0À

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

Злоупотребляет нежелательным, но ожидаемым поведением , поэтому я не могу назвать это ошибкой. Объяснение:

В Vim команды принимают количество. Например, <C-a>увеличит число, но 7<C-a>увеличит число на 7. Однако вы не можете использовать его 0как счетчик, потому что

  • 0 это уже команда (перейти в первый столбец), и

  • В контексте текстового редактора редко имеет смысл просить, чтобы команда была выполнена 0 раз.

Это хорошо для текстового редактора, но, как правило, неприятно для языка игры в гольф, поэтому V перезаписывает некоторые команды, так что 0это правильный счет. Например, é, ñ, Ä, и некоторые другие. Однако, поскольку <C-a>это встроенная команда vim, она не перезаписывается, поэтому выполнение этого с положительным вводом дает:

N       " N times:
 <C-a>  "   Increment

Но работа с 0 в качестве ввода дает:

0       " Go to column one
 <C-a>  " Increment

Полное объяснение:

é0          " Insert a 0
  À         " Arg1 or 1 times:
   <C-a>    " Increment
DJMcMayhem
источник
1
Один раз, когда 0не считать, полезно. Сначала я даже не подумал об этом, потому что много раз избегал этого
nmjcman101
12

Haskell, 5 байтов

max 1

Пример использования: (max 1) 0-> 1.

Ничего особенного объяснить.

Ними
источник
10

R 13 байт

max(1,scan())

читает nсо стандартного ввода. С помощью pmaxон может читать в списке и возвращать соответствующее значение для каждого элемента в списке для +1 байта.

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

Я должен отметить, что есть еще одно точное решение R в 13 байтах от Sven Hohenstein, которое позволяет еще одно 13-байтовое решение

(n=scan())+!n

что заставляет меня задуматься, является ли это нижним пределом для R.

Giuseppe
источник
Еще 13 байт решения с использованием pryr: pryr::f(n+!n). Не могу найти что-нибудь меньшее ...
JayCe
9

Cubix , 6 байтов

OI!1L@

Каким-то образом удалось разместить его на единичном кубе ... Протестируйте его онлайн!

объяснение

Перед запуском код организован в виде сети кубов:

  O
I ! 1 L
  @

IP (указатель инструкций) затем помещается на крайнюю левую грань ( I), направленную вправо. Инструкции запускаются оттуда:

I  Input a number from STDIN and push it to the stack.
!  If the top number is non-zero, skip the next instruction.
1  Push a 1 (only if the input was zero).
L  Turn left. The IP is now on the top face facing the !.
O  Output the top item as a number.

Затем IP попадает !снова, пропуская @на нижней грани. Это не полезно, так как нам нужно нажать, @чтобы завершить программу. IP-адрес Lснова срабатывает и проходит через среднюю линию в обратном направлении ( L1!I), а затем снова попадает Lна IP-адрес, который, наконец, включает IP-адрес @.

ETHproductions
источник
6

R 20 16 байт

pryr::f(n+(n<1))
Shayne03
источник
Добро пожаловать в PPCG!
Мартин Эндер
Спасибо @MartinEnder. Я уже изучил некоторые уловки торговли.
Shayne03
5

MarioLANG , 12 байт

;
=[
:<+
 =:

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

Как это работает

Марио начинает сверху слева, сначала идет направо. Он читает int из input ( ;) и сохраняет его в текущей ячейке памяти. Затем он падает с земли ( =), ударяя [, что заставляет его игнорировать следующую команду, если текущая ячейка равна 0.

Если ячейка не равна 0, он начнет идти влево ( <), выведет текущую ячейку как int ( :) и падет до своей смерти (конец программы).

Если ячейка равна 0, он игнорирует команду повернуть налево и продолжает идти направо. Он увеличивает текущую ячейку ( +), выводит ее и падает до своей смерти.

Бизнес Кот
источник
5

Brain-Flak , 22 , 10 байтов

({{}}[]{})

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

Объяснение:

Если входные данные отличны от нуля, то {{}}все выкинут из стека и будут оцениваться на входе. Если оно равно нулю, ничего не будет вытолкнуто, и оно будет равно нулю. Так бег ({{}})дает

Ненулевая:

n

Нуль:

0
0

На этом этапе мы добавим высоту стека (0 для ненулевого значения, 1 для нуля) и вытолкнем еще одно значение из стека. (поскольку стек дополняется бесконечным числом 0, это приведет к появлению либо верхнего 0, либо дополнительного 0)

DJMcMayhem
источник
Хорошая работа, но не самое короткое решение: codegolf.stackexchange.com/a/118520/31203
MegaTom
4

TI-BASIC, 7 байтов

:Prompt X
:X+not(X

С другой стороны,

TI-BASIC, 7 байтов

:Prompt X
:max(X,1
Скотт Милнер
источник
4

Гексагония ,7 6 байт

)?<@.!

Expanded:

 ) ?
< @ .
 ! .

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

Сохранено 1 байт благодаря Мартину!

Если число ненулевое, напечатайте его, в противном случае добавьте к нему и напечатайте вместо этого.

FryAmTheEggman
источник
4

Python, 15 байт

lambda n:n or 1
daniero
источник
Почему не просто n or 16 байтов?
DReispt
2
Потому что это всего лишь фрагмент, а мы обычно отвечаем с полными программами или функциями. Я не уверен, указано ли это где-то явно в некоторых правилах, но по крайней мере это стандарт де-факто.
Даниеро
Цитирование Trichoplax : The rules are not terribly clear. I think we have a consensus on meta that REPLs count, but as a separate language, which would allow snippets in many cases, but snippets are not permitted according to this meta post-> codegolf.meta.stackexchange.com/questions/2419/...
daniero
@trichoplax 1or nвсегда возвращался 1, не так ли?
Даниеро
1
Альтернатива с тем же 15-байтовым подсчетом байтов:lambda n:n|1>>n
Кевин Круйссен,
4

постоянный ток, 11 байт

[1]sf?d0=fp

[1]sfсохраняет макрос в регистре f, который помещает 1 в верхнюю часть стека, ?читает ввод, d0=fзапускает макрос f, если input был 0, pпечатает верхнюю часть стека.

Тест:

$ dc -e "[1]sf?d0=fp" <<< 0
1
$ dc -e "[1]sf?d0=fp" <<< 1
1
$ dc -e "[1]sf?d0=fp" <<< 42
42
daniero
источник
4

Excel, 10 байт

=A1+(A1=0)

Это экономит 4 байта более очевидным решением заявление «если», =IF(A1=0,1,A1).

qoou
источник
3
И на 1 байт меньше, чем менее очевидный=A1+NOT(A1)
Engineer Toast
4

Java 8, 10 байт

i->i<1?1:i
  • Спасибо @LeakyNun за сохранение - 1 байт
    • Не заметил, что это неотрицательное целое число
Роман Греф
источник
3
i==0может быть замененоi<1
Leaky Nun
4

R 13 байт

n=scan();n+!n

Здесь scanиспользуется для чтения входного значения n. Отрицание n(то есть, !n0 или 1) добавляется к n.

Свен Хоэнштейн
источник
3

Mathematica, 9 8 байтов

Пер Мартин Эндер:

#~Max~1&

Первая идея:

#/. 0->1&

Чистая функция с заменяет 0на 1. Пространство необходимо, или оно думает, что мы делимся .0.

ngenisis
источник
3

Perl 5, 6 + 2 байта для флагов -l и -p

$_||=1

Принимает ввод в отдельных строках от стандартного ввода. Работает с флагами -lp.

Крис
источник