In Java / .NET / C / JavaScript / etc. Sie können ternary-ifs verwenden, um if-Anweisungen zu verkürzen.
Zum Beispiel (in Java):
// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Kann mit einem ternären gekürzt werden, wenn:
s=i<0?"Neg":i>0?"Pos":"Neut";
Herausforderung:
Eingabe: Ein reguläres if-else (mit Verschachtelung möglich), das eine einzelne Variable festlegt.
Ausgabe: Das konvertierte ternäre If.
Herausforderungsregeln:
- Sie können davon ausgehen, dass alle if-else-Fälle ohne eckige Klammern möglich sind (daher hat jeder if / else-if / else-Block einen einzigen Körper).
- Sie können davon ausgehen, dass es keine Leerzeichen, Tabulatoren oder Zeilenumbrüche gibt, mit Ausnahme eines einzelnen Leerzeichens nach jedem
else
(einschließlich atelse if
). - Sie können davon ausgehen, dass die verwendeten Variablennamen immer nur Kleinbuchstaben sind (
[a-z]
). - Die Werte für die Variablen können folgende sein:
- Strings (ohne Leerzeichen / Tabs / new-Linien), die durch doppelte Anführungszeichen gesetzt wird (dh
"Test"
,"SomeString"
,"Example_string"
, etc.). Sie können davon ausgehen, dass die Zeichenfolgen niemals die Teilzeichenfolgenif
oderelse
Leerzeichen, Tabulatoren, Zeilenumbrüche, Anführungszeichen oder das Zeichen enthalten=
. Es kann die Zeichen enthalten><(){}[];?:!&|
, liegt jedoch nur im druckbaren ASCII-Bereich (['!' (33), '~' (126)]
). - Integers (dh
0
,123
,-55
, etc.) - Dezimalzahlen (dh
0.0
,0.123
,-55.55
, etc.)
- Strings (ohne Leerzeichen / Tabs / new-Linien), die durch doppelte Anführungszeichen gesetzt wird (dh
- Die Werte werden niemals gemischt. Alle zugewiesenen Variablen sind also Ganzzahlen, und nicht einige sind Ganzzahlen und einige sind Zeichenfolgen.
- Die Bedingungen in Klammern können die folgenden Zeichen enthalten
=<>!+-/*%&|[]
,a-z
,0-9
. Sie können davon ausgehen, dass es keine inneren Klammern gibt, und Sie können auch davon ausgehen, dass keine (verwirrenden) Felder mit mehr als einem Zeichen verwendet werden (wieif(if<0)
). - Sie können davon ausgehen, dass es keine Abkürzungen wie
i*=10
statt gibti=i*10
. - Sie müssen keine baumelnden
else
Fälle bearbeiten , sodass alleif
mit einem gepaart werden könnenelse
. Dhif(a)if(b)r=0;else r=1;
kein möglicher Eingabefall.if(a)if(b)r=0;else r=1;else r=2;
oderif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
sind es aber. - I / O ist flexibel. Eingabe und Ausgabe können eine Zeichenfolge, eine Liste von Zeichen sein, die von STDIN gelesen, an STDOUT ausgegeben werden usw. Ihr Anruf.
- Alle Ternaries werden eine richtige Assoziativität haben, wie es der Standard in den meisten Sprachen ist ( aber nicht zum Beispiel in PHP ).
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie nach Möglichkeit auch eine Erklärung hinzu.
Testfälle:
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
der ternäre Operator. Wenn Sie also schreiben, wärelet result = if 10 > 100 then 99 else -99
der Wert von .result
-99
Antworten:
Retina 0.8.2 , 32 Bytes
Probieren Sie es online! Erläuterung:
Behandeln Sie eine
if
unmittelbar vor einer Zuordnung, indem Sie die Zuordnung vor der Bedingung verschieben und eine hinzufügen?
. Die Bühne ist von rechts nach links abgeglichen, um sicherzustellen,\)
dass wir der Aufgabe am nächsten kommen, während sichergestellt wird, dass wir nicht versehentlich übereinstimmenelse
.Wiederholen Sie den Vorgang, um sich um verschachtelte
if
s zu kümmern .Verbleibende Zuordnungen werden
else
durch;else ?=
a ersetzt:
.quelle
Python 2 ,
126121120114100 BytesProbieren Sie es online!
Gerettet:
quelle
Perl 5 -p,
504948 BytesProbieren Sie es online!
Die 48-Byte-Version ist von Neils Retina-Antwort inspiriert.
Erläuterung
Alte 49-Byte-Lösung
quelle
Ruby ,
7271 BytesProbieren Sie es online!
quelle
;else
oderelse
kann sein.{5}
, ein Byte zu speichern.Java (JDK) ,
119 bis116 ByteFast völlig reine Regex-Lösung, gehackt und ein bisschen verändert von ein paar anderen Antworten.
-3 Bytes dank mehr Regex-Trick von Kevin
Probieren Sie es online!
Erläuterung
quelle
".*(.=).*","$1$0"
du benutzt hast, es ist 1 Byte kürzer als das, was"^(.*)(.=)","$2$1"
ich mir vorgestellt habe. :) Wie auch immer, können Sie 2 Bytes speichern Wechselif\\(
aufif.
und ein zusätzliches Byte Wechsel(\\?| )
zu([? ])
. Probieren Sie es online 116 Bytes .Kakoune v2018.09.04 ,
433837 BytesErläuterung:
Kakoune ist ein auf Mehrfachauswahl basierender, modaler Editor, der von Vim inspiriert wurde.
x
wähle die ganze Zeile auss
...<ret>
filtern Sie die Auswahl mit dem regulären Ausdruck\w=(?!=)
, der allen Variablenzuweisungen und nicht den==
Vergleichen entsprichtd
lösche jede Auswahl und füge ihren Inhalt in das Standardregister ein<a-h>
Erweitern Sie alle Auswahlen bis zum Anfang ihrer ZeileP
Fügen Sie den Inhalt des Standardregisters vor jeder Auswahl eins
...<ret>
filtern Sie die Auswahl mit dem regulären Ausdruckif.
d
lösche jede Auswahlf
Erweitern Sie jede Auswahl vorwärts zur nächsten)
;
Reduzieren Sie jede Auswahl auf ihren Cursorr
Ersetzen Sie jedes Zeichen jeder Auswahl durch?
x
wähle die ganze Zeile auss
...<ret>
filtern Sie die Auswahl mit;else<space>
c
...<esc>
löschen Sie jede Auswahl und ersetzen Sie sie durch:
Animation des Codes an einem Testfall:
quelle
Sauber ,
386375216196189 BytesSchau ma, kein Regex!
Probieren Sie es online!
quelle
JavaScript (Node.js) , 80 Byte
Probieren Sie es online!
Dank Kevin Cruijssen konnten 2 Bytes eingespart werden.
quelle
if\(
kann seinif.
und;else
kann sein;.{5}
, 2 Bytes zu sparen