В Java / .NET / C / JavaScript / и т. Д. Вы можете использовать троичные-ifs для сокращения if-операторов.
Например (на Java):
// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Можно укоротить на троицу, если:
s=i<0?"Neg":i>0?"Pos":"Neut";
Вызов:
Входные данные: обычный if-else (возможно с вложением), который устанавливает одну переменную.
Выход: преобразованный троичный-если.
Правила соревнований:
- Вы можете предположить, что все случаи if-else возможны без скобок (поэтому каждый блок if / else-if / else имеет одно тело).
- Вы можете предположить, что не будет пробелов, табуляции или новых строк, за исключением одного пробела после каждого
else
(включая atelse if
). - Вы можете предположить, что используемые имена переменных всегда состоят из одной строчной буквы (
[a-z]
). - Значения, данные переменным, могут быть одним из:
- Строки (без пробелов / вкладки / новая строка), которые будут окружены двойными кавычками (например
"Test"
,"SomeString"
,"Example_string"
и т.д.). Вы можете предположить, что строки никогда не будут содержать подстрокif
илиelse
, и при этом они не будут содержать пробелы, табуляции, новые строки, (экранированные) двойные кавычки или символ=
. Он может содержать символы><(){}[];?:!&|
, но будет только в диапазоне ASCII для печати (['!' (33), '~' (126)]
). - Целые (то есть
0
,123
,-55
и т.д.) - Десятичные (то есть
0.0
,0.123
,-55.55
и т.д.)
- Строки (без пробелов / вкладки / новая строка), которые будут окружены двойными кавычками (например
- Значения никогда не будут смешаны. Таким образом, все назначенные переменные являются целыми числами, а некоторые не являются целыми числами, а некоторые являются строками.
- Условия в круглых скобках может содержать следующие символы
=<>!+-/*%&|[]
,a-z
,0-9
. Вы можете предположить, что не будет никаких внутренних скобок, и вы также можете предположить, что не будет никаких (сбивающих с толку) полей из более чем одного используемого символа (напримерif(if<0)
). - Вы можете предположить, что не будет никаких ярлыков, как
i*=10
вместоi=i*10
. - Вам не придется обрабатывать висячие
else
случаи, так что всеif
может быть в паре сelse
. Т.е.if(a)if(b)r=0;else r=1;
это не возможный случай ввода.if(a)if(b)r=0;else r=1;else r=2;
илиif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
однако. - Ввод / вывод является гибким. Ввод и вывод может быть строкой, списком символов, считыванием из STDIN, выводом в STDOUT и т. Д. Ваш вызов.
- Все троицы будут иметь правильную ассоциативность, как это принято в большинстве языков ( но не в, например, PHP ).
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это возможно.
Тестовые случаи:
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
это троичный оператор. Так что если вы напишите,let result = if 10 > 100 then 99 else -99
то значениеresult
будет-99
.Ответы:
Сетчатка 0.8.2 , 32 байта
Попробуйте онлайн! Объяснение:
Обработайте
if
непосредственно перед назначением, переместив назначение перед условием и добавив a?
. Этап сопоставляется справа налево, чтобы гарантировать, что мы получим, если ближе всего к назначению, в то время как\)
гарантирует, что мы не совпадаемelse
по ошибке.Повторите этап, чтобы заботиться о вложенных
if
с.Все остальные присвоения
else
ей так заменить;else ?=
с:
.источник
Python 2 ,
126121120114100 байтПопробуйте онлайн!
Добавлено:
источник
Perl 5 -p,
504948 байтовПопробуйте онлайн!
48-байтовая версия основана на ответе Нейла Retina.
объяснение
Старое 49-байтовое решение
источник
Рубин ,
7271 байтПопробуйте онлайн!
источник
;else
илиelse
можно.{5}
сохранить байт.Java (JDK) ,
119116 байтПочти полностью чистое решение для регулярных выражений, отрубленное и немного измененное из пары других ответов.
-3 байта, благодаря еще одному трюку с регулярными выражениями от Кевина
Попробуйте онлайн!
объяснение
источник
".*(.=).*","$1$0"
вы использовали, это на 1 байт короче, чем"^(.*)(.=)","$2$1"
я имел в виду. :) В любом случае, вы можете сохранить 2 байта, изменяяif\\(
на,if.
и дополнительный байт, изменяющийся(\\?| )
на([? ])
. Попробуйте онлайн 116 байт .Kakoune v2018.09.04 ,
433837 байтовОбъяснение:
Kakoune - модальный редактор с множественным выбором, вдохновленный Vim.
x
выбрать всю строкуs
...<ret>
фильтровать выделение с помощью регулярного выражения\w=(?!=)
, которое соответствует всем назначениям переменных и не соответствует==
сравнениямd
удалить каждый выбор и поместить его содержимое в регистр по умолчанию<a-h>
расширить все выборки до начала их строкиP
вставлять содержимое регистра по умолчанию перед каждым выборомs
...<ret>
отфильтровать выделение с помощью регулярного выраженияif.
d
удалить каждый выборf
расширить каждый выбор вперед к следующему)
;
уменьшить каждый выбор до его курсораr
заменить каждый символ каждого выбора на?
x
выбрать всю строкуs
...<ret>
отфильтруйте выбор с помощью;else<space>
c
...<esc>
очистить каждый выбор и заменить его:
анимация кода на тестовом примере:
источник
Чистый ,
386375216196189 байтСмотри, мама, нет регулярных выражений!
Попробуйте онлайн!
источник
JavaScript (Node.js) , 80 байт
Попробуйте онлайн!
Благодаря Кевину Круйссену сэкономлено 2 байта.
источник
if\(
можноif.
и;else
можно;.{5}
сэкономить 2 байта