W Javie / .NET / C / JavaScript / itp. możesz użyć trójskładnikowych ifs, aby skrócić instrukcje if.
Na przykład (w Javie):
// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Można skrócić trójskładnikiem, jeśli:
s=i<0?"Neg":i>0?"Pos":"Neut";
Wyzwanie:
Dane wejściowe: regularny if-else (możliwe z zagnieżdżaniem), który ustawia jedną zmienną.
Dane wyjściowe: skonwertowane trójskładnikowe-jeśli.
Zasady konkursu:
- Możesz założyć, że wszystkie przypadki if-else są możliwe bez nawiasów kwadratowych (więc każdy blok if / else-if / else ma jedną treść).
- Możesz założyć, że nie będzie żadnych spacji, tabulatorów ani nowych wierszy, z wyjątkiem pojedynczego spacji po każdym
else
(w tym atelse if
). - Możesz założyć, że używane nazwy zmiennych są zawsze pojedynczymi małymi literami (
[a-z]
). - Wartości podane zmiennym mogą być jedną z:
- Struny (bez spacji / tabs / nowe-lines), które zostaną otoczone cudzysłowami (czyli
"Test"
,"SomeString"
,"Example_string"
, itd.). Możesz założyć, że ciągi nigdy nie będą zawierać podłańcuchówif
anielse
też nie będą zawierać spacji, tabulatorów, znaków nowej linii, (znaków zmiany znaczenia) podwójnych cudzysłowów ani znaku=
. Może zawierać znaki><(){}[];?:!&|
, ale będzie tylko w zakresie do wydruku ASCII (['!' (33), '~' (126)]
). - Całkowitymi (czyli
0
,123
,-55
, itd.) - Dziesiętnych (czyli
0.0
,0.123
,-55.55
, itd.)
- Struny (bez spacji / tabs / nowe-lines), które zostaną otoczone cudzysłowami (czyli
- Wartości nigdy się nie zmieszają. Zatem wszystkie przypisane zmienne są liczbami całkowitymi, a nie niektóre są liczbami całkowitymi, a niektóre są łańcuchami.
- Warunki w nawiasie może zawierać następujące znaki
=<>!+-/*%&|[]
,a-z
,0-9
. Możesz założyć, że nie będzie żadnych wewnętrznych nawiasów, a także możesz założyć, że nie będzie żadnych (mylących) pól więcej niż jednego znaku (jakif(if<0)
). - Możesz założyć, że nie będzie żadnych skrótów takich jak
i*=10
zamiasti=i*10
. - Nie będziesz musiał zajmować się wiszącymi
else
sprawami, więc wszystkoif
można połączyć zelse
. Tj.if(a)if(b)r=0;else r=1;
Nie jest możliwym przypadkiem wejściowym.if(a)if(b)r=0;else r=1;else r=2;
lubif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
są jednak. - I / O jest elastyczny. Dane wejściowe i wyjściowe mogą być ciągiem znaków, listą znaków, odczytanymi ze STDIN, wyjściowymi do STDOUT itp. Twoje połączenie.
- Wszystkie trójskładniki będą miały odpowiednie skojarzenie, co jest standardem w większości języków ( ale nie na przykład w PHP ).
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- Jeśli to możliwe, dodaj wyjaśnienie.
Przypadki testowe:
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
występuje operator trójskładnikowy. Więc jeśli napiszesz,let result = if 10 > 100 then 99 else -99
to wartośćresult
będzie-99
.Odpowiedzi:
Retina 0.8.2 , 32 bajty
Wypróbuj online! Wyjaśnienie:
Obsługuj
if
bezpośrednio przed zadaniem, przenosząc zadanie przed warunkiem i dołączając?
. Etap jest dopasowywany od prawej do lewej, aby upewnić się, że otrzymamy najbliższe zadanie, a jednocześnie\)
gwarantuje, że nie dopasujemy sięelse
przez pomyłkę.Powtórz etap, aby zająć się zagnieżdżonymi
if
.Wszelkie pozostałe zadania są
else
s więc wymienić;else ?=
z:
.źródło
Python 2 ,
126121120114100 bajtówWypróbuj online!
Zapisano:
źródło
Perl 5- p,
504948 bajtówWypróbuj online!
Wersja 48-bajtowa jest inspirowana odpowiedzią Neila na Retinę.
Wyjaśnienie
Stare 49 bajtowe rozwiązanie
źródło
Rubin ,
7271 bajtówWypróbuj online!
źródło
;else
alboelse
można.{5}
zapisać bajt.Java (JDK) ,
119116 bajtówPrawie całkowicie czyste rozwiązanie wyrażenia regularnego, posiekane i zmienione nieco z kilku innych odpowiedzi.
-3 bajty dzięki dodatkowej sztuczce wyrażeń regularnych od Kevina
Wypróbuj online!
Wyjaśnienie
źródło
".*(.=).*","$1$0"
którego używałeś, jest o 1 bajt krótszy niż"^(.*)(.=)","$2$1"
miałem na myśli. :) W każdym razie możesz zapisać 2 bajtyif\\(
naif.
i dodatkowy bajt(\\?| )
na([? ])
. Wypróbuj online 116 bajtów .Kakoune v2018.09.04 ,
433837 bajtówWyjaśnienie:
Kakoune to edytor modalny oparty na wielu selekcjach, zainspirowany przez Vima.
x
wybierz całą linięs
...<ret>
filtruj zaznaczenie za pomocą wyrażenia regularnego\w=(?!=)
, które pasuje do wszystkich przypisań zmiennych i nie pasuje do==
porównańd
usuń każdy wybór i umieść jego zawartość w rejestrze domyślnym<a-h>
rozciągnij wszystkie zaznaczenia na początek ich liniiP
wklej zawartość rejestru domyślnego przed każdym wyborems
...<ret>
filtruj zaznaczenie za pomocą wyrażenia regularnegoif.
d
usuń każdy wybórf
przedłużyć każdy wybór do następnego)
;
zmniejsz każdy wybór do jego kursorar
zamień każdy znak każdego wyboru na?
x
wybierz całą linięs
...<ret>
filtruj zaznaczenie za pomocą;else<space>
c
...<esc>
wyczyść każdy wybór i zastąp go:
animacja kodu na przypadku testowym:
źródło
Czysty ,
386375216196189 bajtówSpójrz, nie ma wyrażeń regularnych!
Wypróbuj online!
źródło
JavaScript (Node.js) , 80 bajtów
Wypróbuj online!
Dzięki Kevinowi Cruijssenowi zaoszczędzono 2 bajty.
źródło
if\(
możnaif.
i;else
można;.{5}
zaoszczędzić 2 bajty