Restez à l'écart de zéro

41

Tâche

Étant donné un entier non négatif n, output 1si nis 0et output la valeur nsinon.

Contribution

Un entier non négatif.

  • Si vous souhaitez accepter la chaîne en tant qu'entrée, la chaîne correspond aux expressions rationnelles suivantes:, /^(0|[1-9][0-9]*)$/c'est-à-dire qu'elle ne doit pas avoir de zéros à gauche, sauf si c'est le cas 0.
  • Si vous acceptez un entier réel comme entrée, vous pouvez supposer que cet entier se situe dans les limites de la capacité de traitement de la langue.

Sortie

Un entier positif, spécifié ci-dessus. Les zéros en tête ne sont pas autorisés. Votre sortie doit correspondre à la regex /^[1-9][0-9]*$/.

Testcases

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

Notation

C'est du , donc la réponse la plus courte en octets est gagnante.

Les failles standard s'appliquent.

Fuite Nun
la source
1
Vous devriez probablement mettre un lien vers la CMC de la TNB , car c'est de là que vient ce défi.
mbomb007
La réponse doit-elle être une fonction complète ou peut-il s'agir du corps?
Caleb Kleveter
1
@CalebKleveter La règle par défaut dans PPCG est que la réponse est une fonction ou un programme complet, mais pas des extraits.
Leaky Nun
Pouvons-nous imprimer la sortie avec un zéro non significatif?
MD XF
@ MDXF oui, vous pouvez.
Leaky Nun

Réponses:

18

C (gcc), 14 à 13 octets

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

Merci à @betseg de m'avoir rappelé le n?:1truc dans les commentaires de l'autre réponse C!

Essayez-le en ligne!

C, 17 octets

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

Essayez-le en ligne!

C, 16 octets

#define f(n)!n+n

Essayez-le en ligne!

Steadybox
la source
tio.run/nexus/… hmmm ...
mardi
1
@betseg C'est parce que c'est une macro. Le compilateur voit ce 3*!n+nqui est égal 3*0+5.
Steadybox
1
Je sais, mais je pense que vous devriez pouvoir appliquer des opérateurs arithmétiques aux valeurs de "retour" directement. C'est pourquoi il est courant de mettre des parenthèses autour des macros. Je ne pense tout simplement pas que la macro est valide.
mardi
4
@betseg Je ne pense pas que ce soit une exigence du code golf. Je n'ai jamais vu une réponse de code de golf avec des macros C faire cela.
Steadybox
1
@hucancode Voir les liens TIO. Vous devez ajouter un élément à mainpartir duquel la fonction / macro fest appelée. Une solution n'a pas besoin d'être un programme complet par défaut. La version spécifique à gcc peut ou peut ne pas être compilée sur un autre compilateur, et elle peut ou ne peut pas fonctionner correctement lorsqu'elle est compilée sur un autre compilateur.
Steadybox
17

Japt , 2 octets

ª1

Essayez-le en ligne!

Explication

ªest un raccourci pour l' ||opérateur de JS . Japt a une entrée implicite, donc ce programme calcule input||1et le résultat est envoyé implicitement à STDOUT.

w1fonctionnerait aussi bien, en prenant le maximum de l'entrée et 1.

ETHproductions
la source
16

Alice , 7 octets

1/s
o@i

Essayez-le en ligne!

Explication

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.
Martin Ender
la source
15

JavaScript (ES6), 7 octets

n=>n||1
Arnauld
la source
5
Alternative: n=>n+!n(du moins je le pense)
Matthew Roh
@SIGSEGV Oui, cela fonctionnerait vraiment. (Cela pourrait aussi être le cas n|!n, bien que celui-ci soit limité à 31 bits.)
Arnauld
ceci peut être simplifié à n || 1. La seule chose qui est fausse est 0.
ansiart
1
@ansiart Si votre idée est que cela n=>n||1pourrait être simplifié n||1, alors non. Les réponses acceptables sont soit des programmes complets, soit des fonctions. n=>do_something_with(n)est une fonction de flèche dans la syntaxe ES6.
Arnauld
1
@StanStrum Nous devons renvoyer la valeur d'origine de nsi ce n'est pas zéro. Un OU au niveau du bit serait modifié nchaque fois que le bit le moins significatif n'est pas défini (par exemple (4|1) === 5).
Arnauld
14

Pyth, 2 octets

+!

Essayez-le en ligne

Explication

+!
 !Q    1 if (implicit) input is 0, 0 otherwise.
+  Q   Add the (implicit) input.
Mnémonique
la source
12

Rétine , 4 octets

^0
1

Essayez-le en ligne!

Si l'entrée commence par un zéro, remplacez-la par 1. (Fonctionne, car il est garanti que l'entrée n'a pas de zéros à gauche pour les valeurs non nulles.)

Martin Ender
la source
12

V , 4 octets

é0À

Essayez-le en ligne!

Abuse un comportement non préféré mais attendu , donc je ne peux pas vraiment l'appeler un bug. Explication:

Dans Vim, les commandes acceptent un compte. Par exemple, <C-a>incrémentera un nombre, mais 7<C-a>incrémentera un nombre de 7. Cependant, vous ne pouvez pas l'utiliser 0comme un compte, car

  • 0 est déjà une commande (allez dans la première colonne), et

  • Dans le contexte d'un éditeur de texte, il est rarement logique de demander qu'une commande soit exécutée 0 fois.

C'est bien pour un éditeur de texte, mais généralement désagréable pour une langue de golf, donc V écrase certaines commandes, ce qui en 0fait un nombre valide. Par exemple, é, ñ, Ä, et quelques autres. Cependant, puisqu'il <C-a>s'agit d'une commande vim intégrée, elle n'est pas écrasée. Son exécution avec une entrée positive donne donc les résultats suivants:

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

Mais courir avec 0 comme entrée donne:

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

Explication complète:

é0          " Insert a 0
  À         " Arg1 or 1 times:
   <C-a>    " Increment
DJMcMayhem
la source
1
La seule fois que 0ne pas être un compte est utile. Je n'y ai même pas pensé au début parce que je l'ai évité si souvent
nmjcman101
12

J , 2 octets

^*

Essayez-le en ligne!

^ [argument] élevé à la puissance de

* le signe de l'argument (0 si 0 sinon 1)

Parce que 1=0^0dans J.

Adam
la source
12

Haskell, 5 octets

max 1

Exemple d'utilisation: (max 1) 0-> 1.

Rien à expliquer.

nimi
la source
10

dc, 7

?d0r^+p

S'appuie sur le fait qui dcévalue 0 0 à 1, mais 0 n à 0 pour tous les autres n.

Essayez-le en ligne .

Trauma numérique
la source
10

R, 13 octets

max(1,scan())

lit nde stdin. Avec pmax, il peut lire une liste et renvoyer la valeur appropriée pour chaque élément de la liste pour +1 octet.

essayez-le en ligne!

Je dois noter qu’il existe une autre solution R de 13 octets de Sven Hohenstein qui permet une solution de 13 octets supplémentaire.

(n=scan())+!n

ce qui me fait me demander si c'est la limite inférieure de R.

Giuseppe
la source
Une autre solution 13 octets en utilisant pryr: pryr::f(n+!n). Je ne trouve rien de plus petit ...
JayCe
9

Cubix , 6 octets

OI!1L@

En quelque sorte réussi à l'adapter sur un cube d'unité ... Testez-le en ligne!

Explication

Avant d'être exécuté, le code est organisé comme un réseau de cubes:

  O
I ! 1 L
  @

L'IP (pointeur d'instruction) est ensuite placé sur la face extrême gauche ( I), tournée vers la droite. Les instructions à partir de là sont:

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.

L'IP frappe ensuite à !nouveau, en ignorant la @face inférieure. Ce n'est pas utile, car nous devons frapper le @pour mettre fin au programme. L'IP frappe à Lnouveau et passe par la ligne médiane en sens inverse ( L1!I) avant de se retrouver Lune fois de plus, ce qui active enfin l'IP @.

ETHproductions
la source
7

V , 5 octets

ç^0/<C-a>

<C-a>est 0x01.

Essayez-le en ligne!

Explication

ç                   " On every line
 ^0/                " that begins with a zero do:
    <C-a>           " Increment the number on that line
Kritixi Lithos
la source
1
Une petite compétition :)
DJMcMayhem
6

Oasis , 2 octets

Utilise la formule suivante: a (0) = 1 , a (n) = n

n1

Essayez-le en ligne!

Adnan
la source
1
Agréable. Mon approche était >V.
Leaky Nun
@ LeakyNun Oh sympa!
Adnan
6

R 20 16 octets

pryr::f(n+(n<1))
Shayne03
la source
Bienvenue chez PPCG!
Martin Ender
Merci @MartinEnder. Je suis déjà apprendre quelques astuces du commerce.
Shayne03
5

Brachylog , 3 octets

∅1|

Essayez-le en ligne!

Explication

Si nous ajoutons l'implicite ?(Input) et .(Output), nous avons:

?∅          Input is empty (that is, [] or "" or 0 or 0.0)
  1.        Output = 1
    |       Else
     ?.     Input = Output
Fataliser
la source
5

MarioLANG , 12 octets

;
=[
:<+
 =:

Essayez-le en ligne!

Comment ça marche

Mario commence en haut à gauche, en commençant par la droite. Il lit un int de input ( ;) et le stocke dans la cellule de mémoire courante. Puis il tombe du sol (= ) en frappant [, ce qui lui fait ignorer la commande suivante si la cellule en cours est 0.

Si la cellule n'est pas 0, il commencera à marcher à gauche ( <), affichera la cellule actuelle en tant que int (: ) et tombera à sa mort (fin du programme).

Si la cellule est à 0, il ignore la commande de tourner à gauche et continue de marcher à droite. Il incrémente la cellule actuelle ( +), la sort et tombe jusqu'à sa mort.

Chat d'affaires
la source
5

Brain-Flak , 22 , 10 octets

({{}}[]{})

Essayez-le en ligne!

Explication:

Si l'entrée est non nulle, alors tout {{}}sera enlevé de la pile et évalué en entrée. Si la valeur est zéro, rien ne sera affiché et l'évaluation sera égale à zéro. Donc courir ({{}})donne

Non nul:

n

Zéro:

0
0

À ce stade, nous ajouterons la hauteur de la pile (0 pour différent de zéro et 1 pour zéro) et supprimerons une valeur supplémentaire de la pile. (étant donné que la pile est complétée par un nombre infini de 0, cela affichera soit le 0 supérieur, soit un 0 supplémentaire)

DJMcMayhem
la source
Beau travail, mais pas la solution la plus courte: codegolf.stackexchange.com/a/118520/31203
MegaTom
4

TI-BASIC, 7 octets

:Prompt X
:X+not(X

Alternativement

TI-BASIC, 7 octets

:Prompt X
:max(X,1
Scott Milner
la source
4

Hexagone ,7 6 octets

)?<@.!

Étendu:

 ) ?
< @ .
 ! .

Essayez-le en ligne!

Sauvé 1 octet grâce à Martin!

Si le nombre est différent de zéro, imprimez-le, sinon ajoutez-en un et imprimez-le à la place.

FryAmTheEggman
la source
4

Python, 15 octets

lambda n:n or 1
Daniero
la source
Pourquoi pas seulement n or 1, 6 octets?
Départ
2
Parce que ce n'est qu'un extrait, alors que nous répondons habituellement avec des programmes ou des fonctions complets. Je ne sais pas si cela est indiqué explicitement dans certaines règles quelque part, mais au moins c'est la norme de facto.
daniero
Citant 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 nreviendrait toujours 1, n'est-ce pas?
daniero
1
Alternative avec le même nombre d'octets de 15 octets:lambda n:n|1>>n
Kevin Cruijssen le
4

dc, 11 octets

[1]sf?d0=fp

[1]sfstocke une macro dans le registre f qui pousse 1 en haut de la pile, ?lit l'entrée, d0=fexécute la macro f si l'entrée vaut 0,p affiche le haut de la pile.

Tester:

$ 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
la source
4

Excel, 10 octets

=A1+(A1=0)

Cela permet d' économiser 4 octets sur la solution évidente de déclaration « IF », =IF(A1=0,1,A1).

qoou
la source
3
Et 1 octet de moins que le moins évident=A1+NOT(A1)
Ingénieur Toast
4

Java 8, 10 octets

i->i<1?1:i
  • Merci à @ LeakyNun pour avoir économisé - 1 octet
    • N'a pas remarqué que c'est un entier non négatif
Roman Gräf
la source
3
i==0 can be replaced by i<1
Leaky Nun
4

R, 13 bytes

n=scan();n+!n

Here, scan is used to read the input value n. The negation of n (i.e., !n, 0 or 1) is added to n.

Sven Hohenstein
la source
3

Mathematica, 9 8 bytes

Per Martin Ender:

#~Max~1&

First idea:

#/. 0->1&

Pure function with replaces 0 with 1. The space is necessary or it thinks we are dividing by .0.

ngenisis
la source
3

Perl 5, 6 + 2 bytes for the -l and -p flags

$_||=1

Takes input on separate lines from stdin. Runs with the flags -lp.

Chris
la source