Ternary-if Converter


18

ใน Java / .NET / C / JavaScript / ฯลฯ คุณสามารถใช้ ternary-ifs เพื่อตัดคำสั่ง if-shorten ให้สั้นลง

ตัวอย่าง (ใน Java):

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

สามารถย่อให้สั้นด้วย ternary- หาก:

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

ท้าทาย:

อินพุต: if-else ปกติ (เป็นไปได้ด้วยการซ้อน) ที่ตั้งค่าตัวแปรเดียว

เอาต์พุต: ternary ที่แปลงแล้วหาก

กฏท้าทาย:

  • คุณสามารถสมมติว่ากรณีอื่นทั้งหมดเป็นไปได้โดยไม่ต้องวงเล็บ (ดังนั้นถ้าบล็อกอื่น / if- ถ้า / อื่นมีร่างกายเดียว)
  • คุณสามารถสันนิษฐานได้ว่าจะไม่มีช่องว่างแท็บหรือบรรทัดใหม่ยกเว้นช่องว่างเดียวหลังจากแต่ละช่องelse(รวมถึงที่else 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*=10i=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;อย่างไรก็ตาม
  • I / O ยืดหยุ่นได้ อินพุตและเอาต์พุตสามารถเป็นสตริงรายการอักขระอ่านจาก STDIN, เอาต์พุตไปยัง STDOUT ฯลฯ การโทรของคุณ
  • Ternaries ทั้งหมดจะมีการเชื่อมโยงที่ถูกต้องเช่นเดียวกับมาตรฐานในภาษาส่วนใหญ่ ( แต่ไม่ใช่ในตัวอย่าง PHP )

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาที่ใช้รหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ codegolfing พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ 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;

ในทางเทคนิคใน F # if ... then ... elseเป็นผู้ประกอบการที่สาม ดังนั้นถ้าคุณเขียนlet result = if 10 > 100 then 99 else -99แล้วค่าของจะresult -99
Ciaran_McCarthy

1
@Ciaran_McCarthy ฉันคาดหวังว่าจะเป็นกรณีส่วนใหญ่หากไม่ใช่ภาษาที่ใช้งานได้ทั้งหมดที่มีการแสดงออกตามเงื่อนไขเป็นค่าเริ่มต้น Clojure, Scala และ Haskell เหมือนกัน
Carcigenicate

@tsh โอ๊ะโอ .. ฉันไม่ควรเพิ่มเคสทดสอบในช่วงเย็นหลังจากทำงานมาทั้งวัน ..
Kevin Cruijssen

2
คอมไพเลอร์การปิด JavaScript Compressor ทำงานได้ดีมากในการทดสอบทั้งหมด ซึ่งเมื่อรับอินพุตที่กำหนดจะสร้างผลลัพธ์ที่คาดหวัง แต่ดูเหมือนว่าฉันไม่สามารถเรียกร้องมันเป็นคำตอบ ดังนั้นฉันต้องการแสดงความคิดเห็นที่นี่
tsh

คำตอบ:


5

เรติน่า 0.8.2 , 32 ไบต์

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

ลองออนไลน์! คำอธิบาย:

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

จัดการได้ทันทีก่อนที่จะมอบหมายโดยการย้ายที่ได้รับมอบหมายก่อนเงื่อนไขและท้ายif ?เวทีถูกจับคู่จากขวาไปซ้ายเพื่อให้แน่ใจว่าเราได้รับสิ่งที่ใกล้เคียงที่สุดกับงานที่ได้รับมอบหมายในขณะที่\)มั่นใจว่าเราจะไม่จับคู่elseโดยไม่ได้ตั้งใจ

+

ทำซ้ำขั้นตอนเพื่อดูแลifs ที่ซ้อนกัน

;.{6}=
:

ใด ๆ ที่ได้รับมอบหมายที่เหลือเป็นelses ดังนั้นแทนที่ด้วย;else ?=:


@nwellnhof ขอบคุณที่ชี้ให้เห็น; ฉันคิดว่าฉันเล่นกอล์ฟที่นั่นเพราะมันทำงานในกรณีทดสอบ
Neil

6

Python 2 , 126 121 120 114 100 ไบต์

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

ลองออนไลน์!


ที่บันทึกไว้:

  • -1 ไบต์ขอบคุณ Kevin Cruijssen

@KevinCruijssen ขอบคุณ :)
TFeld

1
ทำไมนิยามฟังก์ชั่นก่อนนำเข้า?
Skyler

@Skyler มันไม่สำคัญหรอก แต่มันง่ายกว่าถ้าจะมอบหมายให้หัวนี้ด้วยวิธีนี้
Jo King

6

Perl 5 -p, 50 49 48 ไบต์

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

ลองออนไลน์!

รุ่น 48 ไบต์ได้รับแรงบันดาลใจจากคำตอบของ Retina Neil

คำอธิบาย

# 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

โซลูชัน 49 ไบต์เก่า

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

3

Ruby , 72 71 ไบต์

->s{$a=$2while s.gsub!(/if.(.*?)\)(.=)?(.*?);\w* (.=)?/,'\1?\3:');$a+s}

ลองออนไลน์!


อย่างใดอย่างหนึ่ง;elseหรือelse สามารถ.{5}บันทึกไบต์
Kevin Cruijssen

1
ขอบคุณฉันพบบางสิ่งที่แตกต่างจากเอฟเฟกต์เดียวกัน
GB

3

Java (JDK) , 119 116 ไบต์

โซลูชัน regex บริสุทธิ์เกือบทั้งหมดสับและเปลี่ยนเล็กน้อยจากคำตอบอื่น ๆ

-3 ไบต์ขอขอบคุณกลอุบาย regex เพิ่มเติมจาก Kevin

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

ลองออนไลน์!

คำอธิบาย

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"คุณเคยใช้มันสั้นกว่าที่"^(.*)(.=)","$2$1"ฉันคิดไว้1 ไบต์ :) อย่างไรก็ตามคุณสามารถบันทึก 2 ไบต์ที่เปลี่ยนแปลงif\\(ไปif.และไบต์เพิ่มเติมที่เปลี่ยนแปลงไป(\\?| ) ลองมันออนไลน์116 ไบต์ ([? ])
Kevin Cruijssen

@KevinCruijssen ไชโย! ฉันใช้เวลานานมากในการพยายามลดระดับ regex ลงฉันไม่อยากเชื่อเลยว่าฉันจะพลาดมัน!
ลุคสตีเวนส์

3

Kakoune v2018.09.04 , 43 38 37 ไบต์

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

คำอธิบาย:

Kakoune เป็นตัวแก้ไขแบบโมดัลที่ได้รับแรงบันดาลใจจาก Vim

  1. x เลือกทั้งบรรทัด

  2. s... <ret>กรองส่วนที่เลือกด้วยนิพจน์ทั่วไป\w=(?!=)ซึ่งตรงกับการกำหนดตัวแปรทั้งหมดและไม่ตรงกับ==การเปรียบเทียบ

  3. d ลบการเลือกแต่ละรายการและใส่เนื้อหาลงในการลงทะเบียนเริ่มต้น

  4. <a-h> ขยายการเลือกทั้งหมดไปยังจุดเริ่มต้นของบรรทัด

  5. P วางเนื้อหาของการลงทะเบียนเริ่มต้นก่อนการเลือกแต่ละครั้ง

  6. s... <ret>กรองส่วนที่เลือกด้วยนิพจน์ทั่วไปif.

  7. d ลบการเลือกแต่ละรายการ

  8. f ขยายการเลือกแต่ละรายการไปยังถัดไป )

  9. ; ลดการเลือกแต่ละรายการให้กับเคอร์เซอร์

  10. r แทนที่ตัวละครแต่ละตัวของแต่ละตัวเลือกด้วย ?

  11. x เลือกทั้งบรรทัด

  12. s... <ret>กรองส่วนที่เลือกด้วย;else<space>

  13. c... <esc>ล้างการเลือกแต่ละรายการและแทนที่ด้วย:

ภาพเคลื่อนไหวของรหัสในกรณีทดสอบ:

รหัสในการดำเนินการ


1
อืมฉันไม่เคยได้ยิน Kakoune มาก่อน ฉันเดาว่าไม่มีคอมไพเลอร์ออนไลน์หรือไม่ ถ้าไม่คุณสามารถเพิ่มภาพหน้าจอของบางกรณีทดสอบเพื่อให้ฉันสามารถตรวจสอบว่ามันทำงานได้ตามที่ต้องการหรือไม่? นอกจากนี้หากนี่คือภาษาของคุณคุณสามารถติดต่อ Dennis ในการคุย chat.tryitonline.netเพื่อถามว่าเขาสามารถเพิ่มลงในTIOได้หรือไม่
Kevin Cruijssen

1
@KevinCruijssen ฉันได้เพิ่ม gif ของหนึ่งในกรณีทดสอบ มันใช้งานได้กับทุกคน แต่การทำให้ gif นั้นไม่สำคัญ
Vaelus

ขอบคุณสำหรับคำอธิบายและ gif +1 จากฉัน :) ยินดีเสมอที่จะเรียนรู้เกี่ยวกับภาษาใหม่
Kevin Cruijssen


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.