Bir isim mi değil mi?


22

Girdi olarak bir dize verildiğinde, bir isim olup olmadığını belirleyin.

En yaygın 1000 İngilizce kelime üzerinde, bir isim olarak kaç tane doğru etiketlediğiniz ile puanlanacaksınız.

Bu kelimelerin çoğunu 50 bayt veya daha kısa bir sürede doğru şekilde sınıflandıran program veya fonksiyon kazanacaktır.

İsimler

Bir isim, tipik olarak bir şeyi temsil eden bir kelimedir. Daha karmaşık hale geliyor, ancak temel fikir bu.

Bir kelimenin bir isim veya konuşmanın başka bir parçası olabileceği durumlarda, nadir bir kullanım olsa bile onu bir isim olarak sınıflandırdım. Ya da aslında, bu sitenin benim için yapmasına izin verdim .

Atacağınız kelimeler , "iki" ve "bir kez" eklenmiş basit Wikipedia'dan gelen bu 1000 ortak kelimedir . Bunlardan 586 isim ve bunlar 414 isim değil . Üç listeyi de burada bulabilirsiniz . Tüm bu girişlerin küçük harf olduğuna dikkat edin. Bu listeler kesindir - dilbilgisini tartışmaya çalışmayın.

Bir çıktılar Programınız doğru kabul edilecektir truthy bir isim ve bir isim olmayan bir girişe bir falsy sonucudur girdi üzerinde bir sonuç.

inceliklerini:

Programlar belirleyici bir çıktıya sahip olmalıdır. Eğer rastgelelik kullanmak istiyorsanız, tohumlayın. Programların dahili isim listelerini veya diğer dahili konuşma parçası işlevini kullanmasına izin verilmez.

Örnekler:

a: noun
act: noun
active: noun
about: non-noun
above: non-noun
across: non-noun

Lütfen programınızın başarı oranının cevabınızda ne olduğunu belirtin. En yüksek başarı oranına sahip en fazla 50 baytlık program veya işlev kazanır. Beraberlik durumunda, en düşük bayt sayısı kazanan belirler. İyi şanslar!

Yanıtlar:


13

JavaScript (ES6), 43 bayt, 622 630 633

Sadece topu yuvarlamak için. 1İsimler için, isimler 0için döndürür .

s=>2552>>s.length&/^[bcdf-mp-tvwy]/.test(s)

Nasıl?

Her iki koşulun da yerine getirilmesi durumunda ismin üzerine bahse gireriz :

  1. Kelime uzunluğu 3, 4, 5, 6, 7, 8 veya 11'dir. Bu, 100111111000 (ondalık sayı olarak 2552) ikili sayısının sağa kaydırılmasıyla yapılır.
  2. Kelime şu harflerden biriyle başlar: bcdfghijklmpqrstvwy

JS'yi özellikle akılda tutarak, bayt limitinin çok kısıtlayıcı olduğunu yorumlamak üzereydim, bunu siz yazdınız! Listeye bakmadan, 586'dan daha iyi bir skorun her kelimede ilk veya 2 harfi test etmekle mümkün olabileceğini düşünüyordum. Güzel bitti :)
Shaggy

Javascript'i daha az tanıyan insanlar için bir açıklama güzel olurdu. Söyleyebileceğim kadarıyla, bu, uzunluk sözcüğünün 3, 4, 5, 6, 7, 8 veya 11 olup olmadığını kontrol eder ve kelime aynı zamanda bir harf grubundan biriyle mi başlar?
isaacg

@ isaacg Bu doğru. Açıklama eklendi.
Arnauld,

4
Karakter sınıfının sınıfa [bcdf-mp-tvwy]eşdeğer olduğunu unutmayın [^aenouxz]. Bir değişiklik, büyük harfle yazılabilecek 4 baytı korur.
fireflame241

@ fireflame241 Çok doğru. Ve bu bile kısaltılabilir [^aenouz]çünkü a ile başlayan bir kelimemiz yoktur x.
Arnauld,

11

Jöle , 48 bayt, skor 731

Bu Jelly’deki ilk cevabım ve bunu bir araya getirmekte zorlandım. Ah iyi ... eğlenceliydi. :-)

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ

@JonathanAllan sayesinde 1 bayt kurtarıldı

Çevrimiçi deneyin!

Arıza ve test takımları

Nasıl?

İlk önce girdi dizginin bir karmasını hesapladık:

  • Her kod noktasını temel 256 basamak olarak yorumlayarak onu bir tam sayıya dönüştürmek
  • modulo 4080 uygulanması (en fazla 12 bit ile en verimli değer olarak seçilir)
  • sonucun en önemli 8 bitini tutmak

Bu bizi [0 ... 255] 'te bir indeks ile bırakır ve böylece tüm kelimeleri 256 gruba böler.

Her bir kelime grubu için, 1eğer grup isimsizlerden daha fazla isim içeriyorsa , bir ikili bayrağı önceden hesaplıyoruz 0. Bu, arama tablosu olarak kullanacağımız 256 bit N sayısına yol açar . Temel 250 kodlu bir dize olarak saklıyoruz.

Aşağıda N'nin ikili gösterimi bulunmaktadır .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’Jelly gibi saklanabilir .

Dolayısıyla kod:

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ    main link

O                                                   convert the input string to a list of
                                                    code points
 ‘                                                  increment each of them
  ḅ⁹                                                convert from base 256 to an integer
    %⁽€O                                            modulo 4080
        æ»4                                         drop the 4 least significant bits
           “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»     right shift N by this amount
                                               Ḃ    test the least significant bit

İyi iş! Önyüklemek için bir bayt kaydedin O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(ayrıca TIO'daki altbilgiyi kullanabileceğinizi unutmayın, birlikte Ç€¬S,Lve Ç€S,Liki test takımınız için giderim .)
Jonathan Allan,

@JonathanAllan Püf noktaları için teşekkürler!
Arnauld,

10

JavaScript (ES6), 50 bayt, puan 693

s=>!/^([aouz]|th|..$)|e.+[ey]|[flo].r|a.p/.test(s)

Sadece ismin olmayan ismin sahip olabileceği tüm olası kalıpları arıyorum.

İsimsizler daha sık içerir:

  1. a, o, u veya z ilk harf olarak.
  2. ilk iki harf olarak th .
  3. Sadece iki harf. [Zamirleri düşünün (ben, biz, biz, o, o) ve edatlar (in, by, on, up,…).]
  4. e , ardından bir veya daha fazla harf, ardından e veya y .
  5. f, l veya o , ardından herhangi bir harf, ardından r .
  6. a , ardından herhangi bir harf, ardından p .

Pasaj:


Sana bir ilk düzenli ifade değiştirerek bayt kaydedebilirsiniz inanıyoruz /h|n/(veya yaparak /^.[hn]/.test(s)değiştirerek) ve başka s[2]>''birine !!s[2]veya 2 in s.
ETHProductions

Teşekkürler, @ETHproductions. Önerilerinizi kullanabilir ve iki sınamayı birleştirerek bir sürü bayttan tasarruf edebilirim; bu da puanımı geliştirmek için kod eklememe izin verdi.
Rick Hitchcock

a.pZaten sahip olduğundan beri gereksiz değil [aouz]mi?
AdmBorkBork

@AdmBorkBork, a girişi [aouz]yalnızca dizenin başlangıcında eşleştirilir. Sebep ne olursa olsun , dizede a.p herhangi bir yerde test etmek puanı arttırır.
Rick Hitchcock

10

Jöle , 50 bayt , skor 763

Şimdi bir karma kullanarak ( Arnauld'un Jelly cevabı gibi )

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤

Çevrimiçi Deneyin!

250/414 Sigara isimler
için 513/586 İsimler
Toplam = + 513 = 763 250.

Nasıl?

1 (bir isim tanımlayan) veya 0 (bir isim olmayan tanımlayan) 308 girişli bir tablo oluşturur ve giriş sözcüğünün sıradanını kullanan hash fonksiyonu tarafından sağlanan bir anahtar kullanarak indeksler:

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤ - Link: list of characters, word
O                                                  - convert to ordinals
 P                                                 - product
   ⁽Wp                                             - base 250 number = 22863
  %                                                - modulo (by 22863)
                                                 ¤ - nilad plus link(s) as a nilad:
       “!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’   -   base 250 number
                                                B  -   as a binary list (308 bits)
      ị                                            - index into (1-indexed and modular,
                                                  -   so adds another modulo by 308)

Önceki:  50  47 bayt , puan 684

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$
0,-2ịE¬ȧÇ

Bir sözcük alan ve sözcük bir isim olarak tanımlanırsa bir karakter listesi (truthy) ya da değilse bir boş liste ya da sıfır (her ikisi de falsey) döndüren bir monadik bağlantı.

Çevrimiçi deneyin! (altbilgi, yazdırmak için sonuçta bir if gerçekleştirirNounveyayazdırırNon-Noun)
... veya puanlama programını görmek (iki listedeki truthy endekslerini sayar ve sonra puanı hesaplar).

Skor dağılımı: 462/586 isim doğru tanımlanmadı (124 yanlış), 222/414 isim doğru tanımlanmadı (192 yanlış) - toplam doğru = 684/1000.

Nasıl?

Sanırım bu bir isim değil ...

  • son karakter ve bundan önceki iki karakter eşit (modüler ve 1 tabanlı indeksleme ile)
  • ilk iki uzunluk 2 alt dizesinden biri:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (not: 'm 've's ' sadece sıkıştırmayı kolaylaştırmak için buradalar, ama yine de görünmüyorlar)
  • -299 inci (modüler ve 1 tabanlı indeksleme ile) endeksi herhangi biridir:
    aenouyz(bu ters ve aşırı büyük harflerle uygulanmaktadır rağmen)
    kelimeler her 1 ile 11 arasında uzunluğa sahip bu yana ... -299 inci endeks eşdeğerdir eşlemeyi indekslemek için uzunluğu kullanmak için:{7:2; 8:5; 9:7; 11:9; else 1}

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$ - Link 1: list of characters, word
ḣ3                                    - head to index 3 (1st 3 characters, like 'abc')
  Ẇ                                   - all sublists (['a','b','c','ab','bc','abc']
                    ¤                 - nilad followed by link(s) as a nilad:
    “QṘ°ḂżÐŒ#ḍæ09»                    - compression of "bethlehem evets flaxenfoamaz"
                  s2                  - split into chunks of 2:
                                      -   be,th,le,he,m ,ev,et,s ,fl,ax,en,fo,am,az
   f                                  - filter keep (can only match 'ab' or 'bc')
                     Ȧ                - any and all (0 if empty, 1 if not)
                      ¬               - logical not
                        ØY            - consonant -y yield = "BCD...WXZbcd...wxz"
                          ⁾ni         - character pair = "ni" (no shrubbery for you!)
                             y        - translate (exchange the n for an i)
                              Ṗ       - pop (remove the z)
                       ȧ              - logical and
                                    $ - last two links as a monad:
                                ⁽ż2   -   base 250 literal = -299
                                   ị  -   index into the word
                               f      - filter keep

0,-2ịE¬ȧÇ - Main link: list of characters, word
0,-2      - pair zero with -2 = [0,-2]
    ị     - index into the word (last character and the one before the one before that)
     E    - all (both) equal?
      ¬   - logical not
        Ç - call the last link (1) as a monad
       ȧ  - logical and

13 bayt, puan: 638

İlk hızlı bash (yukarıda uzatılmış)

ØY⁾niyṖf⁽ż2ị$

0,-2anlamına gelmezpair zero with -2literal [0, -2]
Erik Outgolfer

Ama bu aynı etki: p
Jonathan Allan,

hayır bu 0,-2bir nilad değil, ayrı değil (0)(,)(-2)... tabii ki bu durumda aynı etki ama her zaman değil. Bunu zor yoldan öğrendim ... ve ne olursa olsun durum ne olursa olsun, aynı etkiye sahip olan bir şey yerine ne olduğunu açıklamayı tercih ederim.
Outgolfer Erik

Eğer "çift" yerine "katılmak" yazsaydım, "katılmamak" şeklinde yorum yapar mıydınız j?
Jonathan Allan,

Ben biraz bilgiçlik olabilir ama pairya joinberi, belli ki ifade ona yanlış yolu vardır 0,-2,-6, örneğin ortalama yapmaz pair 0 with -2 and then pair that with -6 = [[0, -2], -6]ama daha ziyade araç literal [0, -2, -6]. Anladım, , atom ve ...,...(,...(...)) kelimenin tam anlamıyla kafa karıştırıcı ... ama stilll önceki 1 link ve ikincisi 3 link olduğu 0,-2,-6gibi tamamen aynı değil 0,-2;-6.
Outgolfer Erik

2

Julia 34bytes, 609

f(w)=hash(w)&0x0800000000004808>0

Dahili karma kullanarak karakterlerden tasarruf etmek istedim. Bunu daha iyi yapmanın bir yolu olması gerektiğini düşünüyorum. Julia, bunu daha iyi hale getirmek için kullanmak istediğim biraz becerikli operasyonlarla yeterince arkadaşça olmadığını düşünüyorum.

Karma onları ayırmak için uygun bit maskeleri bulmak, ilginç bir oyundur.


En iyi çözüm;)
tamasgal 15:17

2

Python 2 , 50 bayt, doğruluk: 596

lambda x:2<len(x)<7 or x[0]in"abcgmprs"or"st" in x

Çevrimiçi deneyin!

Basitçe ilk harf, uzunluk ve "st" kodunun Code (Kod) kelimesinde olup olmadığını kontrol eder, kelimenin kelimenin x olarak tanımlandığını varsayar (Düzen: Kod parçacığını işlevine sabitlemek için issacg sayesinde)


Merhaba, siteye hoşgeldiniz. Bu ilginç olsa da, sunumların ya fuction ya da tam program olması gerekiyor. Bu izin verilmeyen bir pasaj. Bunu görün Çevrimiçi deneyin! hala aynı kodu çalıştırırken bu pasajı bir işleve dönüştürmek için bir yol kullanın.
isaacg


2

2 seviyeli mantık geçidi uygulaması, 50 bayt değil, 1000 puan

  1. Sadece verilen kelimenin ikili gösterimini 88 girişe takın

    1. Sözcüğün uzunluğu 11'den küçükse, giriş sözcüğünü sağdaki boşluklarla tamamlayın.
    2. Giriş sözcüğünün her harfi için 8 bit ASCII kodu
  2. Sözcük bir isim ise devre 1, değilse

  3. Mavi kesik çizgiler hiç kullanılmamış girişler içindir.

Bu uygulama ihtiyacı

  1. Tüm invertör kapılarını kodlayan 48 transistör
  2. Tüm VE geçitleri kodlayan 1100 transistör
  3. OR geçidini kodlamak için 154 transistör
  4. 28 bayttan daha az temsil eden toplam 1302 transistör.

Bazı ölçümler

  1. Bir invertör geçidi 1 transistöre ihtiyaç duyar
  2. 2 girişli basit VEYA geçit 2 transistör gerektirir
  3. 2 giriş basit VE geçit 2 transistör gerektirir
  4. Bir bit 6 transistör gerekir

görüntü tanımını buraya girin

Tam çözünürlüklü Circuit.pdf burada

Tam çözünürlükte Circuit.png burada


2
Lütfen bu devreyi bayt olarak kodlamak için sisteminizin tam olarak ne olduğunu açıklayabilir misiniz? Transistör başına 28 * 8/1302 = 0.17 bit kullanma iddiasında bulunma konusunda kafam çok karışık.
isaacg,

Çözümüm çok düşük seviyeli bir bilgisayar çözümüdür (yazılım yerine donanım). Baytımı transistörlere dayandırıyorum. Donanım açısından bakıldığında, bir BIT 6 transistör tarafından kodlanır, bu yüzden bir transistörün 1/6 bit (yaklaşık 0.17) temsil ettiğini varsayabiliriz.
mdahmoune

1
Sizin bakış
açınızı

1
Bu sadece bir bakış açısı değil - bu bir zorunluluktur. Lütfen cevabınızı bu zorlukta yarışmak için gereken şartları yerine getirmediğinden rakipsiz olarak işaretleyiniz.
isaacg

2
Bu çözümü yeniden oluşturmak için gereken bilgilerin basit, sıkıştırılmamış bir ikili kodlaması, her bir mantık geçidinin tipi için 2 bit (3 farklı geçit) ve her bir mantık geçidinin giriş (ler) inin ve çıkışının her bir adresi için 10 bit (675 geçit artı girişler ve çıkışlar). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 bit = 2640 bayt.
Nnnes

1

Python 3, 50 bayt, skor 602

Python en ayrıntılı dil değil, ancak 50 byte zordur.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
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.