Bandingkan dua angka yang diberikan sebagai string

21

Saya punya masalah di tempat kerja. Saya perlu membandingkan dua angka yang datang sebagai string dari dua basis data yang berbeda. Angka-angka mungkin datang dengan angka nol di depan dan / atau spasi di depan / belakang. Jadi saya mungkin punya "0001 "dari satu database dan " 1 "dari yang lain.

Saya memecahkan masalah dalam C # dengan kode berikut:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

Tantangan

Ini adalah tantangan yang sangat sederhana, cocok untuk pemula dan segala jenis bahasa esoterik. Diberi dua angka sebagai string yang mungkin datang dengan angka nol di depan dan / atau spasi di depan / belakang, tulis kode terpendek yang memeriksa apakah kedua string tersebut mewakili angka yang sama.

  • Input harus berupa dua string atau setara dalam bahasa Anda (array char OK), dan mereka akan selalu mewakili nilai integer lebih besar dari nol.
  • Keluaran harus berupa dua nilai yang konsisten yang mewakili nilai kebenaran dan nilai palsu.

Contohnya

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

Ini adalah , jadi semoga kode terpendek untuk setiap bahasa menang!

Charlie
sumber
3
...
user202729
8
Setidaknya itu tidak terinspirasi oleh anak-anak Anda saat ini ...
caird coinheringaahing
2
@cairdcoinheringaahing karya saya sendiri adalah sumber inspirasi kedua saya. Saya tahu ini adalah tantangan yang sangat sederhana, tetapi saya pikir tantangan mudah ini kadang-kadang juga dibutuhkan. Saya akan mencoba untuk datang dengan sesuatu yang lebih sulit lain kali.
Charlie
Ngomong-ngomong, tampaknya tantangan yang diilhami oleh pekerjaan saya terlalu mudah atau terlalu sulit ...
Charlie
@Jonathan. Tidak, setiap string input hanya akan mewakili satu nomor. Tidak akan ada ruang di antara string.
Charlie

Jawaban:

22

Javascript , 11 byte

a=>b=>+a==b

Menyalahgunakan aturan casting Javascript sedikit; +amemaksa amenjadi tipe numerik.

-6 byte terima kasih kepada Shaggy dan Martin Ender ♦

Juga take keren oleh LiefdeWen :

a=>b=>~~a==~~b
terikat elemen
sumber
2
Selamat datang di PPCG. Anda dapat melakukan ini dalam 11 byte menggunakan currying dan dengan hanya mengkonversi salah satu input ke integer: tio.run/##y0osSyxOLsosKNHNy09J/…. Perhatikan juga bahwa, kecuali fungsi referensi sendiri, Anda tidak perlu menyertakan variabel tugas dalam jumlah byte Anda.
Shaggy
2
Selamat datang di PPCG! Fungsi yang tidak disebutkan namanya baik-baik saja sehingga Anda tidak perlu c=, dan currying juga baik-baik saja sehingga Anda dapat menggunakan a=>b=>...bukan (a,b)=>. Akhirnya, JavaScript saya agak berkarat, tapi saya pikir sesuatu seperti !(a-b)juga akan berfungsi?
Martin Ender
1
Lihat kiat - kiat untuk bermain golf di ES6 (dan kiat-kiat bermain golf JS umum ) untuk lebih banyak trik untuk memeras byte dari solusi Anda.
Shaggy
1
Versiopn yang keren itu keren tapi dalam lingkup terbatas, coba masukan '9123456789' dan '533522197'. Ini adalah representasi string dari nilai integer, berada di dalam rentang integer yang valid dalam javascript (tetapi lebih dari 32 bit)
edc65
1
Teks Anda tidak lagi cocok dengan kode; tidak ada pengurangan. Anda dipaksa ake tipe numerik dengan unary +.
Peter Cordes
18

05AB1E , 1 byte

Q

Cobalah online!

Penjelasan

Perbandingan untuk persamaan Qakan secara otomatis mencoba untuk mengevaluasi string sebagai int sebelum membandingkan.

Emigna
sumber
Oh benarkah? Dan saya pikir |0+Qcukup singkat ...
Erik the Outgolfer
18

Operasi bahasa scripting Flashpoint , 33 byte

f={call format(["%1==%2"]+_this)}

Telepon dengan:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

Keluaran:

Versi alternatif (41 byte):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

Masih 5 byte lebih pendek dari yang lebih mudah f={t=_this;call(t select 0)==call(t select 1)}

39 byte:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(yang mengembalikan ukuran array) berfungsi sebagai ganti forEach, karena Anda bisa memberikannya "lambda" yang digunakan sebagai kondisi untuk menghitung hanya elemen array yang memenuhi kondisi itu. "Kondisi" yang digunakan dalam kasus ini bukan kondisi yang valid, tetapi tidak masalah di sini karena tidak menyebabkan kesalahan dan nilai pengembalian counttidak diperlukan.

Steadybox
sumber
7
Saya suka berbagai situasi saat Anda mengambil tangkapan layar dari kode Anda.
Terakhir
11

Taksi , 488 byte

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Cobalah online!

Tidak Disatukan:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

Taksi (relatif) sangat cocok untuk tantangan ini karena string adalah satu-satunya tipe input atau output yang diperbolehkan. The Babelfisheryadalah apa yang mengubah string menjadi angka (dan sebaliknya) dan itu menangani pengupasan semua ruang dan memimpin nol. Ini juga akan menangani angka negatif jika -tepat sebelum digit pertama. Setelah itu, Equal's Cornerperiksa kedua nilai terhadap satu sama lain dan Writer's Depotmemberikan output dalam format string. Keluaran adalah 1untuk kebenaran dan 0untuk kepalsuan.

Toast insinyur
sumber
1
Yang bagus! Hanya ingin tahu, mengapa jendela debug menunjukkan pesan error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie
6
@Charlie Taxi mengharuskan Anda untuk mengemudi kembali ke garasi taksi setelah selesai dengan rute Anda. Jika Anda tidak membawa mobil kembali, Anda dipecat. (Anda juga harus memastikan untuk berhenti dan mengisi bahan bakar sekali-sekali atau Anda kehabisan bensin.) Dalam pertanyaan kode-golf yang tidak melarang output ke STDERR, saya biasanya tidak khawatir dipecat. Anda dapat menambahkan ini untuk menghilangkan kesalahan jika Anda tidak ingin kehilangan pekerjaan Anda:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast
Jawaban ini dan komentarnya sepenuhnya surealis. Saya suka komunitas ini.
Kaki Kanan
@RightLeg Program taksi favorit saya yang saya tulis membutuhkan waktu dua minggu dan banyak debugging. Anda benar-benar ingin melakukan perjalanan? Lihat Shakespeare .
Engineer Toast
10

C (gcc) , 27 byte

f(s,t){s=atoi(s)==atoi(t);}

Dengan -O0(yang merupakan pengaturan default).

Cobalah online!

C, 32 byte

f(s,t){return atoi(s)==atoi(t);}

Cobalah online!

Steadybox
sumber
2
@Charlie Dalam C, string adalah array char, dan ketika Anda melewatkan sebuah array ke suatu fungsi, Anda sebenarnya hanya meneruskan pointer ke elemen pertama dari array. Di sini, pointer ke chararray secara implisit dikonversi ke integer ketika diteruskan ke fungsi, dan integer dikonversi kembali ke pointer ketika memanggil atoi.
Steadybox
1
yang bisa meledak mengerikan pada platform di mana pointer lebih luas dari int ... hanya mengatakan, tentu saja tidak apa-apa untuk standar situs di sini :)
Felix Palmen
2
Jika Anda ingin menggunakan omong kosong konyol s=foo;alih - alih return foo;Anda perlu memberi label ini sebagai "x86 gcc dengan optimasi dinonaktifkan", bukan hanya "C", karena kode ini tidak mengembalikan nilai kecuali sebagai artefak implementasi.
Peter Cordes
2
Saya pergi mencari untuk melihat apakah ada arsitektur di mana s=retval;bukannya return retval;benar - benar rusak. Sepertinya logika internal gcc (dengan -O0hanya) benar-benar memperlakukan ekspresi terakhir sebagai nilai balik, mungkin cara yang sama seperti ekspresi-pernyataan GNU C bekerja. (Tapi itu memang membutuhkan s=). Pada ARM32, ia menghitung ==hasilnya r3, dan kemudian menggunakan ekstra mov r0, r3untuk menjadikannya nilai pengembalian! Jadi ini bukan peretasan khusus x86, gcc -O0peretasan yang tampaknya didukung gcc.
Peter Cordes
2
@ KenY-N Anda melewatkan seluruh poin golf kode c. Ini tentang menemukan kasus tepi hacky khusus di mana Anda dapat memasukkan jumlah kode minimum dan mendapatkan hasil yang Anda inginkan, tidak memberikan pengalaman portabel.
8

J , 4 byte

=&do

Bandingkan =setelah &mengevaluasi do. Dapat juga =&". Coba online!

FrownyFrog
sumber
Cukup menarik ini akan bekerja untuk kedua negatif karena bahasa lain memahaminya (misalnya -10) dan negatif ketika J memahaminya (misalnya _10) karena cara -kerja monadik .
cole
6

Retina , 11 byte

.+
$*
D`
¶$

Cobalah online!

Input dipisahkan dengan umpan baris, tetapi ruang uji menggunakan pemisahan koma untuk kenyamanan. Mencetak 1untuk persamaan dan 0untuk ketidaksetaraan.

Penjelasan

.+
$*

Konversi setiap baris ke unary. Ini mengabaikan nol dan spasi terkemuka.

D`

Deduplicate: bersihkan baris kedua jika keduanya sama.

¶$

Pastikan string sekarang diakhiri dengan linefeed.

Martin Ender
sumber
3

Triangularity , 17 byte

..)..
.Ii).
@Ii=.

Cobalah online!

Triangularity, untuk sekali, kompetitif!

Bagaimana itu bekerja

Triangularity memerlukan kode untuk memiliki distribusi titik-titik. Artinya, panjang setiap baris harus sama dengan jumlah baris dikalikan 2 dan dikurangi, dan setiap baris harus memiliki (di setiap sisi) sejumlah titik yang sama dengan posisinya dalam program (baris bawah adalah baris 0, yang di atasnya adalah baris 1 dan seterusnya). Ingatlah ini, mari kita menganalisis bagaimana kode bekerja:

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.
Tuan Xcoder
sumber
3

Alice , 7 byte

X/n
o@i

Cobalah online!

Pemisah non-digit berfungsi. Mencetak 1untuk kesetaraan dan 0sebaliknya.

Penjelasan

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.
Martin Ender
sumber
3

Japt , 3 byte

¥Vn

Cobalah

Mengonversi input kedua ke integer dan membandingkan persamaan dengan yang pertama.

Shaggy
sumber
3

jq, 24 karakter

map(tonumber)|.[0]==.[1]

2 string dilewatkan sebagai item dari array.

Contoh dijalankan:

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010001 ", " 10001  "]'
true

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010000", "  10  "]'
false

Cobalah online! ( Semua kasus uji )

manatwork
sumber
3

Sekam , 3 byte

¤=r

Cobalah online!

Penjelasan

¤    -- combine both arguments of ..
 =   -- .. equality ..
  r  -- .. with read
ბიმო
sumber
1
Jika Anda mengambil input sebagai daftar dua elemen, Ërberfungsi juga.
Zgarb
3

PowerShell , 20 byte

param($a,$b)+$a-eq$b

Mirip dengan jawaban JavaScript, hanya lebih lama karena PowerShell tidak memiliki currying. Menggunakan +untuk melemparkan string pertama ke integer, dan kemudian -equals secara otomatis melemparkan string kedua ke integer. Output Benar / Salah.

Cobalah online!

AdmBorkBork
sumber
3

PowerShell , 19 byte

$args-join'-eq'|iex

Cobalah online!

-joinarray argumen ( $args) dengan representasi string dari operator perbandingan ( -eq) kemudian mengevaluasi ekspresi dengan Invoke-Expression( iex).

briantis
sumber
Menarik. Saya bertanya-tanya bagaimana Anda bertahan tanpa perlu melakukan bilangan bulat, sedangkan milik saya rusak jika saya menghapus +karena ia melakukan pengecekan kesetaraan string.
AdmBorkBork
@ AdmBorkBork karena saya pada dasarnya membuat kode PowerShell dan kemudian mengeksekusinya, dan karena memimpin nol dan memimpin / spasi tambahan tidak penting bagi penerjemah, itu "hanya bekerja". Jika 2 angka tersebut 00009 dan 077 kemudian kode yang dihasilkan adalah 00009 -eq077 , sepotong kode yang benar-benar valid. Anda berhadapan langsung dengan string saat runtime, jadi Anda harus melemparkannya terlebih dahulu agar operasi dilakukan pada numerik.
briantis
Benar, ya, itu masuk akal. Terima kasih untuk penjelasannya.
AdmBorkBork
3

Q (Kdb +), 13 byte

=/["J"$(x;y)]

Penjelasan

(x; y): daftar dua input.

"J" $: casting setiap input ke tipe panjang (7j) dari string (10c), yang dapat menafsirkan
ruang putih dengan benar dan memimpin 0s.

= /: memeriksa persamaan elemen dalam daftar (setiap pasangan berikutnya).
Karena hanya ada satu pasangan, mengembalikan boolian 0b / 1b tunggal.

Sidney
sumber
Selamat datang di PPCG! Biasanya, tautan ke juru bahasa / kompiler online dihargai, dan jika tidak jelas, penjelasan juga.
FantaC
Terima kasih! Penjelasan ditambahkan di sana. Saya ragu ada juru bahasa online untuk q, saya melihat sekilas dan tidak bisa menemukannya.
Sidney
Saya akan mengatakan bahwa ini harus ditulis sebagai lambda termasuk kurung kurawal, yaitu {=/["J"$(x;y)]}untuk 15 byte ... Meskipun untuk 8 byte Anda dapat memiliki ini: (~/)"J"$jika Anda hanya menggunakan REPL dan meneruskan input sebagai daftar string .. atau {(~/)"J"$x}untuk 11 sebagai fungsi.
streetster
3

T-SQL, 35 byte

Sesuai standar kami , data dimasukkan melalui tabel yang sudah ada sebelumnya tdengan varcharbidang adan b.

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

Kembali 1jika mereka cocok, 0jika mereka tidak.

Beberapa fungsi matematika SQL (termasuk ABS, FLOORdan CEILING) akan melakukan konversi implisit ke numerik jika diberi parameter string, ini lebih pendek daripada eksplisit CAST(a AS INT)atau CONVERT(INT,b), dan berfungsi dalam kasus ini karena kita tahu nilai input selalu positif.

IIF khusus untuk MS SQL 2012 dan di atasnya, jadi tidak ada jaminan tentang implementasi lainnya.

BradC
sumber
3

Excel VBA, 27 16 Bytes

-9 Terima kasih kepada @Nayrb dan @TaylorScott

[C1]=[A1]-[B1]=0

Di mana Anda memasukkan nilai pada Sel dengan 'string.

Di mana xdan di mana ystring input dan zmerupakan output Boolean.

Jika CInt (x) = CInt (y) Kemudian z = 1

Menggunakan CInt

danieltakeshi
sumber
1
Mengapa tidak: z = xy = 0?
Nayrb
Sayangnya solusi ini tidak valid karena tidak mengambil input dan lebih mengandalkan nilai yang telah ditentukan sebelumnya ( yang telah dianggap melanggar aturan komunitas ) dan menghasilkan variabel ( yang juga bertentangan dengan aturan komunitas )
Taylor Scott
Adapun solusi yang valid mungkin fungsi jendela langsung vbe seperti ?[Int(A1)=Int(B1)]yang mengambil input dari rentang A1dan B1dan output ke jendela langsung VBE
Taylor Scott
3

R , 28 27 byte

!diff(as.double(scan(,'')))

Membaca angka sebagai string, mengubahnya menjadi dua kali lipat dan memeriksa apakah perbedaannya tidak nol.

Cobalah online!

Byte1 byte terima kasih kepada Giuseppe

Robert Hacken
sumber
Hanya ""cukup
Giuseppe
2

Lua , 20 byte

print(...-arg[2]==0)

Cobalah online!

Jonathan S.
sumber
2

Haskell , 20 byte

-11 byte terima kasih kepada Laikoni. -2 byte terima kasih kepada Zgarb.

a#b=0+read a==read b

Cobalah online!

benar-benar manusiawi
sumber
1
@Laikoni Lebih baik untuk tidak mengikat read:a#b=0+read a==read b
Zgarb
2

Gema , 21 karakter

*\n*=@cmpn{*;*;0;1;0}

Tidak ada boolean di Gema. Karena @get-switch{}/ @set-switch{}fungsi menggunakan 0 dan 1 untuk mewakili status sakelar, juga menggunakan 0 dan 1.

2 string dilewatkan pada jalur input yang terpisah.

Contoh dijalankan:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0
manatwork
sumber
2

Ditumpuk , 8 byte

[#~\#~=]

Cobalah online!

Penjelasan

[#~\#~=]   anonymous function
 #~        eval TOS
   \       swap top two
    #~     eval TOS
      =    push equality of top two
Conor O'Brien
sumber
2

Attache , 11 byte

Same@Map&:N

Cobalah online!

Ini mengambil array string, seperti V["0001", "1 "]. Secara sederhana, Map&:Nadalah fungsi yang memetakan Nargumennya, dan Samememeriksa bahwa array hanya berisi anggota yang sama. (Fakta menyenangkan: fungsi ini berfungsi untuk lebih dari 2 argumen string.)

Conor O'Brien
sumber
2

SNOBOL4 (CSNOBOL4) , 42 byte

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

Cobalah online!

Keluaran 1 untuk kebenaran, tidak ada untuk falsey. Karena (spasi) adalah operator concatenation di SNOBOL, EVALing nomor dengan spasi terdepan / tertinggal menghasilkan nomor itu sendiri, dan itu juga rapi mengurus setiap nol terkemuka. EQmenguji kesetaraan numerik, dengan pengaturan OUTPUT1 ke kondisi aktif Success.

Giuseppe
sumber
2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 byte BASIC tokenized

Solusi baru terima kasih kepada Neil (terima kasih atas tipnya).

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

Solusi ini membutuhkan input pengguna, jadi masukkan dalam dua string dengan spasi putih dan / atau nol di depan, atau masukkan dua string dengan nilai numerik yang tidak sama; 0salah dan 1benar sekali baris ketiga telah membandingkan nilai dari setiap string yang dimasukkan.

Solusi lama: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 byte BASIC tokenized

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

Pemeriksaan aktual dilakukan pada baris tiga, yang hanya ~ 16 byte BASIC tokenized; jadi memasuki setiap pasangan uji menggunakan mode langsung akan menghemat ~ 30 byte dari daftar. Perhatikan bahwa jumlah byte ini tidak termasuk var stack.

Shaun Bebbers
sumber
1
Bukankah seharusnya Anda menggunakan INPUT A$dan INPUT B$? Juga saya tidak berpikir Anda perlu ()s.
Neil
Ya, saya bisa menggunakannya juga - Saya hanya ingin bukti konsep
Shaun Bebbers
2

APL (NARS2000) , 7 byte

=⍥⍎

Ya, saya tahu NARS2000 tidak dapat bersaing dengan Dyalog di sini karena menggunakan Unicode, tapi saya pikir saya lebih suka pamer (dipanggil Komposisi dalam NARS2000, meskipun sebenarnya tidak terkait dengan fungsi komposisi), sesuatu yang tidak dilakukan Dyalog miliki sebagai built-in dan saya belum pernah melihat digunakan di sini. Di Dyalog, itu harus diimplementasikan sebagai {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. Apa yang dilakukannya adalah memanggil fungsi operan monadik kanan pada argumen kiri dan kanan, dan kemudian memanggil fungsi dyadic operan kiri pada hasil.

Di sini, operan kanan adalah ( Execute , ie eval) dan operan kiri adalah =( Equal To , yaitu periksa apakah argumennya sama).

Erik the Outgolfer
sumber
Apakah komposisi dan eksekusi seharusnya dirender sebagai spasi putih?
John Dvorak
@ JohnDvorak um, bukan? Mereka bukan ruang kosong, karakter kedua adalah U + 2365 APLIKASI SIMBOL FUNGSIONAL APLIKASI LINGKARAN dan yang ketiga adalah U + 234E APL FUNGSIONAL SIMBOL BAWAH TACK JOT.
Erik the Outgolfer
@JohnDvorak Apapun font yang Anda lihat ini mungkin tidak memiliki simbol untuk titik-titik kod tersebut.
Terakhir
@ Οurous Saya sangat curiga bahwa ini masalahnya juga, tetapi jika Anda menggunakan perangkat lunak yang diperbarui, Anda seharusnya tidak memiliki masalah dalam melihat karakter seperti itu.
Erik the Outgolfer