Çöpçatan, çöpçatan, beni eşleştirin


21

(ama bir şey bulmayacak Findveya yakalamayacağız tryCatch)

Bu, bazı ilginç R fonksiyonlarını uygulamanın çok parçalı serisinin ikinci kısmıdır. Birinci bölüm burada bulunabilir .

Görev:

R'nin matchfonksiyonunu mümkün olduğu kadar az baytta uygulayacaksınız .

Giriş:

  • x, muhtemelen boş bir liste / tamsayı dizisi
  • table, muhtemelen boş bir liste / tamsayı dizisi
  • nomatch, tek bir tamsayı değeri
  • incomparables, muhtemelen boş bir liste / tamsayı dizisi

Çıktı:

  • her değerin ikisini birden temsil ettiği , Oeşit uzunlukta tam sayıların bulunduğu bir dizi / liste : xO[i]
    • Endeks jiçinde ilk değerdentabletable[j]==x[i]
    • nomatch, Hiçbir değer gösteren tablena eşit x[i] TD bu x[i]listesinde olup incomparables.

Test Kılıfları

All in the form x, table, nomatch, incomparables -> output
outputs 

[], [1,2,3], 0, [5] -> []

[1, 2, 3], [], 0, [5] -> [0, 0, 0]

[9, 4, 3, 6, 3], [9, 8, 7, 6, 5, 4, 3, 2, 1], -1, [4] -> [1, -1, 7, 4, 7]

[8, 6, 7, 5, 3, 0, 9], [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6], 1000, [1] -> [12, 8, 14, 5, 1, 1000, 6]

Gerektiğinde daha fazla test durumu oluşturulabilir.

Ek kurallar:

  • R, 1 bazlı endekslere sahiptir, ancak tutarlı bir alternatif bazlı endeksler kabul edilebilir. Böylece, 3 veya 17'de başlayan endeksleri veya her neyse kullanabilirsiniz, ancak bu tutarlı olmalı ve bunu cevabınızda belirtmelisiniz.
  • Dil seçtiyseniz, bunu yapan bir yerleşik yapı varsa, lütfen kendi çözümünüzü de uygulayın.
  • Açıklamalar takdir edilmektedir.

Bu , bayt cinsinden en kısa çözüm kazanıyor!


Negatif sayıları desteklemesi gerekir mi? Gerekmediğini farz edeceğim, çünkü yalnızca örnek bunu varsayıyor ve bunun için standart bir kural olduğundan eminim.
— wizzwizz4

@ wizzwizz4 hayır, çünkü 4olduğunu incomparableso eşleşti edilemez yüzden. Diliniz negatif sayıları destekleyemiyorsa, negatif olmayan sayılar istemeniz iyi olur, ancak gönderiminizde bu varsayımı belirtin.
— Giuseppe

1
Başlık yorumuna ek olarak: Biz de yapmayacağız make.
— val diyor Reinstate Monica

1
@val aslında Çatıdaki Fiddler'a oldukça kötü bir referans ; Tüm bu zorluklar, çeşitli gösterilerden sonra temalı oldu, çünkü bu mükemmel bir tema oluşturacak kadar mükemmeldi.
— Giuseppe,

Yanıtlar:


8

Jöle ,  10  8 bayt

-2 , Outgolfer Erik'e teşekkürler

,⁷y⁵iⱮ⁶o

incomparables nomatch table xR'nin matchfonksiyon sonuçları listesinin bir Jelly gösterimini * basan dört komut satırı argümanını kabul eden tam bir program .

Çevrimiçi deneyin!

Nasıl?

örneğin incomparables nomatch table x= [1,4], 2, [2,4], [4,3,2,1,0]:

,⁷y⁵iⱮ⁶o - Main Link: list, incomparables; list, nomatch
 ⁷       - newline character                                '\n'
,        - pair (incompararables) with (right)              [[1,4],'\n']
   ⁵     - 5th argument (3rd input = table)                 [2,4]
  y      - translate (right) with lookup (left)             [2,'\n']             
      ⁶  - 6th argument (4th input = x)                     [4,3,2,1,0]
     Ɱ   - map with:
    i    -   first index of (right) in (left)               [0,0,1,0,0]
       o - logical OR                                       [2,2,1,2,2]

Diğer listeler içine alınır iken * Boş bir liste, hiçbir şey sadece bir öğe olarak temsil edilir lenth birinin bir listesini temsil edilir []ve ile sınırlanmış,



6

R , 55 bayt

Bu durumda, kod matchtam işlevselliği ile kullanmaz , sadece bir indexişlev olarak kullanılır . İlk R cevabı, bu yüzden muhtemelen inanılmaz derecede etkin olmayan bayt!

Not ( bilgi için Giuseppe'ye teşekkürler ) : %in% ve setdiffher ikisi de dahili olarak uygulanır match, bu nedenle bu şaşırtıcı derecede yararlı işlevden tamamen kurtulmak karışıklığa neden olur . Bu nedenle, bunun için son teslim tarihi olmayan 150 kişilik bir ödül var! ( setdiffbuna rağmen izin verildiğine dikkat edin )

function(x,t,n,i)ifelse(x%in%setdiff(t,i),match(x,t),n)

Çevrimiçi deneyin!

veya...

R , 5 bayt

match

Çevrimiçi deneyin!


Ben kullanımını eschewing rağmen Eminim daha iyi yapabileceğini değilim %in%ve match; Bu işlevlerden herhangi biri olmadan iyi bir golfy cevap bulmak istersen (muhtemelen korkunç olabilir), bunu ödeyeceğim.
— Giuseppe

Ah lol, ben sadece golfR bu konuda yorum yaptı ...
— Mr.

Sadece snarky matchteslimi için oy verildi
— Punintended

ifelseBu ipucunu kullanarak kısaltabilirsiniz : codegolf.stackexchange.com/a/97826/59530
— JAD

2
ayrıca, daha uzun gönderiminiz gerçekte kullanır match: S
— JAD






4

Python 3 , 60 bayt

lambda x,t,n,i:[v in{*t}-{*i}and-~t.index(v)or n for v in x]

Çevrimiçi deneyin!


Bunun hangi özellikleri 3.8'e özgü? Bana öyle geliyor ki, bu Python 3'ün yıkılması için işe yarayabilir.
— Theo

Eh, 3.8'e özgü değildir . TIO'da otomatik olarak oluşturulan şablonu kopyaladım, böylece 3.8 kullandığımı fark etmedim. Heads-up için teşekkürler, ayarlayacağım.
— Bay Xcoder

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Böylece çıkıp -~-1 bayt için 0 indeksleme kullanabilirsiniz.
— Value Ink,

1
@ValueInk Bu, 3. test durumu için başarısız olur (ve genel olarak eşleşen bir öğe listenin başındayken), çünkü Python'da 0 hatalı.
— Bay Xcoder

1
Ah, fuar şovu. Bu arada, t.index(v)if v in{*t}-{*i}else nşu anki v in{*t}-{*i}and-~t.index(v)or nçözümünüzle tam olarak aynı bayt değerine sahiptir haha
— Value Ink



3

Perl 6 , 45 bayt

->\b,\c,\d{*>>.&{$_∉d&&~b.first($_,:k)||c}}

Çevrimiçi deneyin!

Girdiyi alan anonim kod bloğu köreli, beğenir f(table, nomatch, incomparables)(x)ve döndürülen eşleştirmeleri 0 döndürür.

Açıklama:

->\b,\c,\d{                               }    # Anonymous code block taking 3 inputs
           *           # Return an anonymous Whatever lambda
            >>.&{                        }  # Mapping input to
                 $_∉d                       # If the element is not an uncomparable
                     && b.first($_,:k)      # Return the first index in the table
                       ~                    # Stringified so Nils are false
                                      ||c   # Else the nomatch element
~~

+1 Bu konuda kısaca çalıştım, ancak $_∉d&&b.antipairs.Map{$_}||cişe yarayacak olan şeyi yaptım, ancak 0'ın falsey değeri için yaptım.
— user0721090601

2

Kömür , 14 bayt

IEθ∨∧¬№ει⊕⌕ηιζ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. 1 endeksli. Açıklama:

  θ             First input (x)
 E              Map over elements
       ε        Fourth input (incomparables)
      №         Count occurrences of
        ι       Current element
     ¬          Is zero
    ∧           Logical And
           η    Second input (table)
          ⌕     Find 0-based index of
            ι   Current element
         ⊕      Convert to 1-indexed
   ∨            Logical Or
             ζ  Third input (nomatch)
I               Cast to string
                Implicitly print on separate lines

2

C (gcc) , 125 bayt

1 endeksli.

İletilen dizilerde sentinel değeri kullanamadığım için, her dizi için dizi sınırları vermem gerekiyor.

f(x,c,t,d,n,i,e,j,f)int*x,*t,*i;{for(;f=0,c-->0;x[c]=--f?n:j){for(j=e;!f&j;x[c]-i[--j]||--f);for(;!f&j<d;x[c]-t[j++]||++f);}}

Çevrimiçi deneyin!


2

Ataşesi , 39 bayt

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}

Çevrimiçi deneyin!

Oldukça basit bir doğrulama. Argüman sırasının eşleşmeden farklı olduğuna dikkat edin; Özellikle, xbirinciden ziyade son argümandır _4ve yukarıdaki kod parçasına karşılık gelir .

açıklama

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}
${                                    }   named lambda, taking parameters x, y, z, and _4
                            x&Index@_4    short for Index[x, _4];
                                              calculates where each element in _4 occurs in x
                                              returns `nil` for no match
  {                      }=>              over each index:
   [_,y][               ]                     choose y (`nomatch`) if
         nil=_                                    the index is nil
              or x@_in z                          or the element is in `incomparables`
    _                                         otherwise, choose the index

2

Haskell, 57 56 bayt

(t#n)i=map$maybe n id.($zip i[n,n..]++zip t[1..]).lookup

Argüman sırası: table, nomatch, incomparables, x.

Çevrimiçi deneyin!


2

05AB1E , 7 bayt

õ:Ik®I:

0 endeksli. Girdiler sırayla şunlardır: incomparables, table, x, nomatch.

Çevrimiçi deneyin.

Açıklama:

õ:       # Replace all values of the (implicit) first incomparables-list in
         # the (implicit) second table-list with an empty string
         #  i.e. incomparables=[4] and table=[9,8,7,6,5,4,3,2,1] → [9,8,7,6,5,"",3,2,1]
  Ik     # Get the index of each value in the third x-list in this list (-1 if not found)
         #  i.e. x=[9,4,3,6,3] → [0,-1,6,3,6]
    ®I:  # Replace all -1 with the fourth input-integer
         #  i.e. nomatch=-99 → [0,-99,6,3,6]
         # (and output the mapped list implicitly as result)
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.