Dizge olarak verilen iki sayıyı karşılaştırın


21

İşyerinde bir sorunum var. İki farklı veritabanından dizge olarak gelen iki sayıyı karşılaştırmam gerekiyor. Rakamlar başında sıfır ve / veya başında / sonunda boşluk olabilir. Yani "0001 "bir veritabanından ve " 1 "diğerinden alabilirim.

C # problemini aşağıdaki kodla çözdüm:

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

Meydan okuma

Bu, yeni başlayanlar ve her türlü ezoterik dil için uygun olan gerçekten basit bir sorundur. Baştaki sıfırlarla ve / veya baştaki / sondaki boşluklarla gelebilecek dizeler olarak iki sayı verildiğinde, iki dizenin aynı sayıyı temsil edip etmediğini denetleyen en kısa kodu yazın.

  • Girişlerin iki dize veya dilinizdeki eşdeğeri olması gerekir (bir karakter dizisi TAMAM) ve her zaman sıfırdan büyük tam sayı değerlerini temsil eder.
  • Çıktı, bir truthy değerini ve bir falsey değerini temsil eden herhangi iki tutarlı değerden oluşmalıdır.

Örnekler

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

Bu , yani her dilin kazanması için en kısa kod olabilir!



8
En azından bu sefer çocuklarınızdan ilham
almıyorsunuz

2
@cairdcoinheringaah kendi işimi benim ikinci ilham kaynağım. Bunun çok basit bir zorluk olduğunu biliyorum, ancak bu kolay zorluklara bazen ihtiyaç duyulduğunu da düşünüyorum. Bir dahaki sefere daha zor bir şey bulmaya çalışacağım.
Charlie

Bu arada, benim işimden ilham alan zorluklarımın çok kolay ya da çok zor olduğu anlaşılıyor ...
Charlie

@ JonathanAllan hayır, her giriş dizesi sadece bir sayıyı temsil eder. Dizeler arasında boşluk kalmaz.
Charlie

Yanıtlar:


22

Javascript , 11 bayt

a=>b=>+a==b

Javascript'in yayın kurallarını biraz kötüye kullanmak; Sayısal tipte +azorlar a.

Shaggy ve Martin Ender sayesinde -6 bayt

Ayrıca LiefdeWen tarafından serin bir almak :

a=>b=>~~a==~~b

2
PPCG'ye Hoşgeldiniz. Bunu, 11 baytta curri kullanarak ve girişlerden yalnızca birini bir tamsayıya dönüştürerek yapabilirsiniz: tio.run/##y0osSyxOLsosKNHNy09J/… Ayrıca, bir fonksiyonun kendisine referans vermediği sürece değişkeni dahil etmenize gerek olmadığını unutmayın. bayt sayınıza atama.
Shaggy

2
PPCG'ye Hoşgeldiniz! Adsız işlevler gayet iyi, bu yüzden gerek yok c=, ve kullanmak da mümkün a=>b=>...değil (a,b)=>. Sonunda, JavaScript'im biraz paslanmış, ancak bunun gibi bir şeyin !(a-b)de işe yarayacağını düşünüyorum.
Martin Ender

1
Bkz ES6 golf için ipuçları (ve genel JS ipuçları golf sıkıntılarının daha hileler için) çözümleri dışarı bayt.
Shaggy

1
Soğuk versiopn serin ancak kapsamı sınırlı, '9123456789' ve '533522197' girişini deneyin. Bunlar tamsayı değerlerinin sicim dizilimidir, javascript'te geçerli tamsayı aralığının içindedir (ancak 32 bitten fazla)
edc65

1
Metniniz artık kodla eşleşmiyor; çıkarma yok. Unary aile sayısal bir türe baskı yapıyorsun +.
Peter Cordes

18

05AB1E , 1 bayt

Q

Çevrimiçi deneyin!

açıklama

Eşitlik karşılaştırması, Qdizeleri karşılaştırmadan önce otomatik olarak girdi olarak değerlendirmeyi deneyecektir.


Gerçekten? Ben de |0+Qyeterince kısa olduğunu düşünmüştüm ...
1962'de

18

İşlem Flashpoint kodlama dili, 33 bayt

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

İle ara:

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]

Çıktı:

Alternatif sürüm (41 bayt):

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

Hala 5 byte daha basitten daha kısa f={t=_this;call(t select 0)==call(t select 1)}

39 bayt:

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

count(bir dizinin boyutunu döndürür) bunun yerine çalışır forEach, çünkü ona yalnızca bu koşulu karşılayan dizi öğelerini saymak için bir koşul olarak kullanılan bir "lambda" verebilirsiniz. Bu durumda kullanılan "koşul" geçerli bir durum değildir, ancak burada önemli değil çünkü bir hataya neden olmaz ve geri dönüş değerine countihtiyaç duyulmaz.


7
Kodunuzun ekran görüntülerini aldığınız çeşitli durumları seviyorum.
19

11

Taksi , 488 bayt

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.

Çevrimiçi deneyin!

Ungolfed:

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 (nispeten) bu zorluğa çok uygundur çünkü dizeler izin verilen tek girdi veya çıktı türüdür. The Babelfisherydizeleri sayıya dönüştüren şeydir (ve tersi de geçerlidir) ve tüm boşlukları sıyırıp sıfırları sıraya çeker. -İlk haneden hemen önceki ise negatif sayıları da işleyecektir . Bundan sonra Equal's Corner, iki değeri birbirine karşı kontrol eder ve Writer's Depotçıktıyı string formatında sağlar. Çıktı 1truthy ve falsey 0içindir.


1
Güzel bir! Merak ettim, hata ayıklama penceresi neden mesajı gösteriyor error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
@Charlie Taxi, rotanız bittiğinde taksi garajına geri dönmenizi gerektirir. Arabayı geri getirmezsen kovulursun. (Ayrıca her zaman durup yakıt ikmali yaptığınızdan emin olmalısınız ve sonra ya da gazınız tükenirse.) STDERR'ye verimsizliği olmayan kod golf sorularında, genellikle kovulma konusunda endişelenmiyorum. İşinizi kaybetmek istemiyorsanız, hatadan kurtulmak için bunu ekleyebilirsiniz:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

Bu cevap ve yorumları tamamen gerçeküstü. Bu topluluğu çok seviyorum.
Sağ Bacak

@RightLeg Yazdığım en sevdiğim Taksi programı iki hafta sürdü ve çok fazla hata ayıklama aldı. Gerçekten de bir gezi istiyor musun? Check Shakespeare .
Mühendis Toast,

10

C (gcc) , 27 bayt

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

İle -O0(varsayılan ayardır).

Çevrimiçi deneyin!

C, 32 bayt

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

Çevrimiçi deneyin!


2
@Charlie C'de, dizeler dizilerdir charve bir işleve bir dizi ilettiğinizde, aslında işaretçiyi dizinin ilk öğesine geçirirsiniz. Burada, chardizilerdeki işaretçiler örtük olarak işleve iletildiğinde tam sayılara dönüştürülür ve tam sayılar çağrı sırasında işaretçilere geri dönüştürülür atoi.
Steadybox

1
işaretçilerin metinden daha geniş olduğu bir platformda korkunç bir şekilde havaya uçabilecek olan ... sadece şunu söylemek gerekirse, tabii ki buradaki site standartları için uygun :)
Felix Palmen

2
s=foo;Bunun yerine saçma bir saçmalık kullanmak istiyorsanız return foo;, bunu sadece "C" değil "x86 gcc" olarak etiketlemeniz gerekir, çünkü bu kod uygulama artefaktı dışında bir değer döndürmez.
Peter Cordes

2
Ben herhangi bir mimariler olup olmadığını görmek isteyen gitti s=retval;yerine return retval;aslında kırdı. Görünüşe göre, gcc'nin iç mantığı ( -O0yalnızca ile birlikte ) aslında son ifadeyi dönüş değeri olarak görür, belki de bir GNU C cümlesi ifadesinin çalıştığı gibi. (Ama gerektirir s=). ARM32'de ==sonucu hesaplar ve dönüş değerini elde etmek için r3fazladan kullanır mov r0, r3! Bu, x86'ya özgü bir gcc -O0hack değil, gcc'nin destekleme yolundan çıktığı bir hack.
Peter Cordes

2
@ KenY-N Tüm c kodu golf noktasını kaçırıyorsunuz. Bu, asgari miktarda kod girebileceğiniz ve istediğiniz sonuçları elde edebileceğiniz, taşınabilir bir deneyim sağlamayacağınız bu son derece keskin vakaları bulmakla ilgilidir.

8

J , 4 bayt

=&do

Değerlendirdikten =sonra karşılaştırın . Ayrıca çevrimiçi deneyebilirsiniz!&do=&".


İlginç bir şekilde bu, diğer dillerin anladığı (örneğin -10) ve _10monadiklerin -çalışma şekli nedeniyle J'nin anladığı gibi negatif (örneğin ) negatifler için işe yarayacaktır .
cole

6

Retina , 11 bayt

.+
$*
D`
¶$

Çevrimiçi deneyin!

Giriş satır besleme ile ayrılmıştır, ancak test paketi kolaylık sağlamak için virgülle ayırma kullanır. 1Eşitlik ve 0eşitsizlik için baskılar .

açıklama

.+
$*

Her çizgiyi birliğe dönüştürün. Bu, önde gelen sıfırları ve boşlukları yok sayar.

D`

Tekilleştir: Her ikisi de aynıysa ikinci satırı temizle.

¶$

Dizenin şimdi satır beslemede bittiğini kontrol edin.




3

Üçgensellik , 17 bayt

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

Çevrimiçi deneyin!

Üçgenlik bir kereliğine rekabetçi!

Nasıl çalışır

Üçgenlik, kodun noktaların üçgen bir dağılımına sahip olmasını gerektirir. Yani, her satırın uzunluğu 2 ile çarpılan ve azalan satırların sayısına eşit olmalı ve her satırın (her bir tarafta) programdaki konumuna eşit sayıda noktaya sahip olması gerekir (alt satır satır 0'dır, üstündeki, satır 1 ve benzeridir). Bunu aklımızda tutarak, kodun nasıl çalıştığını analiz edelim:

..).. || 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.

3

Alice , 7 bayt

X/n
o@i

Çevrimiçi deneyin!

Rakam olmayan herhangi bir ayırıcı çalışır. 1Eşitlik için yazdırır ve 0başka.

açıklama

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.

3

Japt , 3 bayt

¥Vn

Dene

İkinci girişi bir tam sayıya dönüştürür ve ilk ile eşitliği karşılaştırır.



3

jq, 24 karakter

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

2 dize bir dizinin öğeleri olarak iletilir.

Örnek çalışma:

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

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

Çevrimiçi deneyin! ( Tüm test durumları )



3

PowerShell , 20 bayt

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

JavaScript yanıtına benzer şekilde, PowerShell'in hiç kıvrılmadığı için daha uzun süre. Kullanımları+İlk dizgiyi tamsayıya dönüştürmek için ve ardından -equals otomatik olarak ikinci dizgeyi tamsayıya aktarır. Çıktı Doğru / Yanlış.

Çevrimiçi deneyin!


3

PowerShell , 19 bayt

$args-join'-eq'|iex

Çevrimiçi deneyin!

-joinarray ( $args) argüman dizisi ile karşılaştırma işlecinin ( -eq) dizesini gösterir, sonra ifadeyi Invoke-Expression( iex) ile değerlendirir .


İlginç. Tamsayıya gerek kalmadan nasıl geçeceğinizi merak ediyorum, oysa +ki dize eşitliği kontrolü yaptığım için çıkardığımda mayın kırılıyor .
AdmBorkBork

@AdmBorkBork, esasen PowerShell kodunu ürettiğimden ve ardından çalıştırdığım için, ve önde gelen sıfırlar ve baştaki / sondaki boşluklar tercüman için önemli olmadığından, "sadece işe yarar". 2 sayı 00009 ve 077 sonuçta ortaya çıkan kod şuysa 00009 -eq077 , tamamen geçerli bir kod parçası. Çalışma zamanında dize ile doğrudan ilgileniyorsunuz, bu yüzden işlem sayısal bir şekilde yapılmak için önce yayınlamalısınız.
briantist

Doğru, evet, bu mantıklı. Açıklama için teşekkürler.
AdmBorkBork

3

Q (Kdb +), 13 bayt

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

açıklama

(x; y): iki girişin bir listesi.

"J" $: her bir girişi string (10c) 'den uzun (7j) tipine çevirir, ki bunlar doğru yorumlayabilir
beyaz alanı ve baştaki 0'ları çevirmek.

= /: Bir listedeki öğeler üzerindeki eşitliği kontrol eder (her bir sonraki çift).
Sadece bir çift olduğu için, tek boolian 0b / 1b döndürür.


PPCG'ye Hoşgeldiniz! Genellikle, bir çevrimiçi tercüman / derleyiciye bir bağlantı takdir edilir ve açık değilse bile bir açıklama yapılır.
FantaC

Teşekkürler! Açıklama orada eklendi. Q için çevrimiçi bir tercüman olduğundan şüpheliyim, hızlı bir şekilde baktım ve bir tane bulamadım.
Sidney

Bu yani küme parantezleri dahil bir lambda olarak yazılmalıdır söyleyebilirim {=/["J"$(x;y)]}için 15 bayt 8 bayt için bu olabilecekse de ...: (~/)"J"$Sadece Çoğaltma kullanarak ve dizeleri bir liste halinde girdi geçiyoruz .. veya fonksiyon olarak 11{(~/)"J"$x} için .
streetster,

3

T-SQL, 35 bayt

Bizim standartlarımıza Başına , veri önceden varolan tabloda aracılığıyla girişidir tile varcharalanları ave b.

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

İade 1onlar, maç eğer 0gelmezlerse.

Bir SQL'ın matematiksel fonksiyonların birkaç (dahil ABS, FLOORve CEILINGdize parametreleri verilirse) bu açık daha kısadır, sayısal bir örtük dönüştürme yapacak CAST(a AS INT)ya CONVERT(INT,b)biz girdi değerleri her zaman pozitif olduğunu biliyorum çünkü bu durumda, ve eserleri.

IIF MS SQL 2012 ve daha üstü sürümlere özgü olduğundan, diğer uygulamalar için hiçbir garanti yoktur.


3

Excel VBA, 27 16 Bayt

-9 @Nayrb ve @TaylorScott'a teşekkürler

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

Hücrelerde bulunan değerleri girdiğiniz yer 'string.

Girdi Strings ve nerede xve bir Boolean çıkışıdır.yz

CInt (x) = CInt (y) ise z = 1

CInt kullanma


1
Neden olmasın: z = xy = 0?
Nayrb

Ne yazık ki bu çözüm girişi almaz olarak geçersiz ve oldukça (önceden tanımlanmış değerlere sahip dayanır toplumun kurallarına aykırı kabul edildiği ) ve (bir değişkene çıkış olanağı toplum kurallarına aykırıdır )
Taylor Scott

Geçerli bir çözüme gelince, belki de ?[Int(A1)=Int(B1)]aralıklarla giriş yapan A1ve B1VBE anında penceresine çıkan bir anlık pencere işlevi gibi
Taylor Scott




2

Gema , 21 karakter

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

Gema’da boole yok. De @get-switch{}/ @set-switch{}işlevleri anahtar durumları temsil etmek üzere 0 ve 1 kullanarak, ayrıca 0 ve 1 kullanılır.

2 karakter ayrı giriş satırlarında iletilir.

Örnek çalışma:

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



2

Ataşesi , 11 bayt

Same@Map&:N

Çevrimiçi deneyin!

Bu gibi bir dizi dizesini alır V["0001", "1 "]. Basitçe ifade etmek gerekirse , argümanı üzerinden Map&:Neşleyen Nve Samedizinin yalnızca eşit üyeler içerdiğini kontrol eden bir işlevdir . (Eğlenceli gerçek: bu işlev 2'den fazla dize argümanı için çalışır.)


2

SNOBOL4 (CSNOBOL4) , 42 bayt

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

Çevrimiçi deneyin!

Gerçeklik için 1, yanlışlık için hiçbir şey yok. Yana (boşluk), Snobol içinde birleştirme operatörü EVALlider / arka boşluk içeren bir dizi ing sayıda kendisi verir, ve bu da düzgün bir şekilde bir lider sıfır ilgilenir. EQSayısal eşitlik için testler, koşullu OUTPUTolarak 1'e ayarlı Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 belirtilmiş BASIC bayt

Neil sayesinde yeni bir çözüm (bahşiş için teşekkürler).

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

Bu çözüm kullanıcı girişi gerektirir; bu nedenle, beyaz boşluklara ve / veya baştaki sıfırlara sahip iki dizgiye girin veya eşit olmayan sayısal değere sahip iki dizgiyi girin; 0yanlıştır ve1 satır üç girilen her dizenin değerini karşılaştırdığında doğrudur.

Eski çözüm: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 belirtilmiş BASIC bayt

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

Gerçek kontrol, sadece ~ 16 belirtilmiş BASIC baytları olan üçüncü satırda yapılır; bu nedenle, her test senaryosu çiftine doğrudan mod kullanılarak girilmesi listeden ~ 30 bayt tasarruf edecektir. Bu bayt sayısının içermediğine dikkat edin var stack.


1
Kullanmak gerekmiyor INPUT A$ve INPUT B$? Ayrıca ()s ihtiyacın olduğunu sanmıyorum .
Neil

Evet, bunu da kullanabilirim - sadece bir kavram kanıtı istedim
Shaun Bebbers

2

APL (NARS2000) , 7 bayt

=⍥⍎

Evet, biliyorum, Unicode kullandığı için NARS2000'in burada Dyalog'da rekabet edemeyeceğini biliyorum, ama göstermeyi tercih ettiğimi düşündüm ( NARS2000'de Kompozisyon olarak adlandırılıyor, aslında işlevsellik kompozisyonuyla ilgisi olmasa da) Bir yerleşik olarak var ve burada daha önce hiç kullanıldığını görmedim. Dyalog'da olduğu gibi uygulanmalıdır {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. Yaptığı şey hem sol hem de sağ argümandaki sağ operand monadik fonksiyonunu çağırmak ve ardından sonuçlar üzerinde sol operand dyadic fonksiyonunu çağırmak.

Burada sağ işlenen ( Yürüt , yani eval) ve sol işlenen =( Eşit Kime , yani argümanlarının eşit olup olmadığını kontrol et).


Kompozisyon ve yürütmenin boşluk olarak gösterilmesi gerekiyor mu?
John Dvorak

@JohnDvorak um, hayır? Bunlar boşluk değil, ikinci karakter U + 2365 APL FONKSİYONEL SEMBOL Çember DIZERİZİ ve üçüncü U + 234E APL FONKSİYONEL SEMBOL AŞAĞI TACK JOT.
Outgolfer Erik,

@JohnDvorak Bunu görüntülemekte olduğunuz yazı tipinin, kod noktaları için sembolleri olmayabilir.
Büyük

@ Οurous Ben de durumun çok fazla olduğundan şüpheleniyorum, ancak iyi güncellenmiş bir yazılım kullanıyorsanız, bu tür karakterleri görüntülemekte sorun yaşamazsınız.
Outgolfer Erik,
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.