เปรียบเทียบหมายเลขรุ่น


26

เมื่อเราเผยแพร่ซอฟต์แวร์บางอย่างเราจะกำหนดหมายเลขเวอร์ชันให้กับซอฟต์แวร์นั้น และผู้ใช้อาจต้องการอัปเดตซอฟต์แวร์บางเวอร์ชันล่าสุด ดังนั้นจึงเป็นเวลาที่จะค้นหาว่าเวอร์ชันใดควรเป็นรุ่นใหม่

อินพุต

ป้อนหมายเลขรุ่นสองเป็นสตริง

ในบริบทของการท้าทายนี้เราสนับสนุนเฉพาะหมายเลขรุ่นที่มีตัวเลขบางตัวเชื่อมต่อกันด้วยจุด

  • หมายเลขรุ่นคือสตริงซึ่งอาจมีตัวเลข ( 0~ 9) และจุด ( .) เท่านั้น
  • จุดจะไม่เป็นตัวอักษรแรก / ตัวสุดท้ายของหมายเลขรุ่น
  • จะต้องมีตัวเลขบางตัวระหว่างจุด อาจไม่มีจุดสองจุดต่อเนื่อง
  • ตัวเลขทั้งหมดในหมายเลขรุ่นจะน้อยกว่า 2 16

เอาท์พุต

เปรียบเทียบหมายเลขรุ่นที่ป้อนเข้าและเอาท์พุทว่าหมายเลขแรกมากกว่า / เท่ากับ / น้อยกว่าหมายเลขที่สอง คุณได้รับอนุญาตให้เลือกหนึ่งในงานนำเสนอต่อไปนี้:

  • ใช้จำนวนบวก / ศูนย์ / จำนวนลบในขณะที่ศูนย์หมายถึงเท่ากับ;
  • ใช้ค่าที่แตกต่างคงที่สามค่า

เปรียบเทียบ

คุณไม่จำเป็นต้องใช้อัลกอริทึมที่อธิบายไว้ในส่วนนี้ ข้อมูลที่คุณส่งนั้นถูกต้องตราบเท่าที่ผลลัพธ์เป็นผลลัพธ์เดียวกันกับอัลกอริทึมนี้

  • หมายเลขเวอร์ชันคือตัวเลขทศนิยมที่เชื่อมต่อกันด้วยจุด ก่อนอื่นเราแบ่งตัวเลขสองรุ่นเป็นอาร์เรย์ของตัวเลข
  • การเติมจุดสิ้นสุดของอาร์เรย์ด้วยศูนย์เพื่อทำให้มีความยาวเท่ากัน
  • เปรียบเทียบจากรายการแรกกับรายการสุดท้าย:
    • หากรายการอาร์เรย์ทั้งสองแตกต่างกันจำนวนที่มากขึ้นหมายถึงหมายเลขรุ่นที่มากขึ้น
    • หากเหมือนกันให้เปรียบเทียบรายการต่อไปนี้ต่อไป
    • หากรายการทั้งหมดในอาร์เรย์มีค่าเท่ากันทั้งสองรุ่นจะเท่ากัน

Testcases

version1  version2  result
2         1         >
1.0.0     1         =
1.0       1.0.0     =
1.2.42    1.2.41    >
1.1.56789 1.2.0     <
1.10      1.2       >
1.20      1.150     <
18.04     18.4      =
7.010     7.8       >
1.0.0.1.0 1.00.00.2 <
00.00.01  0.0.0.1   >
0.0.1     0.1       <
42.0      4.2.0     >
999.999   999.999.1 <
2018.08.1 2018.08   >


.NET มีออบเจกต์ Version แต่ไม่รองรับอักขระเดี่ยว :(
บจ.

@BrianJ และการเพิ่ม '.0' ต่อท้ายอักขระหลายตัว :)
RobAu

จริง ๆ แล้วมันคาดว่าส่วนที่ 2, 3 หรือ 4 ดังนั้นจึงล้มเหลวในกรณี 1.0.0.1.0 การทดสอบ ( แต่ผมไม่ได้พยายามที่ความคิดของคุณครั้งแรก :))
ไบรอันเจ

ฉันคิดว่า Windows มีในตัวที่จะทำสิ่งนี้: StrCmpLogicalW
bace1000

คำตอบ:



6

05AB1E (ดั้งเดิม) , 15 14 13 ไบต์

'.¡0ζε`.S}0K¬

ขาออก-1 [] 1สำหรับ< = >ตามลำดับ

-1 ขอบคุณไบต์@Emigna

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

'.¡              # Split on dots
                 #  i.e. ['1.0.1.1.0','1.00.2.0']
                 #   → [['1','0','1','1','0'],['1','00','2','0']]
   0ζ            # Zip, swapping rows and columns, using '0' as filler
                 #  i.e. [['1','0','1','1','0'],['1','00','2','0']]
                 #   → [['1','1'],['0','00'],['1','2'],['1','0'],['0','0']]
     ε   }       # Map each:
      `          #  Push both values to the stack
       .S        #  And calculate the signum (1 if a>b; -1 if a<b; 0 if a==b)
                 #   i.e. [['1','1'],['0','00'],['1','2'],['1','0'],['0','0']]
                 #    → [0,0,-1,1,0]
          0K     # Remove all zeros
                 #  i.e. [0,0,-1,1,0] → [-1,1]
            ¬    # Then take the head as result
                 #  i.e. [-1,1] → -1

1
คุณสามารถใช้แทน0K ʒĀ}
Emigna

@Emigna Ah แน่นอน .. ขอบคุณ
Kevin Cruijssen

5

R , 32 ไบต์

rank(numeric_version(scan(,"")))

ลองออนไลน์!

ใช้ R บิวอิน

เอาท์พุท1 2, 1.5 1.5, 2 1น้อยเท่าเทียมกันมากขึ้น


ดีที่สุดจนถึงขณะนี้โดยไม่มี builtin:

R , 151 142 125 107 ไบต์

function(v,L=strsplit(v,'\\.'))Find(c,sign(Reduce('-',Map(as.double,Map(c,L,Map(rep,0,rev(lengths(L))))))))

ลองออนไลน์!

รหัสที่ไม่ได้ควบคุมพร้อมคำอธิบาย:

function(v){             # character vector of 2 elements as function arg;
  L=strsplit(v,'\\.')    # obtain a list of two character vectors
                         # with the separated version numbers;
  R=rev(lengths(L))      # store in vector R the lengths of the 2 vectors and reverse it;
  M1=Map(rep,0,R)        # create a list of 2 vector containing zeros
                         # repeated R[1] and R[2] times;
  M2=Map(c,L,M1)         # append to the vectors in list L the zeros in M1;
  M3=Map(as.double,M2)   # convert the character vectors in M2 to double;
  w=sign(Reduce('-',M3)  # compute the sign of element by element difference M[[1]] - M[[2]]);
  Find(c,w)            # returns the first non zero element in w, if none return NULL;
}
# N.B. as.double is necessary because "0XX" is interpreted as octal by strtoi unless 
#      we use strtoi(x,10) which is exactly the same length of as.double(x)

เอาท์พุท-1, NULL, 1น้อยเท่าเทียมกันมากขึ้น


แนวคิดเดิมแข็งแรงเล่นกอล์ฟลงโดยใช้sapply, [<-และ%*%:

R , 129 ไบต์

function(x,y=strsplit(x,"\\."),w=sign(sapply(y,function(x)strtoi("[<-"(rep(0,max(lengths(y))),seq(x),x),10))%*%c(1,-1)))w[!!w][1]

ลองออนไลน์!

ตอนนี้คุณมีรายการของเวกเตอร์จำนวนเต็มสองตัวที่มีความยาวเท่ากัน คำนวณความแตกต่างของจำนวนคู่ที่ใช้Reduceและส่งออกองค์ประกอบที่ไม่ใช่ศูนย์แรกโดยใช้w[!!w][1]แบบฟอร์มที่ยุ่งยากเล็กน้อยในตอนท้าย

เอาท์พุท-1, NA, 1น้อยเท่าเทียมกันมากขึ้น


ที่น่าประทับใจ! Quick golf: บรรทัดใหม่พิเศษเมื่อสิ้นสุดรหัสของคุณ - ควรเป็น 150 ไบต์;)
JayCe

ลดจำนวนของตัวแปรที่มีชื่อ ... ฉันรู้สึกว่ามีวิธีที่จะทำโดยใช้เมทริกซ์แทนรายการ แต่ฉันยังไม่พบวิธีการทำ
JayCe

1
คุณสามารถลดขนาดให้เหลือ 100 ไบต์โดยใช้scan function(a,b,d=scan(t=a,se='.'),e=scan(t=b,se='.'),f=1:max(lengths(list(d,e))),g=d[f]-e[f])g[!!g][1](หรือ 106 ถ้าคุณต้องการส่งคืน -1, NA, 1 ไม่ (เชิงลบ), NA, (บวก)
mnel

1
@mnel แก้ปัญหา 100 byte ต้องการงานเล็กน้อย มันล้มเหลวในสองกรณีทดสอบล่าสุด ช่องว่างภายในจะต้องมี0และไม่ได้ NA(implictly) ฉันได้ทำคำตอบ Community Wiki แล้วใครก็ตามที่สามารถแก้ไขได้สามารถเพิ่มได้
ngm

1
@digEmAll แข็งแรงเล่นกอล์ฟ 4 Find(c,x)ไบต์ครั้งแรกโดยการคำนวณสัญญาณและจากนั้นทำ ฉันคิดว่านั่นเป็นเคล็ดลับใหม่
JayCe

4

APL (Dyalog Unicode) , 18 17 ไบต์

บันทึก 1 ไบต์ด้วย @ Adámที่ใช้⍤1แทน∘↑(...)¨และโดยการเปลี่ยนรูปแบบการป้อนข้อมูลจากอาร์เรย์ที่ซ้อนกันเป็นเมทริกซ์

(⍋-⍒)(⍎¨∊∘⎕D⊆⊢)⍤1

ลองออนไลน์!

รับอินพุตเป็นเมทริกซ์ของตัวอักษรเป็นอาร์กิวเมนต์ที่ถูกต้องโดยที่สตริงแต่ละเวอร์ชันอยู่ในแถวของตัวเอง เอาท์พุท¯1 1, 0 0, 1 ¯1สำหรับ<, =, >ตามลำดับ

(⍎¨∊∘⎕D⊆⊢)⍤1 ในแต่ละแถว

  • ∊∘⎕D⊆⊢ จัดกลุ่มตัวเลขทั้งหมดที่เกิดขึ้นนั่นคือแยกกัน .

  • ⍎¨ และแปลงแต่ละเหตุการณ์ที่เกิดขึ้นเหล่านี้ให้เป็นตัวเลข

แปลงเป็นเมทริกซ์โดยที่อินพุตแรกอยู่บนแถวบนและแถวที่สองที่ด้านล่างโดยเติมด้วย0s เมื่อจำเป็น

(⍋-⍒) และ

  • - ลบออก
    • ดัชนีลงในแถวที่จะเรียงลำดับตามลำดับจากมากไปน้อย
    • เหมือนกับด้านบน แต่สำหรับการเรียงลำดับ

4

Perl 6 , 63 47 22 ไบต์

{"v$^a cmp v$^b".EVAL}

ลองออนไลน์!

ปรากฎว่า Perl 6 มีประเภทเวอร์ชันที่เหมาะกับคำอธิบายมาก นี่คือการป้องกันรหัสที่ไม่ระบุชื่อที่จะนำรายชื่อของสองสายรุ่นและผลตอบแทนอย่างใดอย่างหนึ่งMore, หรือSameLess

คำอธิบาย:

{                    }  # Anonymous code block
 "             "        # Create a string of code
  v$^a cmp v$^b         # Comparing the two versions
                .EVAL   # And EVAL it

หรือไม่มีประเภทในตัวสำหรับ 47 ไบต์:

{first +*,[Z<=>] map *.split('.')[^@_.ords],@_}

ลองออนไลน์!

โค้ดบล็อกแบบไม่ระบุชื่อที่รับสองสตริงและส่งคืนMoreถ้าวินาทีนั้นใหญ่กว่าLessถ้าวินาทีนั้นเล็กกว่าและNilหากเท่ากัน

คำอธิบาย:

{                                             } # Anonymous code block
                 map *.split('.')          ,@_  # Split both strings by '.'
                                 [^@_.ords]     # Pad the lists by a lot
          [Z<=>]   # Zip the strings with the <=> operator
 first +*,  # Get the first value that when coerced to an int, is not 0

3

Brachylog , 49 40 ไบต์

+0|{~c[H,".",T]hị;T|ị;0|0}ᵐz{h-0&t↰₀|h-}

... มันยังคงค่อนข้างยาว

คาดหวังรายการของสองสาย ใช้เป็นpositive number / zero / negative number > / = / <

ลองออนไลน์!

คำอธิบาย

แยกอินพุต

ได้รับการป้อนข้อมูลที่ไม่รวมกับ[0, 0]เช่นที่ด้านล่างส่วนเอาท์พุทเช่น["1.02.0", "1.2.0.1.0"][[1, "02.0"], [1, "2.0.1.0"]]

                            # unify the input with...
+0                          # : a list whose sum = 0 (output is 0)
  |{                     }ᵐ # : OR a list that when mapped...
    ~c                      # : : if the input string unifies with a list of the form...
      [H,".",T]             # : : : e.g. "1.02.0", H = "1", T = "02.0"
               hị           # : : : coerce the head to an integer
                 ;T         # : : : append the string T
                            # : : : "1.02.0" -> [1, "02.0"]
                   |ị       # : : OR it unifies with an integer
                     ;0     # : : : append 0
                            # : : : "1" -> [1, 0]
                       |0   # : : OR it unifies with 0
                            # : : : 0 -> [0]

เปรียบเทียบอินพุต

รับ, ตัวอย่างเช่น, [[1, "02.0"], [1, "2.0.1.0"]]ซิปรายการย่อยลงใน[[1, 1], ["02.0", "2.0.1.0"]]และเปรียบเทียบค่าในส่วนหัว ( [1,1]) เกิดขึ้นอีกในรายการย่อยที่สอง โปรดทราบว่า zip predicate zcycles ผ่านรายการที่สั้นกว่าเพื่อให้การซิปด้วย[0,0]เท่ากับการซิปด้วย[0]ดังนั้นขั้นตอนก่อนหน้านี้รวมเข้า0ด้วยกัน0โดยไม่มีค่าเพิ่มเติมต่อท้าย

z             # zip the sublists
 {          } # unify the result (r) with...
  h           # : take the head of the result
   -          # : : subtract the second value from the first
    0         # : : if the difference unifies with 0...
     &t↰₀     # : : recur on the tail of r
         |h-  # : OR unify with the difference of the elements of the head
              # : (equivalent to returning early)

3

JavaScript (ES6), 73 68 ไบต์

บันทึก 5 ไบต์ด้วย @redundancy

(a)(b)0

a=>b=>(a+[...b].fill`.`).split`.`.some((x,i)=>d=~b.split`.`[i]-~x)*d

ลองออนไลน์!


ดี ถ้าฉันได้เข้าใจอย่างถูกต้องคุณสามารถบันทึกไบต์โดยการแทนด้วยreplace fillตัวถูกดำเนินการสำหรับ-ถูกสลับกันเนื่องจากทั้งคู่ต้องถูกบังคับเป็นตัวเลข ลองออนไลน์!
ความซ้ำซ้อนใน

@redundancy ความคิดที่ดี! (ไม่แน่ใจว่าการติดตั้งของฉันคือสิ่งที่คุณมีอยู่ในใจอย่างแน่นอน)
Arnauld

ผมถือว่าเจตนาของคุณคือการผนวกค่าพอ coercible 0 ดังกล่าวว่าการทำแผนที่มากกว่าสตริงของaในที่สุดก็ผ่านรอบผู้ที่ค่า 0 ถ้ามีกลุ่มจำนวนมากกว่าb aมันเกิดขึ้นว่าวิธีที่สั้นที่สุดในการทำให้แน่ใจว่าเป็นเช่นนั้นคือการแยกผ่านbสตริงความยาวของ '.' aโดยใช้ประโยชน์จากแยกที่มีอยู่นำไปใช้กับ
ความซ้ำซ้อน

3

Java (JDK 10) , 201 96 89 ไบต์

java.util.Comparator.comparing(java.lang.module.ModuleDescriptor.Version::parse)::compare

ลองออนไลน์!

ส่งคืนตัวเลขที่เป็นลบหากเวอร์ชันแรกมีขนาดเล็กกว่ารุ่นที่สองและเป็นค่าบวกหากรุ่นแรกมีค่ามากกว่าหมายเลขที่สองและ0หากมีค่าเท่ากัน

ใช่ว่าเป็นงานหนักที่ "เพียง" เรียกตัวใน!

เครดิต


1
ฉันพยายามแล้ว แต่ฉันสามารถลบได้สามไบต์เท่านั้น .. 228 ไบต์
Kevin Cruijssen

1
พบบางสิ่งเพิ่มเติม: 217 bytes
Kevin Cruijssen

1
อาจเป็นไปได้ว่า .. พยายามไปแล้วtry-finallyเพื่อให้การตรวจสอบง่ายขึ้น ลองส่งคืนภายในลูปถ้าt!=0; ลองใช้Integerและi.compare(i.valueOf(...),i.valueOf(...)); พยายามใช้ยาชื่อสามัญเช่นนี้<T>T[]g(T s){return(T[])(s+"").replaceAll("(\\.0+)*$","").split("\\.");}; ฯลฯ ทั้งหมดมีความยาว 2-6 ไบต์ หากคุณ (หรือใคร ๆ ) หาอะไรมากกว่านี้โปรดแจ้งให้เราทราบด้วย อยากรู้อยากเห็นอะไร :)
Kevin Cruijssen

1
@KevinCruijssen ไม่ฉันทำไม่ได้เพราะ "ตัวเลขทั้งหมดในหมายเลขเวอร์ชันจะน้อยกว่า2^16" ช่วงสั้น ๆ จาก - (2 ^ 15) ถึง 2 ^ 15-1
Olivier Grégoire

1
@KevinCruijssen ฉันสามารถลบ 105 ไบต์ได้! อย่างไร? ฉันพบตัวอยู่แล้ว)
Olivier Grégoire


2

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

\d+
$*
+`^(.)(.*=)\1
$2
(.*=|^=.*)1.*
<
.*1.*=.*
>
\.

ลองออนไลน์! ลิงค์มีกรณีทดสอบ ใช้ค่าตัวคั่นเป็นเอาต์พุตความเท่ากันดังนั้นเพื่อความสะดวกในการแปลงเฮดเดอร์ตัวคั่นอินพุต=จึงสามารถเป็นอะไรก็ได้ที่ไม่ได้อยู่ใน[.\d]นั้น คำอธิบาย:

\d+
$*

แปลงเป็นเอก

+`^(.)(.*=)\1
$2

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

  1. หากไม่มีสตริงที่มี1ผลลัพธ์ก็คือ=
  2. หากสตริงซ้ายเริ่มต้นด้วย1ผลลัพธ์จะเป็น>
  3. หากสตริงที่ถูกต้องเริ่มต้นด้วย1ผลลัพธ์ก็คือ<
  4. หากสตริงด้านซ้ายว่างเปล่าผลที่ได้คือ <
  5. ณ จุดนี้สตริงด้านขวาว่างเปล่าดังนั้นผลลัพธ์จึงเป็น >

อีกวิธีหนึ่งในการคิดเกี่ยวกับสิ่งนี้คือถ้าสตริงหนึ่งมี a 1และอีกสตริงหนึ่งไม่ได้ขึ้นต้นด้วย1สตริงนั้นจะยิ่งใหญ่กว่าอย่างไรก็ตามมันกลับกลายเป็นไบต์ที่ยาวกว่า

(.*=|^=.*)1.*
<

ตรวจสอบเคส 3 หรือเคส 4 โดยไม่มีเคส 1

.*1.*=.*
>

หากสตริงซ้ายยังคงมี a 1ณ จุดนี้แสดงว่ามันยิ่งใหญ่กว่า

\.

มิฉะนั้นลบใด ๆ ที่เหลือ.s

คอนโซลเบราว์เซอร์ Firefox REPL ขนาด 19 ไบต์

Services.vc.compare

ฉันเชื่อว่าฟังก์ชันภายในนี้ทำการเปรียบเทียบที่ต้องการ มันส่งกลับ -1, 0 หรือ 1


1
ฉันขอแนะนำให้คุณโพสต์รหัสโครเมี่ยม Firefox เป็นคำตอบอื่น ...
TSH

btw ฉันไม่แน่ใจว่าโค้ดโครเมียมของ Firefox นับจำนวนไบต์อย่างไร ควรCu.import("resource://gre/modules/Services.jsm");นับหรือไม่
tsh

1
@tsh นั่นคือเหตุผลที่ฉันเพิ่ม "Browser Console REPL" ...
Neil

2

PHP , 38 ไบต์

<?=version_compare($argv[1],$argv[2]);

เอาท์พุท -1 → < | 0 → = | 1 → >

ลองออนไลน์!


ฉันคิดว่าสิ่งที่คุณส่งมานั้นสามารถเป็นตัวของตัวเองได้
โจคิง

1
สิ่งนี้ส่งคืนผลลัพธ์ที่ผิดสำหรับอินพุตใด ๆ ที่มีค่าเป็นศูนย์ต่อท้ายที่ต่างกันเท่านั้นเช่น1.0.0และ1
oktupol

2

C (gcc) ,  140  134 ไบต์

รหัสนี้ออกผลลัพธ์เชิงลบ0หรือบวกสำหรับ<, =หรือ>ตามลำดับ

i;n;p;q;g(char*s){for(i=n=0;*s&&++n&&*s-46;i=i*10+*s++-48);i=i;}f(char*a,char*b){for(p=q=0;*a+*b&&p==q;b+=n)p=g(a),a+=n,q=g(b);a=p-q;}

ลองออนไลน์!

การแก้ไข:

  • บันทึกไปแล้ว 6 ไบต์ด้วยเพดานแบบแมว!

สถานะการท้าทาย: "ใช้ค่าที่แตกต่างกันสามค่าคงที่" รหัสของคุณไม่ส่งคืนค่าคงที่
Olivier Grégoire

1
@ Olivier มันระบุว่าฉันสามารถ "ใช้ค่าที่แตกต่างกันสามค่าคงที่" หรือ "ใช้จำนวนบวก / ศูนย์ / จำนวนลบขณะที่ศูนย์หมายถึงเท่ากับ"
Annyo

ความผิดฉันเอง! คุณถูกต้อง
Olivier Grégoire


1

JavaScript (Node.js) , 105 88 80 ไบต์

-17 ไบต์จาก @redundancy ว้าว!

-8 ไบต์ลบ Math.sign ขอบคุณ @tsh

ส่งคืนค่าลบศูนย์หรือค่าบวก

f=(a,b,r=/(\d*).?(.*)/)=>a+b&&+((a=r.exec(a))[1]-(b=r.exec(b))[1]||f(a[2],b[2]))

ลองออนไลน์!


1
88 ไบต์ใช้execเพื่อแยกสตริง ลองออนไลน์!
ความซ้ำซ้อน

@redundancy ประณามขอบคุณ! นั่นเป็นเคล็ดลับที่ยอดเยี่ยม
Luis felipe De jesus Munoz

บางทีคุณอาจต้องการลบ Math.sign เพื่อบันทึกบางไบต์โดยเปลี่ยนเป็นค่าบวก / ศูนย์ / ลบ และอาจต้องมีเครื่องหมายบวก
tsh

1

Japt , 16 11 ไบต์

-5 ไบต์จาก @Shaggy

ขาออก:

  • จำนวนลบสำหรับ <
  • ( nullหรือ0) สำหรับ=
  • จำนวนบวกสำหรับ >

N®q.Ãy_r-Ãf

ลองออนไลน์!


Would นี้ทำงานหรือไม่
ปุย

@Shaggy Yep, มันอาจจะสั้นลงถึง10 ไบต์ที่ให้ผลลัพธ์เป็นลบ, เป็นโมฆะหรือ 0, เป็นค่าบวก< = >ตามลำดับ แต่ฉันไม่รู้ว่าอินพุตสามารถใช้เป็นอาร์เรย์ได้หรือไม่
Luis felipe De jesus Munoz

0

ทำความสะอาด , 116 111 ไบต์

import StdEnv,Text
?s=map toInt(split"."s)
$a b= @(?a)(?b)
@[h:t][u:v]|h==u= @t v=h-u
@l[]=sum l
@[]l= ~(sum l)

ลองออนไลน์!

ส่งออกจำนวนลบเมื่ออาร์กิวเมนต์แรกมีค่าน้อยกว่าตัวเลขที่สองเป็นศูนย์เมื่อมีค่าเทียบเท่าและเป็นจำนวนบวกเมื่อมากกว่าจำนวนที่สอง


0

Swift 4 , 155 bytes

ส่วนหัว (ไม่นับ: รหัสไม่ซ้ำ):

let f:(String,String)->Bool? = 

รหัส

{let x:(String)->[Int]={$0.split{$0=="."}.map{Int($0)!}.reversed().drop{$0==0}.reversed()},a=x($0),b=x($1)
return a==b ?nil:a.lexicographicallyPrecedes(b)}

ลองออนไลน์!

คำอธิบาย

  • เราตัดส่วนท้าย. 0
  • เราเปรียบเทียบส่วนประกอบเป็นตัวเลข

ค่าคงที่ที่ส่งคืน

  • ไม่มีค่าสำหรับ =
  • จริงสำหรับ <
  • false สำหรับ>

0

จาวาสคริปต์ 64 ไบต์

a=>b=>(e=i=>(g=v=>v.split`.`[i]||0)(a)-g(b)||!a[i]-1&&e(i+1))(0)

ลองออนไลน์!

ด้วยความคิดเห็น:

a=>b=>(                            // Main function takes arguments like ("1.2.42")("1.2.41")
    e=i=>                          // e(i) compares the ith number, returns >0, <0 or =0.
        (   g=v=>v.split`.`[i]||0  // g() returns the ith string or 0
        )(a)                       // call g(a)
        -g(b)                      // subtracting g(b) from g(a) casts strings to integer
        ||                         // If they are not equal return result now
        !a[i]-1 &&                 // recursion limited to a.length, always sufficient
        e(i+1)                     // next i
    )(0)                           // Start with i = 0


0

Burlesque - 17 ไบต์

wd{'.;;)ri}m[^pcm


blsq ) "2018.08.1 2018.08"wd{'.;;)ri}m[^pcm
1
blsq ) "0.0.1 0.1"wd{'.;;)ri}m[^pcm
-1
blsq ) "1.1.56789 1.2.0"wd{'.;;)ri}m[^pcm
-1

หากคุณต้องการส่งออกใน '> <=' ?i"<=>"j!!Qแล้วเพิ่ม


0

Powershell, 88 ไบต์

ผลตอบแทนที่0เท่ากันpositive integerสำหรับมากกว่าหรือnegative integerน้อยกว่า

param($a,$b)+(($x=$a-split'\.')+($y=$b-split'\.')|%{$x[+$i]-$y[$i++]}|?{$_}|Select -f 1)

สคริปต์ทดสอบ golfed น้อย:

$f = {

param($a,$b)
$x=$a-split'\.'
$y=$b-split'\.'
$z=$x+$y|%{
    $x[+$i]-$y[$i++]
}|?{$_}|Select -first 1
+$z             # convert $null to 0

}

@(
    ,("2"         ,"1"         , 1)
    ,("1.0.0"     ,"1"         , 0)
    ,("1.0"       ,"1.0.0"     , 0)
    ,("1.2.42"    ,"1.2.41"    , 1)
    ,("1.1.56789" ,"1.2.0"     ,-1)
    ,("1.10"      ,"1.2"       , 1)
    ,("1.20"      ,"1.150"     ,-1)
    ,("18.04"     ,"18.4"      , 0)
    ,("7.010"     ,"7.8"       , 1)
    ,("1.0.0.1.0" ,"1.00.00.2" ,-1)
    ,("00.00.01"  ,"0.0.0.1"   , 1)
    ,("0.0.1"     ,"0.1"       ,-1)
    ,("42.0"      ,"4.2.0"     , 1)
    ,("999.999"   ,"999.999.1" ,-1)
    ,("2018.08.1" ,"2018.08"   , 1)
) | % {
    $v1,$v2,$expected = $_
    $result = &$f $v1 $v2
    "$([Math]::Sign($result)-eq$expected): $result"
}

เอาท์พุท:

True: 1
True: 0
True: 0
True: 1
True: -1
True: 8
True: -130
True: 0
True: 2
True: -1
True: 1
True: -1
True: 38
True: -1
True: 1

0

โผ , 277 231 ไบต์

F(s,{t}){t=s.split('.').map(int.parse).toList();while(t.last<1)t.removeLast();return t;}f(a,b,{d,e,f,g,h,i=0}){d=F(b);e=F(a);g=d.length;h=e.length;f=h>g?g:h;for(;i<f;i++)if(e[i]!=d[i])return e[i]>d[i]?1:-1;return h>g?1:(h<g?-1:0);}

ลองออนไลน์!

  • -44 ไบต์โดยใช้ตัวแปรเพื่อเก็บความยาวและการใช้แบบไตรภาคในวง
  • -2 ไบต์โดยลบเครื่องหมายวงเล็บสำหรับ

0

มูลนิธิ Swift 4 + , 160 ไบต์ (142 + 18) , 155 ไบต์ (142 + 13)

นำเข้า (13 ไบต์รวม;ถึงแยกจากรหัส):

นี้จะนำเข้ามูลนิธิ แต่ไบต์ 5 import Foundationสั้นกว่า

import UIKit;

ส่วนหัว (ไม่นับ: รหัสไม่ซ้ำ):

let f:(String,String)->ComparisonResult =

รหัส (142 ไบต์):

{var x={($0 as String).split{$0=="."}.count},a=$0,b=$1
while x(a)<x(b){a+=".0"}
while x(b)<x(a){b+=".0"}
return a.compare(b,options:.numeric)}

ลองออนไลน์!

คำอธิบาย

  1. เราผนวกส่วนต่อท้าย. 0 สำหรับส่วนประกอบจำนวนเดียวกัน
  2. เราเปรียบเทียบส่วนประกอบเป็นตัวเลข

ค่าคงที่ที่ส่งคืน

  • ComparisonResult.orderedSame สำหรับ =
  • CompareResult.orderedAscending สำหรับ <
  • ComparisonResult.orderedDescending สำหรับ>

ฉันไม่แน่ใจว่าเรานับimportคำสั่งนี้หรือไม่ดังนั้นฉันโพสต์คำตอบแยกต่างหากที่ไม่ต้องการFoundationและด้วยจำนวนไบต์ที่นับในระหว่าง 142 ไบต์ (ไม่นับการนำเข้า) และ 160 ไบต์ (นำเข้านับ)
Cœur

0

Zsh , 54 ไบต์

eval {autoload,}' is-at-least $'{1\ $2,2\ $1}';<<<$?;'

ลองออนไลน์! ลองชุดทดสอบ!

นี่evalเป็นข้อความแปดข้อต่อไปนี้:

autoload is-at-least $1 $2     # loads the "is-at-least" function
<<<$?                          # success, prints 0
autoload is-at-least $2 $1     # redundant
<<<$?                          # success, prints 0
is-at-least $1 $2              # exits 1 if $1 < $2
<<<$?
is-at-least $2 $1              # exits 1 if $2 < $1
<<<$?

ดังนั้นค่าที่เป็นเอกลักษณ์ทั้งสามคือ:

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