Hatırlamak İçin Bir Anımsatıcı 23940


19

Önemli sistem bir olduğunu anımsatıcı daha kolay hafızaya alınabilir, böylece kelimelere sayılar dönü cihazı.

Kelimelerin fonetik olarak nasıl ses çıkardığına dayanır, ancak işleri meydan okuma için basit tutmak için sadece kelimelerin nasıl yazıldığından endişeleniriz. Bu, bazı yanlış dönüşümlerin olacağı anlamına gelir, ancak sorun değil.

Basitleştirilmiş ana sistemimizi kullanarak bir sayıyı kelimeye dönüştürmek için:

  • Her birini veya 0ile değiştirin . (Bazıları olabilir ve bazıları olabilir . Aynı şey aşağıdadır.)szsz
  • Her değiştirin 1ile tveya dya th.
  • Her değiştirin 2ile n.
  • Her değiştirin 3ile m.
  • Her değiştirin 4ile r.
  • Her değiştirin 5ile l.
  • Her değiştirin 6ile jveya shya ch.
  • Her birini veya veya veya 7ile değiştirin .kcgq
  • Her birini veya 8ile değiştirin .fv
  • Her birini veya 9ile değiştirin .pb
  • Mümkünseaehiouwxy gerçek bir İngilizce kelime oluşturmak için harfleri istediğiniz miktarda ekleyin . Bunun tek istisnası, bir veya öğesinden sonra eklenmeyebilir .
    hsc

Sayı aslında 0-9 basamaklarının herhangi bir dizesi olabilir (ondalık sayı, virgül veya işaret yok).
Sözcük yalnızca az küçük harfleri içerebilir.

Örnekler

Sayı 32olarak dönüştürülmesi gerekir ?m?n?nerede, ?harfler yapılmış herhangi sonlu bir dize temsil aehiouwxy(bir dize serbest Monoid İsterseniz). Gerçek bir İngilizce kelimenin içine yapılmış olabilir bu birçok yolu vardır: mane, moon, yeomanvb

Sayı veya 05olarak dönüştürülebilir . Bazı olasılıklar vardır , ve . Kelimeye izin verilmez, çünkü sonra yerleştirilmez ; yanlış okundu .?s?l??z?l?easilyhasslehazelshawlhs65

Meydan okuma

0-9 arasındaki rakamlardan oluşan bir diziyi alan ve basitleştirilmiş ana sistem anımsatıcısı kullanılarak dönüştürülebileceği tüm kelimeleri bulan bir program veya işlev yazın.

Programınızın, tüm "gerçek" İngilizce kelimelerin ne olduğunu tanımlayan bir kelime listesi metin dosyasına erişimi vardır. Bu dosyanın her satırında bir küçük harf az sözcüğü vardır ve isteğe bağlı olarak son satırsonu olduğunu varsayabilirsiniz. İşte test için kullanabileceğiniz gerçek kelimelerin listesi. Bu kelime listesi dosyasının çağrıldığını f(veya daha uzun bir şeyle) ve uygun herhangi bir dizinde bulunduğunu varsayabilirsiniz .

35 baytlık bir ceza için (puanınıza 35 ekleyin), kelime listesinin dizeler listesi olarak zaten bir değişkene yüklendiğini varsayabilirsiniz. Bu esas olarak dosyaları okuyamayan diller içindir, ancak herhangi bir gönderme bundan yararlanabilir.

Programınız , sözcük listesindeki giriş numarasının dönüştürülebileceği tüm sözcükleri çıkarmalıdır. Stdout (veya benzeri), her satıra bir tane (isteğe bağlı son satırsonu ile) olarak yazdırılmalıdır veya bir işlev yazmayı seçtiyseniz, dizelerin listesi olarak döndürülebilirler. Sözcük listesi mutlaka alfabetik olarak yerleştirilmiş değildir ve çıktının da olması gerekmez.

Olası bir kelime yoksa çıktı (veya liste) boş olacaktır. Boş dize girilirse çıktı da boş olur.

Stdin, komut satırı veya bir işleve dize bağımsız değişkeni olarak girdiyi alın. Sözcük listesi veya dosya adı girişin parçası değil, yalnızca rakam dizesi olmalıdır.

Sözcük listesindeki sözcüklerle değil, sözcük listesindeki yalnızca tek sözcüklerle eşleşiyorsunuz. Kelime noonmuhtemelen bunun sonuçlarından biri olacaktır 22, ancak kelime dizisi no oneolmaz.

Test Durumları

Diyelim ki bu kelime listesi:

stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy

Girdi 0123456789dışındaki tüm uzun kelimeleri vermeli zdnmrlshchvbve shthnmrlchgvb:

stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb

Girdi 99şunları vermelidir:

bob
pop
bop
bopy

(Çıktı kelimeleri herhangi bir sırada olabilir.)

puanlama

Bayt cinsinden en kısa gönderim kazanır. Tiebreaker ilk gönderilen gönderir.

Şık ilgili site: numzi.com .


1
Bu videodan bu meydan okuma fikrini aldınız mı ? Aslında Çünkü sadece dün izledi. : P
Kapı tokmağı

1
@Doorknob Bu video değil, o adam. Yıllar önce bana Büyük Kurslar derslerinden biri verildi . Biraz zany ama gerçekten düzgün şeyler yapıyor. :)
Calvin'in Hobileri

1
Anımsatıcı ana sistemi gerçek hayatta kullanmakla ilgilenenler için not: yazım değil, önemli olan ses . Yani "c", burada anlam 7 olarak listelenmiş olsa da, eğer "s" sesi ile telaffuz edilirse ("ace" = 0'da olduğu gibi) aslında 0 anlamına gelebilir. Ancak, tam fonetik ile bir sözlük gelmesi basit bir kelime listesinden daha zor olduğundan, OP'nin meydan okumayı basitleştirdiğinden eminim. Oh, ve 23940'ın bir gösterimi "sayılar" dır.
ErikE

@ErikE Gönderinin ikinci cümlesinde yazım tabanlı bir sürüm kullandığımızı belirtiyorum ...
Calvin'in Hobileri

Şimdi görüyorum, ilk başta özlememe rağmen - ama yine de bana açıklamanız biraz daha fazla olabilir ve bir veya iki örnek verilebilir.
ErikE

Yanıtlar:


6

Perl, 87 84

open A,f;"@ARGV"eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvb\0-z/0-90177789/dr&&print for<A>

Girişi komut satırı parametresi olarak alır:

$perl m.pl 23940

Standart girişte kelime listesine izin verilecekse biraz daha kısa yapılabilir:

$perl -lnE'INIT{$;=pop}$;eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvba-z/0-90177789/dr&&say' 99 <f

Ne anlama Ageliyor open A,f?
feersum

@feersum Daha sonra dosyayı okumak için kullanılan bir dosya tanıtıcısı ( <A>).
nutki

4

Python 2, 215208 bayt

Bu Python çözümü, komut satırı argümanı tarafından dizine eklenen parçalardan bir normal ifade oluşturur, ardından her sözcüğü bu (oldukça büyük) normal ifade ile test eder.

import re,sys
a='[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()
b=z='((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1]:b+=a[int(i)]+z
for d in open('f'):
 d=d.strip()
 if re.match('^'+b+'$',d):print d

Kıyma makinesinden önceki orijinal kaynak:

import re,sys
regexbits = '[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()

regex = other = '((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1] :
    regex += regexbits[int(i)] + other
print regex     # DEBUG

for word in open('f'):
    word = word.strip()
    if re.match('^'+regex+'$', word) :
        print word

Örneğin, testin normal ifadesi 99:

^((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*$

(?<![sc])hBiraz emin a kılan bileşen bir "negatif iddianın arkasında bakmak" dır hbir takip etmez sveya cgenel dolgu kısımlarında.

Teşekkürler Calvin. Bu zorluk beni paslı normal regex becerilerimi geliştirmeye motive etti.


b=c='((?<![sc])h|[aeiouwxy])*'iki bayt tasarruf edecek.
matsjoyce

t|th -> th?bir bayt kaydeder
Sp3000

Doğrudan int (i) 'yi alarak haritayı önleyebilirsiniz.
xnor

Faydalı golf ipuçları için matsjoyce, Sp3000 ve xnor'a teşekkürler. Şimdi uygulanan önerilerle düzenlendi.
Mantık Şövalyesi

2

Python 3, 170

import sys,re
t=str.maketrans('sztdnmrljkcgqfvpb','00112345677778899','aehiouwxy\n')
for s in open('f'):re.sub('sh|ch','j',s).translate(t)!=sys.argv[1] or print(s,end='')

Okunabilir sürüm:

import sys, re

table = str.maketrans('sztdnmrljkcgqfvpb', '00112345677778899', 'aehiouwxy\n')

for line in open('f'):
    line = re.sub('sh|ch', 'j', line)
    if line.translate(table) == sys.argv[1]:
        print(line, end='')

Kod th, gereksiz olan gerçeği kullanır (çünkü aynı sayı ile eşleştiği tve hbir dolgu karakteri olduğu için).

Statik maketransişlev, birinci bağımsız değişkenin karakterlerini ikinci bağımsız değişkenin karakterleriyle ve üçüncü bağımsız değişkenin karakterlerini ( Nonebu karakterlerin silinmesine neden olur) eşleyen bir tablo oluşturur .

Son kod, tabloyu doğrudan bir argüman olarak oluşturarak birkaç bayt kısaltılabilir translate.


Normal ifadeniz için sys.argv [1] ve '[sc] h' yerine input () kullanarak birkaç bayt kaydedebilirsiniz.
swstephe

@swstephe. Geri bildiriminiz için teşekkürler, ancak input()kullanılabileceğini düşünmüyorum , çünkü bir döngü içinde denir. Ayrıca, önerilen normal ifadeniz zaten kullandığım uzunlukla aynıdır (5 bayt).
ekhumoro

"Z, t = input (), str.maketrans ..." gibi bir şey düşünüyordum, sonra sadece sys.argv yerine z kullanıyordum. Tamam, normal ifademin 4 bayt olduğunu düşündüm.
swstephe

2

sed, Yapıştır, grep, kes - 109

sed -e 's/[sc]h/6/g;s/[aehiouwxy]//g;y/sztdnmrljkcqgfvpb/00112345677778899/' w|paste w -|grep " $1$"|cut -f1

Bir dosyayı "w" alır, her sözcüğü numarasına dönüştürür, orijinaline geri yapıştırır, numara için grep'i ve eşleşen kelimeyi döndürür. Grep'ten sonra alıntıdan sonraki boşluk bir sekme, macun varsayılan sınırlayıcısıdır.

Perl'in çok ileride olduğunu biliyorum, sadece örnek olarak daha iyi bir kabuk versiyonu istedim.

Oh evet, $ 1 kısmı, bunun bir kabuk komut dosyasından çalıştırılması gerektiği anlamına gelir (çoğu kabuk çalışması gerekir), bu yüzden bir komut satırı argümanı alır.


sedPerl'in açık olmasını önlemek için cevabımı saf haline getirmeyi düşünüyordum ve@ARGV ek , ancak aralıkların olmaması ve işlevlerin silinmesi y///onu kırıyor. Şaşırtıcı bir şekilde, değişken olmasa da, mantığın kendisini doğrudan ifade edebilirsiniz sed. İşte 92 çözümüm:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
nutki

İşe yarıyor gibi görünüyor, neden cevap vermiyorsunuz?
swstephe

1

Bash + coreutils, 216

sed -n "$(sed 's/[aeiouwxy]//g
:l
s/\([^sc]\)h/\1/g
tl'<w|grep -nf <(eval printf '%s\\n' `sed 's/0/{s,z}/g
s/1/{t,th,d}/g
y/2345/nmrl/
s/6/{j,sh,ch}/g
s/7/{k,c,g,q}/g
s/8/{f,v}/g
s/9/{p,b}/g'<<<$1`)|sed s/:.\*/p/)" w
  • Adlı bir dosyadaki kelime listesi w
  • En içteki sedrakamlar, olası yedekleriyle değiştirilir
  • eval printfKullanımları tüm olası değiştirmelerin dışarı genişletmek için bağ genişlemeleri kabuk
  • sed1. satırdaki ikincisi kelime listesinden çıkarılır ( aeiouwxyve höncesinde gelmediğinde [sc])
  • Grep tüm eşleşmeleri satır numaralarıyla birlikte yazdırır
  • Kelime listesinden çıkardığımızdan aeiouwxyve hsonuncusu sed, grep'in sonuçlarını (her eşleşmenin satır numaraları) başka bir sedifadeye çevirir; bu, kelime listesindeki sedtüm olası kelimeleri ortaya çıkarmak için en dıştaki tarafından işlenir .

Çıktı:

Kelime listesi dosyası bir komut satırı argümanı olarak belirtilir ve ardından anımsatılacak sayı gelir:

ubuntu@ubuntu:~$ ./numzi.sh 99
bob
pop
bop
bopy
boppy
$ ./numzi.sh 0123456789
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
$ 

@ Calvin'sHobbies Yapıldı.
Dijital Travma

Örneğinizi güncellemeyi unuttuğunuz anlaşılıyor.
Calvin'in Hobileri

-1

tr, sed, grep, xargs, sh, 77

tr 0123456789 ztnmrljkfp|sed 's/ */[aehiouwxy]*/g'|xargs sh -c 'grep -x $0 f'

Stdin içindeki sayıyı bekler ve kelime listesi dosyaya kaydedilmelidir f.

Tüm değiştirmeleri kullanmaz (1 her zaman z, 7 her zaman k olacaktır), bu nedenle tembel bir çözüm olarak adlandırılabilir, ancak [1-100] 'de 95 sayı için en az bir anımsatıcı bulur.


3
Soru, eşleşen tüm kelimeleri kelime listesinde bulmanızı ister . Her 1zaman zya da 7her zaman yapamazsın k. Bu geçersiz.
Calvin'in Hobileri

Yeterince adil, cevabımı kaldıracağım.
pgy
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.