En Java / .NET / C / JavaScript / etc. puedes usar ternary-ifs para acortar sentencias if.
Por ejemplo (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";
Se puede acortar con un ternario si:
s=i<0?"Neg":i>0?"Pos":"Neut";
Desafío:
Entrada: Un if-else regular (posible con anidamiento) que establece una sola variable.
Salida: El ternario convertido si.
Reglas de desafío:
- Puede suponer que todos los casos if-else son posibles sin corchetes (por lo que cada bloque if / else-if / else tiene un solo cuerpo).
- Puede suponer que no habrá espacios, pestañas o nuevas líneas, excepto un solo espacio después de cada uno
else
(incluido enelse if
). - Puede suponer que los nombres de variables utilizados son siempre una letra minúscula (
[a-z]
). - Los valores dados a las variables pueden ser uno de:
- Cuerdas (sin espacios / tabs / nuevos líneas), que estará rodeado por comillas dobles (es decir
"Test"
,"SomeString"
,"Example_string"
, etc.). Puede suponer que las cadenas nunca contendrán las subcadenasif
o queelse
tampoco contendrán espacios, tabulaciones, líneas nuevas, comillas dobles (escapadas) o el carácter=
. Puede contener los caracteres><(){}[];?:!&|
, pero solo estará en el rango ASCII imprimible (['!' (33), '~' (126)]
). - Los enteros (es decir
0
,123
,-55
, etc.) - Decimales (es decir
0.0
,0.123
,-55.55
, etc.)
- Cuerdas (sin espacios / tabs / nuevos líneas), que estará rodeado por comillas dobles (es decir
- Los valores nunca se mezclarán. Entonces, todas las variables asignadas son enteros, y no algunas son enteras y algunas son cadenas.
- Las condiciones dentro de paréntesis pueden contener los siguientes caracteres
=<>!+-/*%&|[]
,a-z
,0-9
. Puede suponer que no habrá paréntesis internos, y también puede suponer que no habrá campos (confusos) de más de un carácter utilizado (comoif(if<0)
). - Puede suponer que no habrá atajos como en
i*=10
lugar dei=i*10
. - No tendrá que manejar
else
casos colgantes , por lo que todosif
se pueden combinar con unelse
. Es decir,if(a)if(b)r=0;else r=1;
no es un posible caso de entrada.if(a)if(b)r=0;else r=1;else r=2;
oif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
son sin embargo. - I / O es flexible. La entrada y salida puede ser una cadena, una lista de caracteres, leer desde STDIN, salir a STDOUT, etc. Su llamada.
- Todos los ternaries tendrán una asociatividad correcta, como es el estándar en la mayoría de los lenguajes ( pero no en PHP, por ejemplo ).
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede utilizar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es posible.
Casos de prueba:
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
es el operador ternario. Entonces, si escribes,let result = if 10 > 100 then 99 else -99
entonces el valor deresult
sería-99
.Respuestas:
Retina 0.8.2 , 32 bytes
Pruébalo en línea! Explicación:
Maneje una
if
tarea inmediatamente antes de una tarea moviéndola antes de la condición y agregando a?
. El escenario se combina de derecha a izquierda para garantizar que obtengamos el más cercano a la tarea, mientras que el\)
que garantiza que no coincidamoselse
por error.Repita la etapa para cuidar anidados
if
s .Cualquier asignación restante es
else
s, así que reemplácela;else ?=
con a:
.fuente
Python 2 ,
126121120114100 bytesPruébalo en línea!
Salvado:
fuente
Perl 5 -p,
504948 bytesPruébalo en línea!
La versión de 48 bytes está inspirada en la respuesta Retina de Neil.
Explicación
Solución antigua de 49 bytes
fuente
rubí ,
7271 bytesPruébalo en línea!
fuente
;else
oelse
puede ser.{5}
para salvar a un byte.Java (JDK) ,
119bytesSolución regex casi completamente pura, picada y cambiada un poco de algunas de las otras respuestas.
-3 bytes gracias a algunos trucos de expresiones regulares de Kevin
Pruébalo en línea!
Explicación
fuente
".*(.=).*","$1$0"
que has usado, es 1 byte más corto que el"^(.*)(.=)","$2$1"
que tenía en mente. :) De todos modos, puede guardar 2 bytes cambiandoif\\(
aif.
y un byte adicional cambiando(\\?| )
a([? ])
. Pruébelo en línea 116 bytes .Kakoune v2018.09.04 ,
433837 bytesExplicación:
Kakoune es un editor modal basado en selección múltiple, inspirado en Vim.
x
seleccione toda la líneas
...<ret>
filtra la selección con la expresión regular\w=(?!=)
, que coincide con todas las asignaciones de variables, y no coincide con las==
comparacionesd
eliminar cada selección y poner su contenido en el registro predeterminado<a-h>
extender todas las selecciones al comienzo de su líneaP
pegue el contenido del registro predeterminado antes de cada seleccións
...<ret>
filtra la selección con la expresión regularif.
d
eliminar cada selecciónf
extender cada selección hacia adelante a la siguiente)
;
reducir cada selección a su cursorr
reemplazar cada personaje de cada selección con?
x
seleccione toda la líneas
...<ret>
filtrar la selección con;else<space>
c
...<esc>
borre cada selección y reemplácela con:
Animación del código en un caso de prueba:
fuente
Limpio ,
386375216196189 bytesMira ma, no regex!
Pruébalo en línea!
fuente
JavaScript (Node.js) , 80 bytes
Pruébalo en línea!
Gracias a Kevin Cruijssen, 2 bytes guardados.
fuente
if\(
puede serif.
y;else
puede ser;.{5}
para guardar 2 bytes