23940を思い出すための記憶


19

主要なシステムがあるニーモニックそれらがより容易に記憶することができるように言葉に番号を変換するための装置。

単語の発音に基づいていますが、チャレンジのために物事を簡単にするために、単語のつづり方のみを考慮します。これは、いくつかの誤った変換があることを意味しますが、それは大丈夫です。

簡略化されたメジャーシステムを使用して数値を単語に変換するには:

  • それぞれ0sまたはに置き換えますz。(一部は可能性がsあり、一部は可能性がありますz。以下も同様です。)
  • それぞれを交換1tたりdまたはth
  • それぞれ2をに置き換えますn
  • それぞれ3をに置き換えますm
  • それぞれ4をに置き換えますr
  • それぞれ5をに置き換えますl
  • それぞれを交換6jたりshまたはch
  • それぞれ7kor cまたはgorで置き換えますq
  • それぞれ8fまたはに置き換えますv
  • それぞれ9pまたはに置き換えますb
  • 可能であれば、文字をaehiouwxy任意の場所に追加して、実際の英語の単語を作成します
    唯一の例外はhsまたはの後に挿入できないことcです。

数値は、実際には数字0〜9の任意の文字列(小数、コンマ、または記号なし)にすることができます。
単語には小文字のa〜zのみを含めることができます。

番号32はとして変換する必要があります?m?n?。ここで?、文字から作成された有限の文字列aehiouwxy(必要に応じて、無料のモノイドからの文字列)を表します。これが本当の英語の単語の中に作ることができる多くの方法があります:manemoonyeoman、など

番号05?s?l?またはとして変換できます?z?l?。いくつかの可能性があるeasilyhasslehazel。単語shawlは許可されhませんs。として誤って読み取られ65ます。

チャレンジ

0から9の数字のストリングを取り込んで、簡略化されたメジャーシステムニーモニックを使用して変換できるすべての単語を見つけるプログラムまたは関数を作成します。

プログラムは、すべての「本当の」英語の単語を定義する単語リストテキストファイルにアクセスできます。このファイルの各行には1つの小文字のazワードがあり、オプションで末尾に改行があると想定できます。以下は、テストに使用できる実際の単語のリストです。この単語リストファイルはf(またはそれより長い)呼び出され、便利なディレクトリにあると想定できます。

35バイトのペナルティ(スコアに35を加算)の場合、単語リストは既に文字列のリストとして変数にロードされていると想定できます。これは主にファイルを読み取れない言語用ですが、提出することでそれを利用できます。

プログラムは、入力数値を変換できる単語リスト内のすべての単語を出力する必要があります。これらは、1行に1つずつ(オプションの末尾の改行を使用して)stdout(または同様の)に出力する必要があります。または、関数の作成を選択した場合は、文字列のリストとして返すことができます。単語リストは必ずしもアルファベット順ではなく、出力もアルファベットである必要はありません。

可能な単語がない場合、出力(またはリスト)は空になります。空の文字列が入力されると、出力も空になります。

stdin、コマンドライン、または関数の文字列引数として入力を受け取ります。単語リストまたはそのファイル名は、入力の一部ではなく、数字列のみである必要があります。

単語リスト内の単一の単語のみが一致し、単語のシーケンスは一致しません。この単語noonはおそらくの結果の1つです22が、単語シーケンスno oneはそうではありません。

テストケース

これが単語リストであるとします:

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

入力0123456789zdnmrlshchvband を除くすべての長い単語を与える必要がありshthnmrlchgvbます:

stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb

入力99は次のようになります。

bob
pop
bop
bopy

(出力語は任意の順序にできます。)

得点

バイト単位の最短提出勝ちです。Tiebreakerは、最初に投稿されたサブミッションに進みます。

ニフティ関連サイト:numzi.com


1
このビデオからこのチャレンジのアイデアを思いついたのですか?昨日それを実際見たからです。:P
ドアノブ

1
@Doorknobそのビデオではなく、その男。数年前、私は彼の素晴らしいコース講義の1つを受けました。彼はちょっとおかしいですが、本当にすてきなものをします。:)
カルバンの趣味

1
実生活でニーモニックメジャーシステムを使用することに興味がある人への注意:スペルではなく、重要なのはサウンドだけです。したがって、ここで「7」の意味でリストされている「c」は、単語で「s」の音で発音される場合、実際には0を意味します(「ace」= 0など)。ただし、完全な音声学を備えた辞書は単純な単語リストよりもはるかに難しいため、OPによって課題が簡素化されたと確信しています。ああ、そして23940の1つのレンダリングは「数字」です。
エリック

私たちは...ポストの第二文にスペルベースのバージョンを使用していること@ErikE I状態
カルバンの趣味

私はそれを今見ていますが、最初はそれを逃しましたが、あなたの説明はもう少し肉付けされ、例が1つまたは2つ提供されているようです。
エリック

回答:


6

Perl、87 84

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

入力をコマンドラインパラメーターとして受け取ります。

$perl m.pl 23940

標準入力で単語リストが許可される場合は、多少短くすることができます。

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

どういうA意味open A,fですか?
feersum

@feersum後でファイルを読み取るために使用されるファイルハンドル(<A>)。
nutki

4

Python 2、215 208バイト

このPythonソリューションは、コマンドライン引数でインデックス付けされた部分から正規表現を構築し、その(かなり大きい)正規表現で各単語をテストします。

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

ミニファイヤの前の元のソース:

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

たとえば、テストの正規表現99は次のとおりです。

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

この(?<![sc])hビットは、「ネガティブアサーションの背後を見る」コンポーネントでありhsか、c一般的なフィラー部品インチ

ありがとう、カルビン。この挑戦は、さびた正規表現スキルを磨く動機になりました。


b=c='((?<![sc])h|[aeiouwxy])*'2バイトを節約します。
matsjoyce

t|th -> th?バイトを保存
-Sp3000

int(i)を直接使用すると、マップを回避できます。
xnor

便利なゴルフのヒントをありがとう、matsjoyce、Sp3000、およびxnor。現在、提案が実装されて編集されています。
ロジックナイト

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='')

読み取り可能なバージョン:

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='')

コードthは、冗長であるという事実を利用します(と同じ番号にマッピングされるtため、hパディング文字であるため)。

静的maketrans関数は、最初の引数の文字を2番目の引数の文字にマッピングし、3番目の引数の文字をマッピングするテーブルを作成しますNone(これらの文字は削除されます)。

の直接の引数としてテーブルを作成することにより、最終コードを数バイト短くすることができますtranslate


正規表現にsys.argv [1]と '[sc] h'の代わりにinput()を使用して、数バイトを保存できます。
swstephe

@swstephe。フィードバックをありがとう。ただしinput()、ループ内で呼び出されるため、使用できるとは思わない。また、推奨される正規表現は、既に使用している正規表現と同じ長さです(5バイト)。
エクモロ

「z、t = input()、str.maketrans ...」のようなものを考えていたので、sys.argvの代わりにzを使用してください。さて、正規表現は4バイトだと思いました。
swstephe

2

sed、paste、grep、cut-109

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

ファイル「w」を取り、各単語をその番号に変換し、元に貼り付け、その番号をgrepし、一致した単語を返します。grepの後の引用符の後の空白はタブであり、ペーストのデフォルトの区切り文字であることに注意してください。

Perlが先を行くことを知っています、例としてより良いシェルバージョンを望んでいました。

そうそう、$ 1の部分は、これがシェルスクリプトから実行されることになっていることを意味します(ほとんどのシェルは動作するはずです)ので、コマンドライン引数を取ります。


sedPerlのオープンと@ARGVオーバーヘッドを回避するために、答えを純粋に変換することを考えていましたが、範囲の欠如と関数の削除がy///壊れています。驚くべきことに、変数はありませんが、ロジック自体をで直接表現できますsed。私の92のソリューションは次のsed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
とおりです。– nutki

それはうまくいくようです、なぜそれを答えにしませんか?
-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
  • というファイル内の単語リスト w
  • 最も内側のsed数字は、数字を可能な置換に置き換えます
  • eval printf用途は、すべての可能な置換を展開してブレース展開をシェル
  • sed1行目の2番目はaeiouwxyh[sc]は、単語リストから)。
  • grepはすべての一致を行番号とともに出力します
  • 以来、私たちは取り除かれているaeiouwxyh、最後、単語リストからのsedターンは別のものにはgrepの結果(各マッチの行番号)sed最も外側で処理される表現、sed単語リストからすべての可能な単語を明らかにします。

出力:

単語リストファイルは、コマンドライン引数として指定され、その後にニーモニック化する番号が続きます。

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

@ Calvin'sHobbies完了
デジタル外傷

例の更新を忘れたようです。
カルビンの趣味

-1

tr、sed、grep、xargs、sh、77

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

stdinの数値を期待し、単語リストをファイルに保存する必要があります f

すべての置換を使用するわけではありません(1は常にz、7は常にk)。したがって、遅延ソリューションと呼ばれる場合がありますが、[1-100]で95個の数字のニーモニックを少なくとも1つ見つけます。


3
質問は、単語リストで一致するすべての単語を見つけるように求めます。あなたは1いつもそうzでも7いつもでもできませんk。これは無効です。
カルビンの趣味

結構です、答えを削除します。
pgy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.