En Java / .NET / C / JavaScript / etc. vous pouvez utiliser les ifs ternaires pour raccourcir les instructions if.
Par exemple (en Java):
// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Peut être raccourci avec un ternaire si:
s=i<0?"Neg":i>0?"Pos":"Neut";
Défi:
Entrée: un if-else régulier (possible avec l'imbrication) qui définit une seule variable.
Sortie: le ternaire converti.
Règles du défi:
- Vous pouvez supposer que tous les cas if-else sont possibles sans crochets (donc chaque bloc if / else-if / else a un seul corps).
- Vous pouvez supposer qu'il n'y aura pas d'espaces, de tabulations ou de nouvelles lignes, à l'exception d'un seul espace après chacun
else
(y compris atelse if
). - Vous pouvez supposer que les noms de variables utilisés sont toujours une seule lettre minuscule (
[a-z]
). - Les valeurs données aux variables peuvent être l'une des suivantes:
- Cordes (sans espaces / onglets / nouvelles-lignes), qui seront entourés par des guillemets doubles (c. -à
"Test"
,"SomeString"
,"Example_string"
, etc.). Vous pouvez supposer que les chaînes ne contiendront jamais les sous-chaînesif
ouelse
, ni les espaces, les tabulations, les retours à la ligne, les guillemets (échappés) ou le caractère=
. Il peut contenir les caractères><(){}[];?:!&|
, mais sera uniquement dans la plage ASCII imprimable (['!' (33), '~' (126)]
). - Entiers (c. -à-
0
,123
,-55
, etc.) - (C. -à- Décimales
0.0
,0.123
,-55.55
, etc.)
- Cordes (sans espaces / onglets / nouvelles-lignes), qui seront entourés par des guillemets doubles (c. -à
- Les valeurs ne seront jamais mélangées. Ainsi, toutes les variables attribuées sont des entiers, et non certaines sont des entiers et certaines sont des chaînes.
- Les conditions à l' intérieur des parenthèses peuvent contenir les caractères suivants
=<>!+-/*%&|[]
,a-z
,0-9
. Vous pouvez supposer qu'il n'y aura pas de parenthèses internes, et vous pouvez également supposer qu'il n'y aura pas de champs (confus) de plus d'un caractère utilisés (commeif(if<0)
). - Vous pouvez supposer qu'il n'y aura pas de raccourcis comme
i*=10
au lieu dei=i*10
. - Vous n'aurez pas à gérer de
else
cas pendants , donc toutif
peut être associé à unelse
. Ceif(a)if(b)r=0;else r=1;
n'est pas un cas d'entrée possible.if(a)if(b)r=0;else r=1;else r=2;
ouif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
sont cependant. - Les E / S sont flexibles. L'entrée et la sortie peuvent être une chaîne, une liste de caractères, lues depuis STDIN, sorties vers STDOUT, etc. Votre appel.
- Tous les ternaires auront une bonne associativité, comme c'est le standard dans la plupart des langues ( mais pas par exemple en PHP ).
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si possible.
Cas de test:
Input: if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Output: s=i<0?"Neg":i>0?"Pos":"Neut";
Input: if(i%2<1)r=10;else r=20;
Output: r=i%2<1?10:20;
Input: if(n<10)if(m<0)i=0;else i=10;else if(m<0)i=-1;else i=1;
Output: i=n<10?m<0?0:10:m<0?-1:1;
Input: if(i==1)i=0.0;else i=0.25;
Output: i=i==1?0.0:0.25;
Input: if(!a)if(b)r=0;else r=1;else r=2;
Output: r=!a?b?0:1:2;
Input: if(a)if(b)r=0;else r=1;else if(c)r=2;else r=3;
Output: r=a?b?0:1:c?2:3;
Input: if(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
Output: r=a&&b?0:a&&!b?1:-1;
Input: if(i[0]>0)if(j>0)if(q>0)r="q";else r="j";else r="i";else r="other";
Output: r=i[0]>0?j>0?q>0?"q":"j":"i":"other";
Input: if(i>0)r="i";else if(j>0)r="j";else if(q>0)r="q";else r="other";
Output: r=i>0?"i":j>0?"j":q>0?"q":"other";
Input: if(a>0)if(a<2)x="one";else if(a<3)x="two";else if(a<4)x="three";else x="other";else x="other";
Output: x=a>0?a<2?"one":a<3?"two":a<4?"three":"other":"other";
Input: if(b[0]<=b[1])q=5;else if(b[0]==null)q=0;else q=-10;
Output: q=b[0]<=b[1]?5:b[0]==null?0:-10;
if ... then ... else
est l'opérateur ternaire. Donc, si vous écrivez,let result = if 10 > 100 then 99 else -99
la valeur deresult
serait-99
.Réponses:
Retina 0.8.2 , 32 octets
Essayez-le en ligne! Explication:
Traitez un
if
immédiatement avant une affectation en déplaçant l'affectation avant la condition et en ajoutant a?
. L'étape est mise en correspondance de droite à gauche pour garantir que nous obtenons le plus proche de l'affectation, tandis que la\)
garantit que nous ne correspondons paselse
par erreur.Répétez l'étape pour prendre soin des
if
s imbriqués .Toutes les affectations restantes sont
else
s donc remplacez le;else ?=
par un:
.la source
Python 2 ,
126121120114 114100 octetsEssayez-le en ligne!
Enregistré:
la source
Perl 5 -p,
504948 octetsEssayez-le en ligne!
La version 48 octets est inspirée de la réponse de Neil's Retina.
Explication
Ancienne solution de 49 octets
la source
Rubis ,
7271 octetsEssayez-le en ligne!
la source
;else
ouelse
peut être.{5}
pour enregistrer un octet.Java (JDK) ,
119116octetsSolution de regex presque entièrement pure, hachée et changée un peu par rapport à quelques autres réponses.
-3 octets grâce à la supercherie regex de Kevin
Essayez-le en ligne!
Explication
la source
".*(.=).*","$1$0"
vous avez utilisé, c'est 1 octet de moins que ce"^(.*)(.=)","$2$1"
que j'avais en tête. :) Quoi qu'il en soit, vous pouvez enregistrer 2 octets en changeantif\\(
enif.
et un octet supplémentaire en changeant(\\?| )
en([? ])
. Essayez-le en ligne 116 octets .Kakoune v2018.09.04 ,
433837 octetsExplication:
Kakoune est un éditeur modal basé sur une sélection multiple, inspiré de Vim.
x
sélectionner toute la lignes
...<ret>
filtre la sélection avec l'expression régulière\w=(?!=)
, qui correspond à toutes les affectations de variables et ne correspond pas aux==
comparaisonsd
supprimer chaque sélection et mettre son contenu dans le registre par défaut<a-h>
étendre toutes les sélections au début de leur ligneP
collez le contenu du registre par défaut avant chaque sélections
...<ret>
filtrer la sélection avec l'expression régulièreif.
d
supprimer chaque sélectionf
étendre chaque sélection à la suivante)
;
réduire chaque sélection à son curseurr
remplacer chaque caractère de chaque sélection par?
x
sélectionner toute la lignes
...<ret>
filtrer la sélection avec;else<space>
c
...<esc>
effacer chaque sélection et la remplacer par:
animation du code sur un cas de test:
la source
Propre ,
386375216196189 189 octetsRegardez ma, pas de regex!
Essayez-le en ligne!
la source
JavaScript (Node.js) , 80 octets
Essayez-le en ligne!
Merci à Kevin Cruijssen, 2 octets enregistrés.
la source
if\(
peut êtreif.
et;else
peut être;.{5}
d'économiser 2 octets