T9 benzeri işlevsellik uygulama


10

Bugünkü zorluğunuz t9 benzeri bir işlevsellik uygulamaktır .

Sadece 2 parametreye sahip olacak bir fonksiyon uygulayacaksınız.
Bir dizede 1 telefon numarası ve bir kelime listesi içeren bir metin dosyasının içeriği alırsınız (belirli bir yeni satır stili varsaymayın). İşlevi test etmek için https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt
bağlantısını kullanabilir veya daha fazla bilgi için (Kapalı bir kelime listesiyle [kapalı] bir metin dosyasını kontrol edin) kullanabilirsiniz. bilgi)./usr/share/dict/words

Her zaman en az 2 numara alacağınızı varsayabilirsiniz.

Sayı göz önüne alındığında, bir kelime listesinden okuyacak ve harflerle başlayan kelimeleri bu kelimelerle döndüreceksiniz. Bu, girişin yalnızca 2'den 9'a kadar sayılar olması gerektiği anlamına gelir
. Geçersiz giriş alırsanız istediğiniz her şeyi yapabilirsiniz.

Eşleşme bulunursa, boş bir listesini döndürür, olabilir null/ nilveya 0.

Cep telefonu tuşlarının eşdeğer karakterlerle eşlendiğini unutmayın:

  • 0 ve 1 geçersiz
  • 2 eşleşme [abc]
  • 3 eşleşti [def]
  • 4 eşleşme [ghi]
  • 5 eşleşme [jkl]
  • 6 eşleşme [mno]
  • 7 eşleşme [pqrs]
  • 8 eşleşme [tuv]
  • ve 9 eşleşme [wxyz]

Örnekler:

f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]

f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]

f('1234')
//makes demons fly out your nose or divide by 0

f('9999')
//returns ["Zyzzogeton"]

f('999999')
//returns [] or null/nil or 0

İşlevinizi çalıştırdıktan sonra istediğiniz şekilde yazdırabilirsiniz.

Kurallar:

  • Standart boşluklar GEÇERSİZDİR
  • Ne olduğunu bile bir şey dönmelidir null/ nil
    JavaScript dönecektir undefinedşey dönmemesi halinde, bu nedenle bu kuralı.
  • Başkalarının cevaplarını kullanamaz veya yeniden uygulayamaz veya uygulamamı kopyalayamazsınız.
  • Javascript için tarayıcının zaten açılacağını ve otomatik elemanın innerText/ textContentparametresinin 2. parametre olarak iletileceğini varsayabilirsiniz.
  • Derlenmiş diller için derleyiciye özel argümanlar iletemezsiniz
  • Dosya adını derleyici argümanları üzerinden alabilirsiniz
  • Değişkenler, makrolar, genel değişkenler, sabitler, standart olmayan sınıflar ve işlev içindeki diğer değerleri geçen tüm türler geçersiz sayılacaktır.
  • Javascript'te, anahtar kelimesi olmayan değişkenler varkodunuzu geçersiz kılar
  • İşleviniz adlandırılacak f
  • İşlevinizde yalnızca ve yalnızca 2 argüman olabilir
  • Kodunuzu çalıştırmak için 500 saniyenin altında tutmaya çalışın.
  • Boşluk konusunda endişelenmenize gerek yok
  • Yalnızca ASCII yazdırılabilir karakterler kullanmalısınız .
    İstisnalar yalnızca yazdırılamayan karakterler kullanan dillerdir (APL ve boşluk 2 örnektir).

puanlama:

  • En az bayt kazanma sayısı
  • Cevabınızda geçersiz ASCII yazdırılabilir karakterlerin bulunması, UTF-32'de kodlanan cevap olarak sayılır Kodlamanın
    istisnası, cevabınızın karakterlerle sayılmasını sağlayacaktır .
  • Sadece işlev gövdesi önemlidir, dışında yaptığınız hiçbir şeyi saymayın
  • Mahalle veya en yaygın kelimeleri temel alan bir tahmin sistemi yaparsanız% -30 bonusu
  • İlk sayıya karşılık gelen her harf için yalnızca ilk 5 eşleşmeyi döndürürseniz% -20 büyüklük bonusu (örneğin: 245, 'a' ile başlayan 5 kelime, 'b' ile başlayan 5 kelime ve 'c' ile başlayan 5 kelime döndürür ).

Javascript kullanan bir uygulama örneği:

function f(phone, words)
{
    var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
    var regex='';

    for(var i=0,l=phone.length;i<l;i++)
    {
        regex+='['+keypad[phone[i]]+']';
    }

    var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');

    return words.match(regexp);
}

Çalıştırmak için liste bağlantısını açın ve çalıştırın: Örneğin:

f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]

Bu örnek test edilmiş ve Windows 7 Home Edition 64 bit üzerindeki Opera 12.17 64 bit altında çalışmaktadır.


Programın ikinci argümanı, kelimeleri veya kelimelerin listesini içeren bir dosya adı mıdır?
Doktor

@ MartinBüttner UTF-8 adil değil (ASCII karakterlerini 1 bayt olarak sayıyor), ancak kuralı değiştirdim.
Ismael Miguel

@Optimizer 2. argüman kelimelerin bir listesidir. Dosya adını bir derleyici argümanından geçirebilir ve isterseniz dosyayı okuyabilirsiniz. Ancak önemli olan tek şey işlev gövdesidir.
Ismael Miguel

@ MartinBüttner ASCII olarak sayıldığında bayt olarak sayılmaktadır. APL kodunun 8 bit büyüklüğünde 1 bayta sahip olduğunu söylememi ister misiniz?
Ismael Miguel

2
Kısıtlamalar için -1
AJMansfield

Yanıtlar:


3

CJam, 28 bayt

q~{el{'h-_9/-D+3/}%s1$#!},p;

Girdi şeklinde alır "<number>" [<list of words>]

Misal:

"52726" ["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines" "ablution" "ablutionary" "abluvion" "ably" "abmho" "Abnaki" "abnegate"]

Çıktı:

["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines"]

Şimdilik bonus almayacak.

Kodu çevrimiçi olarak burada deneyin, ancak gerçek zamanlı ölçümler için Java derleyicisinde çalıştırın

CJam'ın aşağıdaki gibi boş listeleri temsil ettiğini unutmayın: ""

Ham wordlist'i CJam listesine dönüştürmek için wordlist ile girdi olarak aşağıdaki kodu kullanın:

qN/p

"Bir dize 1 telefon numarası ve kelime listesi içeren bir metin dosyasının içeriği alacaksınız" -> farklı bir blokta, dosyayı kullanılabilir bir listeye okumak için gereken kodu uygulayabilir misiniz?
Ismael Miguel

@IsmaelMiguel Bu kodun bir parçası değil, sadece listeyi doğru biçime dönüştürmek için bir yardımcı kod mu demek istiyorsunuz?
Doktor

Kesinlikle. Kodunuzun sağlanan örnek olarak bir kelime listesini kullanabileceğini kanıtlamak için yeterli olmadığı. Ama yine de iptal ettim, sadece yardımcı kodu istedim.
Ismael Miguel

Cevaba ekleyebilir misiniz? Bir düzenleme olarak, farklı bir bölümde
Ismael Miguel

Kesinlikle. Bahsettiğim bu! Daha da optimize edip edemeyeceğinize bakalım
Ismael Miguel

2

Java: 395

Bu, her sayı için izin verilen harflere dayalı bir normal ifade deseni oluşturur ve daha sonra aşağıdaki karakterlerle eşleşmesi için sonunda. * İşaretini kullanır.

İşte golfçü versiyon:

static ArrayList<String> f(String n,ArrayList<String> d){String[] k={"","","([A-Ca-c])","([D-Fd-f])","([G-Ig-i])","([J-Lj-l])","([M-Om-o])","([P-Sp-s])","([T-Vt-v])","([W-Zw-z])"};String r="";for(int i=0;i<n.length();++i)r+=k[n.charAt(i)-'0'];r += ".*";Pattern p=Pattern.compile(r);ArrayList<String> a=new ArrayList<String>();for(String w:dictionary)if(p.matcher(w).matches())a.add(w);return a;}

Ve burada okuma yeteneği için ungolfed versiyonu

public static ArrayList<String> f(String phoneNumber, ArrayList<String> dictionary) {

    String[] KEY_VALUES = {"", "", "([A-Ca-c])", "([D-Fd-f])", "([G-Ig-i])",
                                            "([J-Lj-l])", "([M-Om-o])", "([P-Sp-s])",
                                            "([T-Vt-v])", "([W-Zw-z])"};

    String regex = "";
    for (int i = 0; i < phoneNumber.length(); ++i) {
        regex += KEY_VALUES[phoneNumber.charAt(i) - '0'];
    }
    regex += ".*";
    Pattern p = Pattern.compile(regex);
    ArrayList<String> answers = new ArrayList<String>();
    for (String word : dictionary) {
        if (p.matcher(word).matches()) {
            answers.add(word);
        }
    }
    return answers;
}

Kodunuz 7 numaralı kurala aykırıdır: "Değişkenler, makrolar, genel değişkenler, sabitler, standart olmayan sınıflar ve işlev içindeki diğer değerleri geçen tüm türler geçersiz sayılacaktır." ve bu kural 3 numaralı kurala aykırıdır: "Başkalarının cevaplarını kullanamaz veya yeniden uygulayamazsınız veya uygulamamı kopyalayamazsınız.", ancak kodunuzda biraz tartışılabilir. Aynı zamanda 9. kurala da aykırıdır: "İşlevin adı f".
Ismael Miguel

@IsmaelMiguel Hata. Kural 7, fonksiyonun içindeki sabit hareket ettirilerek kolayca sabitlenebilir. Daha iyi programlama stili için fonksiyonun dışına çekiyordum. Kural 9 da kolay bir düzeltmedir. İtiraf ediyorum, cevabınızı okumadım, bu yüzden kasten kopyalamaya çalışmadım. Yarışma için çok yakın olduğunu düşünüyorsanız cevabımı kaldırabilirim.
Brian J

Cevabınız iyi. Kodunuzda bir hata var. Son sabitte ( ([W-Zw-z)]) olmalıdır ([W-Zw-z]). Ve Code-golf'de programlama stilleri ve iyi uygulamalar hakkında endişelenmenize gerek yok: kodunuz sadece gerekli parametreleri içeren bir şey yapmalıdır. Benim cevap işaretlerseniz, bu satırı göreceksiniz: $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];. Bu PHP'de korkunç bir 'suç'. Temelde PHP'yi varolmayan sabitleri dizelere dönüştürmeye zorluyorum. Bu tamamen kabul edilebilir. Ayrıca, değişkeni $tböyle kullanmadan önce bir diziye bile ayarlamadığımı göreceksiniz
Ismael Miguel

@IsmaelMiguel Normal ifade hatasını iyi yakalar. Gösterdiğiniz için teşekkürler. Yarın gerçekten golf oynamaya çalışacağım; belki bu sitede bazı Java örnekleri bulabilirsiniz.
Brian J

Ben bir java programcısı değilim, ama size bazı şeyler söylüyorum. Bazı ipuçları almak için codegolf.stackexchange.com/questions/6671/… adresini kontrol edebilirsiniz . Genel ipuçları, işe yaramaz boşlukları (satırsonları, boşluklar, sekmeler), bir harf uzunluğunda değişken adlarını kaldırmayı ve kod boyutunu mümkün olduğunca azaltmak için elinizden geleni yapmayı içerir.
Ismael Miguel

1

C # .NET 4.5236

Bu çalışmalı:

IEnumerable<string>F(string n,string d){IEnumerable<string>w=d.Split(null).ToList();string[]a={"","","abc","def","ghi", "jkl","mno","pqrs","tuv","wxyz"};foreach(var i in n){w=w.Where(x=>x.IndexOfAny(a[i-'0'].ToArray())>0);}return w;}

PPCG'ye hoş geldiniz. Kodunuz işe yarayacaktır, ancak yine de çok daha fazla azaltmanız gerekir. Tüm gereksiz boşlukları (boşluklar, sekmeler, yeni satırlar) kaldırarak kodunuzu 167 bayta indirmeyi başardım. Bu kod çok daha fazla azaltılabilir, eminim. Kodunuzu daha da kısaltmak için codegolf.stackexchange.com/questions/173/… ' i okumanızı tavsiye ederim . Size biraz yardımcı olmak için, kelime listesi yeni satırlarla ayrılmış bir dizedir ve foreachiçinde bir kullanmanın zaten mümkün olduğunu varsayıyorsunuz . Zaten olmasını bekliyorsanız IEnumerable, dışarıda kullanılan kodu ekleyin
Ismael Miguel

@IsmaelMiguel TY Ben bakacağım. Bir IEnumerable Liste ne ben dışında ne hiçbir kodu vardır.
Chaossie

Fonksiyonun özelliklerine bakarsanız, 2. parametrenin de bir dize olduğunu göreceksiniz. (Alıntı: "Bir dize 1 telefon numarası ve bir kelime listesi içeren bir metin dosyasının içeriği alacaksınız (belirli bir satırsonu stili varsaymayın).") Ve var üzerinde 1 yararsız boşluk avar.
Ismael Miguel

Sorunuzdaki gelişmeleri fark ettim ve size bir oy verdim. Ama hala varyanıza bir bayt kaydedebilirsiniz a. Ama gerçekten dikkate değer gelişmeler görüyorum! İyi işlere devam edin.
Ismael Miguel

1

Python 2 (155 bayt)

Ayrıca Python 3'te uygun değiştirmelerle ( string-> bytes, bdizelerde önek vb.) Çalışmalıdır .

Ben maketransfonksiyon dışında çağrı sahip "adil" olup olmadığını emin değildi ; değilse, işlev içinde hareket ettirildiğinde 134 bayt olur.

EDIT: Aptal bir gözetimden bir bayt düştü.

Hazırlanmış maketransile 67 bayt:

from string import maketrans
t=maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')

def f(n,w):
    return[x for x in w.split()if x.lower().translate(t).startswith(n)]

İle maketransvücutta, 134 bayt:

from string import maketrans

def f(n,w):
    return[x for x in w.split()if x.lower().translate(maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

İle importve maketransvücutta, 155 bayt:

def f(n,w):
    return[x for x in w.split()if x.lower().translate(__import__('string').maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

Test çağrısı:

print f('9999',open('words.txt','rt').read())

maketransİşlev gövdesinin parçasıdır. Hareket ettirmelisin. Hatta mümkün olup olmadığını bilmiyorum, ama doğrudan kullanmayı deneyebilirsiniz import. Sanırım bir yerde gördüm ... Ama kodun gerçekten güzel!
Ismael Miguel

İçe aktarmayı ve çağrıyı gövdeye taşımak mı istiyorsun ? Evet, bunun da yapılabileceğini düşünüyorum.
criptych,

Düşünüyordum t=(from stirng import maketrans)([...]). Bunun mümkün olup olmadığı hakkında hiçbir fikrim yok. Ama belki de from string import as x t=x([...])mümkün olup olmadığından emin olmadığımı kullanabilirsiniz : /
Ismael Miguel

Doğru sürüm son sürümdür. Ama olduğu gibi cevap bence kabul edilebilir. İçin +1 __import__('string').maketran.
Ismael Miguel

Tamam teşekkürler. Geçersiz cevapları kaldırdım.
criptych,

0

PHP 5.4+ (171 % 186-20 = 148,8 bayt):

Bu oldukça büyük bir cevap, ama iyi.

Umarım bu daha fazla insana cevap verir.

Bu işlev okunan ham içeriğin beklemesini sağlar .

İşte kod:

function f($_,$a){$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];$a=preg_split('@\r\n|\r|\n@',$a);for($i=0;$c=$_[$i];++$i)foreach($a as$k=>$v)if(!strpos(1..$s[$c],$v[$i])||$t[$v[0]]++>4)unset($a[$k]);return$a;}

Bu, mektubun izin verilen harfler listesinde olduğunu doğrulayarak çalışır.

Örnek: Giriş , kelimenin ilk harfinin ve 2. harfin 36olup olmadığını kontrol eder .1abc1def

Ben 1mektubu 1. pozisyon (ki dönecekti 0ve bu değerlendirir false) olup olmadığını kontrol etmez . if(!strpos(1..$s[$c],$v[$i]))veya if(!strpos($c.$s[$c],$v[$i]))aynı etkiye sahip olacak, ancak 1'inde daha fazla kafa karıştırıyor ve hoşuma gidiyor.

Bunu yapmazsanız, kelime kaldırılır.

Hiçbir kelime kalmadan boş bir dizi döndürür.

Bunu çevrimiçi test etmek için http://writecodeonline.com/php/ adresine gidin ve satır kelimesiyle basit bir değişken oluşturun.

Test edilebilir bir örnek:

function f($_,$a)
{
    $s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
    $a=preg_split('@\r\n|\r|\n@',$a);

    for($i=0;$c=$_[$i];++$i)
        foreach($a as$k=>$v)
            if(!strpos(1..$s[$c],$v[$i]) || $t[$v[0]]++>4)
                unset($a[$k]);
    return$a;
}

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
WORDS;

var_dump(f('36',$lines));

Bu çıktı:

array(1) {
    [3]=>
      string(4) "four"
}

Eski php sürümlerinde çalışması için, yerine $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];göre$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);


% 20 bonus için:

Kodu azaltmak için basitçe ekledim ||$t[$v[0]]++>4, bu da ilk harfin kaç kez kullanıldığını kontrol ediyor.

Php, $ttanımlanması gerekmez, 37.2 bayt büyük bir yığın azaltmak için yardımcı olur .

Bu efekti görmek için 2. bağımsız değişken olarak aşağıdaki değişkeni kullanın:

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
twelve
time
tutor
test
truth
WORDS;
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.