Bandingkan nomor versi

26

Ketika kami menerbitkan beberapa perangkat lunak, kami menetapkan nomor versi untuknya. Dan pengguna mungkin ingin memperbarui ke versi terbaru dari beberapa perangkat lunak. Jadi, inilah saatnya untuk mencari tahu versi mana yang harus lebih baru.

Memasukkan

Masukkan dua nomor versi sebagai string.

Dalam konteks tantangan ini, kami hanya mendukung nomor versi yang merupakan beberapa digit yang digabungkan dengan titik.

  • Nomor versi adalah string yang hanya berisi digit ( 0~ 9) dan titik ( .).
  • Dots tidak akan menjadi karakter pertama / terakhir dari nomor versi.
  • Harus ada beberapa digit di antara titik-titik. Tidak ada dua titik yang muncul terus menerus.
  • Semua angka dalam nomor versi akan kurang dari 2 16 .

Keluaran

Bandingkan nomor versi yang dimasukkan dan hasilkan apakah yang pertama lebih besar dari / sama dengan / kurang dari yang kedua. Anda diperbolehkan memilih salah satu dari presentasi berikut:

  • Gunakan angka positif / nol / angka negatif, sedangkan nol berarti sama;
  • Gunakan tiga nilai berbeda konstan;

Perbandingan

Anda tidak diharuskan untuk mengimplementasikan algoritma yang dijelaskan di bagian ini. Kiriman Anda valid selama menghasilkan hasil yang sama dengan algoritma ini.

  • Nomor versi adalah beberapa angka desimal yang digabungkan dengan titik. Kami pertama-tama membagi dua nomor versi menjadi array angka;
  • Padding akhir array dengan nol untuk membuat mereka memiliki panjang yang sama;
  • Bandingkan dari item pertama ke yang terakhir:
    • Jika dua item array berbeda, angka yang lebih besar berarti angka versi yang lebih besar
    • Jika mereka sama, terus membandingkan item berikut;
    • Jika semua item dalam array sama, kedua versi sama.

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   >
tsh
sumber
Terkait , terkait
FryAmTheEggman
.NET memiliki objek Version, tetapi satu karakter tidak didukung di dalamnya :(
Brian J
@BrianJ dan menambahkan biaya '.0' ke banyak karakter? :)
RobAu
Yah, itu sebenarnya mengharapkan 2, 3, atau 4 porsi. Jadi gagal pada kasus uji 1.0.0.1.0 (meskipun saya awalnya mencoba ide Anda :))
Brian J
Saya pikir Windows memiliki built-in yang akan melakukan ini: StrCmpLogicalW
bace1000

Jawaban:

7

Python 2 , 84 79 76 byte

lambda*l:cmp(*map(lambda v:map(int,v.split('.')+[0]*len(`l`))[:len(`l`)],l))

Cobalah online!

Output -1,0,1untuk<,=,>

TFeld
sumber
6

05AB1E (warisan) , 15 14 13 byte

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

Output -1 [] 1untuk < = >masing - masing.

-1 byte terima kasih kepada @Emigna .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

'.¡              # 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
Kevin Cruijssen
sumber
1
Anda bisa menggunakan 0Kbukan ʒĀ}.
Emigna
@Emigna Ah tentu saja .. Terima kasih.
Kevin Cruijssen
5

R , 32 byte

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

Cobalah online!

Menggunakan R builtin

Output 1 2, 1.5 1.5, 2 1kurang, sama, lebih besar.


Terbaik sejauh ini, tanpa builtin:

R , 151 142 125 107 byte

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

Cobalah online!

Kode terbuka dengan penjelasan:

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)

Output -1, NULL, 1kurang, sama, lebih besar.


Konsep asli, menggunakan golf sapply, [<-dan %*%:

R , 129 byte

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]

Cobalah online!

Sekarang Anda memiliki daftar dua vektor bilangan bulat dengan panjang yang sama. Hitung perbedaan berpasangan menggunakan Reducedan output elemen non-nol pertama menggunakan w[!!w][1]bentuk kecil yang rumit di akhir.

Output -1, NA, 1kurang, sama, lebih besar.

ngm
sumber
Impresif! Golf cepat: baris baru ekstra di akhir kode Anda - harus 150 byte;)
JayCe
mengurangi jumlah variabel bernama ... . Saya merasa ada cara untuk melakukannya menggunakan matriks, bukan daftar tapi saya belum menemukan cara melakukannya.
JayCe
1
Anda bisa berjalan turun ini untuk 100 byte menggunakan 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](atau 106 jika Anda ingin kembali -1, NA, 1 tidak (negatif), NA, (positif).
mnel
1
@mnel solusi 100 byte perlu sedikit kerja. Gagal pada dua kasus uji terakhir. Padding harus ada 0dan tidak (secara tidak langsung) NA. Saya telah membuat jawaban sebagai Wiki Komunitas sehingga siapa pun yang dapat memperbaikinya dapat menambahkannya.
ngm
1
@digEmAll melakukan golf 4 byte dengan terlebih dahulu menghitung tanda, lalu lakukan Find(c,x). Saya pikir itu trik baru.
JayCe
4

APL (Dyalog Unicode) , 18 17 byte

1 byte disimpan berkat @ Adám untuk menggunakan ⍤1alih-alih ∘↑(...)¨dan dengan mengubah format input dari array bersarang ke matriks

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

Cobalah online!

Mengambil input sebagai matriks karakter sebagai argumen yang tepat, di mana setiap versi string berada di barisnya masing-masing. Output ¯1 1, 0 0, 1 ¯1untuk <, =, >masing-masing.

(⍎¨∊∘⎕D⊆⊢)⍤1 di setiap baris

  • ∊∘⎕D⊆⊢ kelompokkan semua kemunculan digit, yaitu terpecah .

  • ⍎¨ dan konversi masing-masing kejadian ini ke angka

mengkonversi ke matriks, di mana input pertama berada di baris atas dan yang kedua di bawah, padding dengan 0s jika diperlukan

(⍋-⍒) dan

  • - mengurangi
    • indeks ke dalam baris yang akan mengurutkannya dalam urutan menurun
    • sama seperti bagian atas tetapi untuk urutan naik
Kritixi Lithos
sumber
4

Perl 6 , 63 47 22 byte

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

Cobalah online!

Ternyata Perl 6 memiliki tipe versi yang cukup sesuai dengan deskripsi. Ini adalah blok kode anonim yang mengambil daftar dua string versi dan kembali baik More, Sameatau Less.

Penjelasan:

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

Atau, tanpa tipe bawaan untuk 47 byte:

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

Cobalah online!

Blok kode anonim yang mengambil dua string dan kembali Morejika yang kedua lebih besar, Lessjika yang kedua lebih kecil dan Niljika mereka sama.

Penjelasan:

{                                             } # 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
Jo King
sumber
3

Brachylog , 49 40 byte

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

... Itu masih agak panjang tidak mengesankan.

Mengharapkan daftar dua string. Digunakan positive number / zero / negative number sebagai > / = / <.

Cobalah online!

Penjelasan

Memisahkan input

Diberikan input yang tidak menyatukan dengan [0, 0], seperti ["1.02.0", "1.2.0.1.0"], output segmen di bawah ini, misalnya [[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]

Membandingkan input

Diberikan, misalnya, [[1, "02.0"], [1, "2.0.1.0"]]ritsleting sublist ke dalam [[1, 1], ["02.0", "2.0.1.0"]]dan membandingkan nilai-nilai di head ( [1,1]). Berulang pada sublist kedua. Perhatikan bahwa zip memprediksikan zsiklus melalui daftar yang lebih pendek sehingga zipping [0,0]sama dengan zipping [0], maka langkah sebelumnya menyatu 0dengan 0tanpa nilai lebih lanjut ditambahkan.

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)
redundansi
sumber
3

JavaScript (ES6), 73 68 byte

Disimpan 5 byte berkat @redundancy

(a)(b)0

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

Cobalah online!

Arnauld
sumber
Bagus. Jika saya mengerti dengan benar, Anda dapat menyimpan byte dengan mengganti replacedengan fill. Operan untuk -ditukar karena keduanya sekarang harus dipaksa ke nomor. Cobalah online!
redundansi
@redundancy Ide bagus! (Namun, tidak yakin apakah implementasi saya persis seperti yang ada dalam pikiran Anda.)
Arnauld
Saya berasumsi maksud Anda adalah untuk menambahkan nilai yang cukup koersibel ke 0 sedemikian rupa sehingga pemetaan atas substring pada aakhirnya siklus melalui nilai-nilai 0 jika bmengandung lebih banyak segmen nomor daripada a. Kebetulan bahwa metode terpendek untuk memastikan yang demikian adalah dengan membelah bstring panjang '.' dengan memanfaatkan perpecahan yang ada diterapkan a.
redundansi
3

Java (JDK 10) , 201 96 89 byte

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

Cobalah online!

Mengembalikan angka negatif jika versi pertama lebih kecil dari yang kedua, positif jika versi pertama lebih besar dari yang kedua dan 0jika mereka sama.

Yap, itu pekerjaan berat untuk "hanya" memanggil built-in!

Kredit

Olivier Grégoire
sumber
1
Saya mencoba, tetapi saya hanya dapat menghapus tiga byte .. 228 byte
Kevin Cruijssen
1
Menemukan sesuatu yang lebih: 217 byte
Kevin Cruijssen
1
Itu mungkin itu .. Sudah dicoba try-finallysehingga if-check dapat disederhanakan; mencoba kembali ke dalam loop jika t!=0; mencoba menggunakan Integerdan i.compare(i.valueOf(...),i.valueOf(...)); mencoba menggunakan obat generik seperti ini <T>T[]g(T s){return(T[])(s+"").replaceAll("(\\.0+)*$","").split("\\.");}; dll. Semua lebih panjang 2-6 byte. Jika Anda (atau orang lain) memang menemukan sesuatu yang lebih, beri tahu saya. Penasaran ingin tahu apa. :)
Kevin Cruijssen
1
@KevinCruijssen Tidak, saya tidak bisa karena "Semua angka dalam nomor versi akan kurang dari 2^16." Jangkauan pendek dari - (2 ^ 15) hingga 2 ^ 15-1.
Olivier Grégoire
1
@KevinCruijssen saya bisa menghapus 105 byte! Bagaimana? Yah, saya menemukan built-in;)
Olivier Grégoire
2

Python 2 , 87 byte

lambda*p:cmp(*zip(*map(lambda x,y:(x or 0,y or 0),*[map(int,u.split('.'))for u in p])))

Cobalah online!

Output -1,0,1 untuk <, =,>, masing-masing.

Chas Brown
sumber
2

Retina 0.8.2 , 54 byte

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

Cobalah online! Tautan termasuk kasus uji. Menggunakan nilai separator sebagai output persamaan, jadi untuk memudahkan header mengkonversi separator input menjadi =tetapi bisa berupa apa saja yang tidak ada [.\d]. Penjelasan:

\d+
$*

Konversikan ke unary.

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

Hapus karakter pertama dari masing-masing sisi hingga mereka berbeda atau satu sisi habis. Ini jauh lebih cepat daripada mencoba mencocokkan awalan, meskipun mungkin bukan pegolf. Pada titik ini, string berada dalam salah satu dari beberapa bentuk, yang perlu diterjemahkan ke hasil perbandingan.

  1. Jika tidak ada string yang mengandung 1maka hasilnya adalah=
  2. Jika string kiri dimulai dengan a 1maka hasilnya adalah>
  3. Jika string yang benar dimulai dengan 1maka hasilnya adalah<
  4. Jika string kiri kosong maka hasilnya adalah <
  5. Pada titik ini string yang benar kosong sehingga hasilnya >

Cara lain untuk berpikir tentang ini adalah bahwa jika satu string berisi a 1dan yang lainnya tidak dimulai dengan sebuah 1maka string itu lebih besar, namun itu ternyata lebih lama satu byte.

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

Periksa kasus 3, atau kasus 4 tanpa kasus 1.

.*1.*=.*
>

Jika string kiri masih berisi 1pada saat ini maka itu lebih besar.

\.

Jika tidak, hapus sisa .s.

Konsol Browser Firefox REPL, 19 byte

Services.vc.compare

Saya percaya fungsi internal ini melakukan perbandingan yang diperlukan. Ia mengembalikan -1, 0, atau 1.

Neil
sumber
1
Saya sarankan Anda memposting kode krom Firefox sebagai jawaban lain ...
tsh
btw, saya tidak yakin bagaimana kode chrome Firefox menghitung byte-nya. Haruskah Cu.import("resource://gre/modules/Services.jsm");dihitung?
tsh
1
@ tsh Itu sebabnya saya menambahkan "Browser Console REPL" ...
Neil
2

PHP , 38 byte

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

Keluaran -1 → < | 0 → = | 1 → >

Cobalah online!

Luis felipe De jesus Munoz
sumber
Saya pikir kiriman Anda bisa menjadi fungsinya sendiri
Jo King
1
Ini mengembalikan hasil yang salah untuk setiap pasangan input yang berbeda dalam membuntuti nol saja, misalnya 1.0.0dan1
oktupol
2

C (gcc) ,  140  134 byte

Kode ini menghasilkan negatif, 0atau positif untuk <, =atau >masing - masing.

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;}

Cobalah online!

Suntingan:

  • Disimpan 6 byte berkat ceilingcat!
Annyo
sumber
Tantangannya menyatakan: "Gunakan tiga nilai berbeda konstan;" Kode Anda tidak mengembalikan konstanta.
Olivier Grégoire
1
@ Olivier Ini menyatakan saya bisa "Gunakan tiga nilai berbeda konstan;" ATAU "Gunakan angka positif / nol / angka negatif, sedangkan nol berarti sama;"
Annyo
Salahku! Kamu benar.
Olivier Grégoire
1

JavaScript (Node.js) , 105 88 80 byte

-17 byte dari @redundancy. Wow!

-8 byte menghapus Math.sign. Terima kasih @tsh

Mengembalikan nilai negatif, nol atau positif

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

Cobalah online!

Luis felipe De jesus Munoz
sumber
1
88 byte digunakan execuntuk membagi string. Cobalah online!
redundansi
@redundancy Sialan, terima kasih! itu trik yang cukup keren
Luis felipe De jesus Munoz
Mungkin Anda ingin menghapus tanda Math.s untuk menyimpan beberapa byte dengan beralih ke nilai positif / nol / negatif. Dan mungkin diperlukan tanda positif.
tsh
1

Japt , 16 11 byte

-5 byte dari @Shaggy

Output:

  • angka negatif untuk <
  • ( nullatau 0) untuk=
  • angka positif untuk >

N®q.Ãy_r-Ãf

Cobalah online!

Luis felipe De jesus Munoz
sumber
Apakah ini akan berhasil?
Shaggy
@Shaggy Yep, Bisa jadi lebih pendek menjadi 10 byte menghasilkan negatif, nol atau 0, positif untuk < = >masing - masing tapi saya tidak tahu apakah input dapat diambil sebagai array
Luis felipe De jesus Munoz
0

Bersih , 116 111 byte

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)

Cobalah online!

Menghasilkan angka negatif ketika argumen pertama kurang dari yang kedua, nol ketika mereka setara, dan angka positif ketika lebih dari yang kedua.

Suram
sumber
0

Swift 4 , 155 byte

Header (tidak dihitung: kode ini non-rekursif):

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

Kode

{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)}

Cobalah online!

Penjelasan

  • Kami memotong trailing .0.
  • Kami membandingkan komponen secara numerik.

Konstanta yang dikembalikan

  • nol untuk =
  • berlaku untuk <
  • salah untuk>
Cur
sumber
0

JavaScript 64 byte

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

Cobalah online!

Dengan komentar:

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
James
sumber
0

Burlesque - 17 byte

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

Jika Anda ingin keluaran di '> <=' lalu tambahkan ?i"<=>"j!!Q.

mroman
sumber
0

Powershell, 88 byte

Pengembalian 0setara, a positive integeruntuk lebih besar dari atau negative integeruntuk kurang dari.

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

Skrip uji yang kurang golf:

$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"
}

Keluaran:

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
mazzy
sumber
0

Anak panah , 277 231 byte

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);}

Cobalah online!

  • -44 byte dengan menggunakan variabel untuk menyimpan panjang dan menggunakan terner dalam loop
  • -2 byte dengan menghapus tanda kurung
Elcan
sumber
0

Swift 4+ Foundation , 160 byte (142 + 18) , 155 byte (142 + 13)

Impor (13 byte, termasuk ;untuk dipisahkan dari kode):

Ini akan mengimpor Foundation, tetapi lebih pendek 5 byte dari import Foundation.

import UIKit;

Header (tidak dihitung: kode ini non-rekursif):

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

Kode (142 byte):

{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)}

Cobalah online!

Penjelasan

  1. Kami menambahkan beberapa trailing .0 untuk jumlah komponen yang sama.
  2. Kami membandingkan komponen secara numerik.

Konstanta yang dikembalikan

  • ComparisonResult.orderedSame untuk =
  • ComparisonResult.orderedAcending untuk <
  • ComparisonResult.orderedDescending untuk>
Cur
sumber
Saya tidak yakin apakah kita menghitung importpernyataan, jadi saya memposting jawaban terpisah yang tidak memerlukan Foundationdan dengan hitungan byte di antara 142 byte (tidak termasuk impor) dan 160 byte (menghitung impor).
Cœur
0

Zsh , 54 byte

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

Cobalah online! Coba test suite!

Ini evaluntuk delapan pernyataan berikut:

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
<<<$?

Jadi tiga nilai unik adalah:

 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>
Fungsi Gamma
sumber