Em Java / .NET / C / JavaScript / etc. você pode usar ifs ternários para reduzir as instruções if.
Por exemplo (em Java):
// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Pode ser encurtado com um termo ternário para:
s=i<0?"Neg":i>0?"Pos":"Neut";
Desafio:
Entrada: um if-else regular (possível com aninhamento) que define uma única variável.
Saída: o ternário-se convertido.
Regras do desafio:
- Você pode assumir que todos os casos if-else são possíveis sem colchetes (portanto, cada bloco if / else-if / else possui um único corpo).
- Você pode assumir que não haverá espaços, tabulações ou novas linhas, exceto um espaço após cada um
else
(inclusive àselse if
). - Você pode assumir que os nomes das variáveis usadas são sempre uma única letra minúscula (
[a-z]
). - Os valores dados às variáveis podem ser um dos seguintes:
- Cordas (sem espaços / separadores / novas-linhas), que serão rodeadas por aspas (isto é
"Test"
,"SomeString"
,"Example_string"
, etc.). Você pode assumir que as seqüências nunca conterão as substringsif
ouelse
nem espaços, tabulações, novas linhas, aspas duplas (com escape) ou o caractere=
. Ele pode conter os caracteres><(){}[];?:!&|
, mas estará apenas no intervalo ASCII imprimível (['!' (33), '~' (126)]
). - Inteiros (isto é
0
,123
,-55
, etc.) - Decimais (isto é
0.0
,0.123
,-55.55
, etc.)
- Cordas (sem espaços / separadores / novas-linhas), que serão rodeadas por aspas (isto é
- Os valores nunca serão misturados. Portanto, todas as variáveis atribuídas são números inteiros, e algumas não são números inteiros e outras são strings.
- As condições dentro de parêntesis podem conter os seguintes caracteres
=<>!+-/*%&|[]
,a-z
,0-9
. Você pode assumir que não haverá parênteses internos e também pode assumir que não haverá campos (confusos) de mais de um caractere usado (comoif(if<0)
). - Você pode assumir que não haverá atalhos como, em
i*=10
vez dei=i*10
. - Você não precisará lidar com
else
casos pendentes , para que todosif
possam ser combinados com umelse
. Ouif(a)if(b)r=0;else r=1;
seja, não é um caso de entrada possível.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;
são, no entanto. - A E / S é flexível. Entrada e Saída pode ser uma sequência, lista de caracteres, leitura de STDIN, saída para STDOUT, etc. Sua chamada.
- Todos os ternários terão uma associatividade correta, como é o padrão na maioria dos idiomas ( mas não no PHP, por exemplo ).
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se possível.
Casos de teste:
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
é o operador ternário. Então, se você escreverlet result = if 10 > 100 then 99 else -99
, o valor deresult
seria-99
.Respostas:
Retina 0.8.2 , 32 bytes
Experimente online! Explicação:
Manuseie um
if
imediatamente antes de uma atribuição movendo a atribuição antes da condição e anexando a?
. O estágio é correspondido da direita para a esquerda para garantir que chegamos o mais próximo possível da tarefa, enquanto\)
garante que não correspondemoselse
por engano.Repita o estágio para cuidar de
if
s aninhados .Quaisquer atribuições restantes são
else
s, então substitua;else ?=
por a:
.fonte
Python 2 ,
126121120114100 bytesExperimente online!
Salvou:
fonte
Perl 5 -p,
504948 bytesExperimente online!
A versão de 48 bytes é inspirada na resposta Retina de Neil.
Explicação
Solução antiga de 49 bytes
fonte
Ruby ,
7271 bytesExperimente online!
fonte
;else
ouelse
pode ser.{5}
para salvar um byte.Java (JDK) ,
119116 bytesSolução regex quase totalmente pura, cortada e alterada um pouco em algumas das outras respostas.
-3 bytes graças a mais alguns truques de regex de Kevin
Experimente online!
Explicação
fonte
".*(.=).*","$1$0"
que você usou, é 1 byte menor que o que"^(.*)(.=)","$2$1"
eu tinha em mente. :) De qualquer forma, você pode salvar 2 bytes mudandoif\\(
paraif.
e um byte adicional mudando(\\?| )
para([? ])
. Experimente online 116 bytes .Kakoune v2018.09.04 ,
433837 bytesExplicação:
Kakoune é um editor modal baseado em seleção múltipla, inspirado no Vim.
x
selecione a linha inteiras
...<ret>
filtre a seleção com a expressão regular\w=(?!=)
, que corresponde a todas as atribuições de variáveis e não corresponde às==
comparaçõesd
exclua cada seleção e coloque seu conteúdo no registro padrão<a-h>
estender todas as seleções para o início de sua linhaP
cole o conteúdo do registro padrão antes de cada seleçãos
...<ret>
filtre a seleção com a expressão regularif.
d
excluir cada seleçãof
estender cada seleção para a próxima)
;
reduza cada seleção ao seu cursorr
substitua cada caractere de cada seleção por?
x
selecione a linha inteiras
...<ret>
filtre a seleção com;else<space>
c
...<esc>
limpe cada seleção e substitua-a por:
animação do código em um caso de teste:
fonte
Limpos ,
386375216196189 bytesOlha ma, sem regex!
Experimente online!
fonte
JavaScript (Node.js) , 80 bytes
Experimente online!
Graças a Kevin Cruijssen, 2 bytes foram salvos.
fonte
if\(
pode serif.
e;else
pode ser;.{5}
para salvar 2 bytes #