Тримайтеся подалі від нуля


41

Завдання

Враховуючи невід'ємне ціле число n, виведіть, 1якщо nє 0, і виведіть значення nіншим чином.

Вхідні дані

Невід’ємне ціле число.

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

Вихідні дані

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

Тестові шафи

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

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.

Застосовуються стандартні лазівки .


1
Вам, мабуть, слід покласти посилання на КМЦ TNB , оскільки саме звідси виникла ця проблема.
mbomb007

Чи потрібно відповідати повноцінною функцією, чи це може бути тіло?
Калеб Клеветер

1
@CalebKleveter Правилом за замовчуванням у PPCG є те, що відповідь - це або функція, або повна програма, але не фрагменти.
Leaky Nun

Чи можемо ми роздрукувати вихід з нульовим нулем?
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

Спробуйте в Інтернеті!



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.


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

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

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

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

що змушує мене замислитися, чи це нижня межа для Р.


Ще 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 на @.








5

MarioLANG , 12 байт

;
=[
:<+
 =:

Спробуйте в Інтернеті!

Як це працює

Маріо починає зліва вгорі, спочатку ходить праворуч. Він читає int з input ( ;) і зберігає його в поточній комірці пам'яті. Потім він падає з землі ( =), вдаряючи [, що змушує ігнорувати наступну команду, якщо поточна комірка дорівнює 0.

Якщо комірка не дорівнює 0, він почне ходити ліворуч ( <), виводить поточну комірку як int ( :) і впаде до смерті (кінець програми).

Якщо клітинка дорівнює 0, він ігнорує команду повернути ліворуч і продовжує ходити праворуч. Він збільшує поточну комірку ( +), виводить її і падає до смерті.


5

Мозок-Флак , 22 , 10 байт

({{}}[]{})

Спробуйте в Інтернеті!

Пояснення:

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

Не нульовий:

n

Нуль:

0
0

На цьому етапі ми додамо висоту стека (0 для нуля, 1 для нуля) і виведемо ще одне значення зі стека. (оскільки стек зафіксований нескінченним числом 0, це відображатиметься або вгорі 0, або додаткових 0)


Приємна робота, але не найкоротше рішення: codegolf.stackexchange.com/a/118520/31203
MegaTom




4

Пітон, 15 байт

lambda n:n or 1

Чому б не просто n or 1, 6 байт?
DReispt

2
Тому що це просто фрагмент, тоді як ми зазвичай відповідаємо за допомогою повних програм або функцій. Я не впевнений, чи це десь зазначено в якихось правилах, але принаймні, це фактично стандарт.
daniero

Цитуючи трихоплакс : 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, чи не так?
daniero

1
Альтернатива з тим же 15-байтовим числом байтів:lambda n:n|1>>n
Кевін Кройсейсен

4

DC, 11 байт

[1]sf?d0=fp

[1]sfзберігає макрос в регістрі f, який натискає 1 на верхню частину стека, ?зчитує введення, d0=fзапускає макрос f, якщо вхід був 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

4

Excel, 10 байт

=A1+(A1=0)

Це економить 4 байта більш очевидним рішенням заяву «якщо», =IF(A1=0,1,A1).


3
І на 1 байт менше, ніж менш очевидний=A1+NOT(A1)
інженер Тост


4

R, 13 байт

n=scan();n+!n

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


3

Математика, 9 8 байт

Пер Мартін Ендер:

#~Max~1&

Перша ідея:

#/. 0->1&

Чиста функція з замінює 0на 1. Простір необхідний або він вважає, що ми розділяємо їх .0.


3

Perl 5, 6 + 2 байти для прапорів -l та -p

$_||=1

Здійснює введення в окремі рядки від stdin. Бігає з прапорами -lp.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.