Üçlü-if Dönüştürücü


18

Java / .NET / C / JavaScript / vb. if-ifadelerini kısaltmak için üçlü-ifs kullanabilirsiniz.

Örneğin (Java'da):

// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";

Üçlü-if ile kısaltılabilir:

s=i<0?"Neg":i>0?"Pos":"Neut";

Meydan okuma:

Girdi: Tek bir değişken ayarlayan normal bir if-else (yuvalama ile mümkündür).

Çıktı: Dönüştürülmüş üçlü-if.

Zorluk kuralları:

  • Parantez olmadan tüm if-else durumlarının mümkün olduğunu varsayabilirsiniz (bu nedenle, eğer if / else-if / else bloğunun tek bir gövdesi vardır).
  • Her birinden sonra tek bir boşluk else(at dahil else if) dışında boşluk, sekme veya yeni satır olmayacağını varsayabilirsiniz .
  • Kullanılan değişken adlarının her zaman tek bir küçük harf ( [a-z]) olduğunu varsayabilirsiniz .
  • Değişkenlere verilen değerler şunlardan biri olabilir:
    • Çift tırnak çevrili olacak (yani, (boşluk / tablet / yeni satır olmadan) Yaylı "Test", "SomeString", "Example_string"vb.) Dizelerin hiçbir zaman alt dizeleri içermediğini ifveya elseboşluk, sekme, yeni satır, (çıkış karakterli) çift tırnak işareti veya karakter içermeyeceğini varsayabilirsiniz =. Karakterleri içerebilir ><(){}[];?:!&|, ancak yalnızca yazdırılabilir ASCII aralığında olacaktır ( ['!' (33), '~' (126)]).
    • Tamsayılar (yani 0, 123, -55vs.)
    • Ondalık (yani 0.0, 0.123, -55.55vs.)
  • Değerler asla karıştırılmayacak. Böylece atanan tüm değişkenler tamsayıdır, bazıları tamsayı değildir ve bazıları dizgidir.
  • Parantez içindeki koşullar aşağıdaki karakterleri içerebilir =<>!+-/*%&|[], a-z, 0-9. Herhangi bir iç parantez olmayacağını ve ayrıca kullanılan birden fazla karakterin (örneğin if(if<0)) herhangi bir (kafa karıştırıcı) alanının olmayacağını varsayabilirsiniz .
  • Bunun i*=10yerine kısayolların olmayacağını varsayabilirsiniz i=i*10.
  • Sarkan elsedavalarla uğraşmanıza gerek kalmayacak , böylece hepsi bir ifile eşleştirilebilir else. Yani if(a)if(b)r=0;else r=1;olası bir giriş durumu değil. if(a)if(b)r=0;else r=1;else r=2;veya if(a&&b)r=0;else if(a&&!b)r=1;else r=-1;vardır.
  • G / Ç esnektir. Giriş ve Çıkış bir dize, karakter listesi, STDIN'den okunabilir, STDOUT'a çıktı vb. Olabilir.
  • Tüm dillerin çoğu dilde standart olduğu gibi ( ancak PHP'de değil ) doğru bir ilişkilendirmesi olacaktır .

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyon / yöntemi uygun parametreler ve dönüş tipi, tam programlar ile kullanmanıza izin verilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, mümkünse lütfen bir açıklama ekleyin.

Test senaryoları:

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;

Teknik olarak, F # if ... then ... else'da üçlü operatör. Yani eğer yazarsanız let result = if 10 > 100 then 99 else -99değeri resultolur -99.
Ciaran_McCarthy

1
@Ciaran_McCarthy Varsayılan olarak koşullu ifadelere sahip tüm işlevsel eğilimli diller olmasa da çoğu için böyle olmasını beklerdim. Clojure, Scala ve Haskell aynı.
Carcigenicate

@tsh Hata! Çalışma gününden sonra akşam geç saatlerde test senaryoları eklememeliyim .. Sabit.
Kevin Cruijssen

2
JavaScript Kompresör Kapatma Derleyicisi tüm bu test senaryolarında harika çalışıyor. Hangi verilen girişleri alırken sadece beklenen çıktıları üretecekti. Ama öyle görünüyor ki bir cevap olarak iddia edemem. Bu yüzden buraya yorum yapmak istiyorum.
tsh

Yanıtlar:


5

Retina 0.8.2 , 32 bayt

+r`if.(.*?)\)(.=)
$2$1?
;.{6}=
:

Çevrimiçi deneyin! Açıklama:

r`if.(.*?)\)(.=)
$2$1?

Bir Kulp ifkoşulu önce atama hareketli ve ekler ekleyerek atama hemen önce ?. Sahne, ödeve en yakın olanı almamızı sağlamak için sağdan sola \)eşleştirilirken else, yanlışlıkla eşleşmememizi sağlar .

+

Yuvalanmış ifs dikkat çekmek için sahne tekrarlayın .

;.{6}=
:

Kalan tüm ödevler elsebu nedenle yerine ;else ?=a :.


@nwellnhof Bunu işaret ettiğiniz için teşekkür ederiz; Ben test durumlarda çalıştı çünkü orada bir bayt golf düşündüm.
Neil

6

Piton 2 , 126 121 , 120 114 , 100 bayt

lambda s:findall(' (.=)',s)[0]+sub('if.(.*?)\)(.=)?',r'\1?',sub('.{5} (.=)?',':',s))
from re import*

Çevrimiçi deneyin!


Kaydedilen:

  • -1 bayt, Kevin Cruijssen sayesinde

@KevinCruijssen Teşekkürler :)
TFeld

1
İçe aktarma işleminden önce işlev tanımı neden?
Skyler

@Skyler Aslında önemli değil, ancak ödevi başlığa bu şekilde koymak daha kolay
Jo King

6

Perl 5 -p, 50 49 48 bayt

s/if.(.*?)\)(.=)/\2\1?/g;s/.if./?/g;s/;.{6}=/:/g

Çevrimiçi deneyin!

48 baytlık sürümü Neil'in Retina yanıtından esinlenmiştir.

açıklama

# Replace "if(e1)if(e2)x=" with "x=e1)if(e2?"
s/if.(.*?)\)(.=)/\2\1?/g;
# Replace ")if(" with "?"
s/.if./?/g;
# Replace ";else x=" with ":"
s/;.{6}=/:/g

Eski 49 bayt çözümü

s/.{5} (.=)?/:/g;s/if.(.*?)\)(.=)?/\1?/g;$_=$2.$_


3

Java (JDK) , 119 116 bayt

Neredeyse tamamen saf regex çözümü, doğranmış ve diğer birkaç cevaptan biraz değişti.

Kevin'in biraz daha regex hilesi sayesinde -3 byte

s->s.replaceAll(".*(.=).*","$1$0").replaceAll("if.(.*?)\\)","$1?").replaceAll("([ ?]).=","$1").replace(";else ",":")

Çevrimiçi deneyin!

açıklama

s->                                         // Lambda function taking a String
   s.replaceAll(".*(.=).*","$1$0")          // Find assigned variable and append to start of String
    .replaceAll("if.(.*?)\\)","$1?")        // Replace any 'if' statements with their condition
                                            // followed by '?'
    .replaceAll("([? ]).=","$1")            // Remove all assignments after a '?' or space
    .replace(";else ",":");                 // Simple replace (no regex) to remove 'else' statements

1
".*(.=).*","$1$0"Kullandığını seviyorum, "^(.*)(.=)","$2$1"aklımdakinden 1 bayt daha kısa . :) Neyse, değişen 2 bayt kaydedebilirsiniz if\\(için if.ve ek bir bayt değişen (\\?| )için ([? ]). Çevrimiçi 116 bayt deneyin .
Kevin Cruijssen

@KevinCruijssen Şerefe! Regex'i eritmek için çok uzun zaman harcadım, bunu kaçırdığımı düşünemiyorum!
Luke Stevens

3

Kakoune v2018.09.04 , 43 38 37 bayt

xs\w=(?!=)<ret>d<a-h>Psif.<ret>df);r?xs;else<space><ret>c:<esc>

Açıklama:

Kakoune, Vim'den esinlenen çoktan seçmeli, modsal bir editördür.

  1. x bütün çizgiyi seç

  2. s... <ret>seçimi \w=(?!=), tüm değişken atamalarıyla eşleşen ve ==karşılaştırmalarla eşleşmeyen normal ifadeyle filtreleyin

  3. d her seçimi sil ve içeriğini varsayılan kayıt defterine koy

  4. <a-h> tüm seçimleri satırlarının başına kadar genişlet

  5. P her seçimden önce varsayılan kaydın içeriğini yapıştırın

  6. s... <ret>seçimi normal ifadeyle filtreleyinif.

  7. d her seçimi sil

  8. f her seçimi bir sonrakine ileri doğru genişlet )

  9. ; her seçimi imlecine indir

  10. r her seçimin her karakterini ?

  11. x bütün çizgiyi seç

  12. s... <ret>ile seçimi filtreleyin;else<space>

  13. c... <esc>her seçimi temizleyin ve:

bir test senaryosundaki kodun animasyonu:

Kod Çalışıyor


1
Hmm, daha önce hiç Kakoune duymadım. Bunun için herhangi bir çevrimiçi derleyici yok sanırım? Değilse, istendiği gibi çalıştığını doğrulayabilmem için bazı test senaryolarının bazı ekran görüntülerini belki ekleyebilir misiniz? Bu dil ise, ayrıca, içinde Dennis irtibata olabilir talk.tryitonline.net sohbet o eklemek sormak için TIO .
Kevin Cruijssen

1
@KevinCruijssen Ben test vakalarından biri gif ekledi. Hepsi üzerinde çalışır, ancak gifleri yapmak önemsiz değildir.
Vaelus

Açıklama ve gif için teşekkürler, benden +1. :) Her zaman yeni bir dil öğrenmek güzel.
Kevin Cruijssen

2

Temiz , 386 375 216 196 189 bayt

Bak anne, normal ifade yok!

import StdEnv,Data.List
?[_,'=':b]= $b
?b= $b
$['if(':s]#(h,[_:t])=span((<>)')')s
=h++['?': ?t]
$[';else ':s]=[':': ?s]
$[a:b]|b>[]=[a: $b]=b
@s=hd[[v,e: $s]\\['else ',v,e=:'=':_]<-tails s]

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.