Çö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.