7

ルール

  1. プログラムには、 encodingdecryptionの 2 つのモードが必要です。
  2. エンコード時:

    1. あなたのプログラムは、人間が読めるLatin1テキスト、おそらく英語を入力として取らなければなりません。
      • 句読点を無視しても問題ありません。
      • L337ではなく、実際の英単語だけを気にする必要があります。
      • アクセント付きの文字は、単純な ASCII に変換できます。
      • 数値の処理方法を選択できます。
      • 123
        • 一二三
        • 百二十三
        • 123
        • 1 2 3
      • 百二十三
        • 一二三
        • 百二十三
        • 123
        • 1 2 3
    2. プログラムは、次の式で表現できるメッセージを出力する必要があります。

      • U+0000–<code>U+10FFFFの範囲の 140 コード ポイント

        非文字を除く:

        • U+FFFE
        • U+FFFF
        • U+nFFFE、ここで-<code>10 16 進数U+nFFFFn1
        • U+FDD0–<コード>U+FDEF
        • U+D800–<code>U+DFFF (サロゲート コード ポイント)。

    任意の適切なエンコーディングで出力できます。GNUiconvでサポートされているエンコーディングは妥当であると見なされ、プラットフォーム ネイティブのエンコーディングまたはロケール エンコーディングが適切な選択となる可能性があります。

  3. デコード時:

    1. プログラムは、エンコーディングモードの出力を入力として受け取る必要があります。
    2. テキスト出力は、入力テキストの近似値である必要があります。
      • 元のテキストに近づくほど、より良い結果が得られます。
      • 句読点は必要ありません。
    3. 出力テキストは、おそらく英語で、人間が読めるものでなければなりません。

      • L337、または笑することができます。
    4. 復号化プロセスは、上記で指定された出力以外の符号化プロセスの他の出力にアクセスできない場合があります。つまり、テキストをどこかにアップロードして、デコード プロセス用の URL を出力してダウンロードすることはできません。
  4. ユーザー インターフェイスの一貫性を保つために、プログラムは次のように動作する必要があります。
    1. プログラムは、適切なインタープリターを使用してプラットフォーム上で実行可能に設定できるスクリプト、または実行可能ファイルにコンパイルできるプログラムである必要があります。
    2. プログラムは、モードを設定するために、encodeまたはのいずれかを最初の引数として取らなければなりません。decode
    3. プログラムは、少なくとも次のいずれかの方法で入力を受け取る必要があります。
      • 標準入力から入力を受け取り、標準出力に出力を生成します。
        • my-program encode <input.txt >output.utf
        • my-program decode <output.utf >output.txt
      • 2 番目の引数で指定されたファイルから入力を受け取り、3 番目で指定されたファイルに出力を生成します。
        • my-program encode input.txt output.utf
        • my-program decode output.utf output.txt
  5. あなたの解決策については、投稿してください:
    1. コード全体、および/または他の場所でホストされているコードへのリンク (非常に長い場合、またはコンパイルに多くのファイルが必要な場合など)。
    2. コードからすぐに明らかでない場合、またはコードが長く、人々が要約に興味を持っている場合、それがどのように機能するかの説明。
    3. 元のテキスト、圧縮後のテキスト、およびデコードされたテキストを含むテキストの例。
    4. 他の誰かが持っていたアイデアに基づいて構築している場合は、それらを帰属させてください. 他人のアイデアを改良しようとするのは問題ありませんが、その人に帰属する必要があります。

このルールは、Twitter 画像エンコード チャレンジのルールのバリエーションです。

4

4 に答える 4

3

これを実際のコードでフォローアップする時間/エネルギーがあるかどうかはわかりませんが、私の考えは次のとおりです。

  • 特定の長さ未満の任意の LATIN 1 文字列は、140 文字に損失することなく単純にエンコードできます (圧縮さえしません)。素朴な見積もりは 280 文字ですが、コンテスト ルールのコード ポイントの制限により、おそらくそれより少し短くなります。
  • 上記の長さよりもわずかに長い文字列 (280 から 500 文字の間で推測できます) は、標準の圧縮技術を使用して、上記のエンコードを可能にするのに十分な短い文字列に圧縮することができます。

それより長くなると、テキストの情報が失われ始めます。したがって、上記の方法を使用して圧縮/エンコードできる長さに文字列を減らすために、次の手順を最小限実行します。また、部分文字列でこれらの置換を実行するだけで十分に短くなる場合は、文字列全体でこれらの置換を実行しないでください(おそらく文字列を逆方向に見ていきます)。

  1. 127 を超えるすべての LATIN 1 文字 (主にアクセント付きの文字とファンキーな記号) を、アクセントのないアルファベット文字の最も近い同等の文字に置き換えるか、「#」などの一般的な記号置換に置き換えることができます。
  2. すべての大文字を対応する小文字に置き換えます
  3. すべての非英数字 (残りの記号または句読点) をスペースに置き換えます
  4. すべての数字を 0 に置き換えます

よし、これで余分な文字を合理的に取り除くことができる限り除去した。次に、さらに劇的な削減を行います。

  1. すべての 2 文字 (風船) を 1 文字 (風船) に置き換えます。奇妙に見えますが、読者が解読できることを願っています。
  2. 他の一般的な文字の組み合わせを短い同等のものに置き換えます (CK を K、WR を R など)。

わかりました、それは私たちが行くことができ、テキストが読める限りです. これを超えて、最終的に判読できなくても、テキストが元のテキストに似るような方法を思いつくことができるかどうか見てみましょう(繰り返しますが、文字列の末尾から一度に 1 文字ずつ実行し、終了したら停止します)。それは十分に短いです):

  1. すべての母音 (aeiouy) を
  2. すべての「背の高い」文字 (bdfhklt) を l に置き換えます
  3. すべての「短い」文字 (cmnrsvwxz) を n に置き換えます
  4. すべての「ハンギング」文字 (gjpq) を p に置き換えます

これにより、正確に 5 つの可能な値 (a、l、n、p、およびスペース) で構成される文字列が残り、かなり長い文字列をエンコードできるようになります。

それを超えると、単純に切り詰める必要があります。

私が考えることができる唯一の他の手法は、一般的な単語または文字のグループに対して、辞書ベースのエンコーディングを行うことです。これは、適切な文にはいくらかの利点をもたらすかもしれませんが、おそらく任意の文字列には当てはまりません。

于 2009-06-22T14:53:23.867 に答える
1

これが実際の英語の変形です。

各コード ポイントには、1100000 のような可能な状態があります。まあ、それはたくさんのスペースです。

そのため、すべての元のテキストをステム処理し、そこから Wordnet synset を取得します。数字は英語の名前 ("fourty two") にキャストされます。1,1M の状態により、synset id (0 ~ 82114 の範囲)、synset 内の位置 (~10 のバリアント、おそらく)、および synset タイプ (名詞、動詞、形容詞、副詞の 4 つのうちの 1 つ) を保持できます。 . 元の形の単語 (動詞の時制 ID など) を保存するのに十分なスペースがある場合もあります。

Decoder は、synset を Wordnet にフィードし、対応する単語を取得するだけです。

ソーステキスト:

A white dwarf is a small star composed mostly of electron-degenerate matter. Because a
white dwarf's mass is comparable to that of the Sun and its volume is comparable to that 
of the Earth, it is very dense.

なる:

A white dwarf be small star composed mostly electron degenerate matter because white
dwarf mass be comparable sun IT volume be comparable earth IT be very dense

(オンライン Wordnetでテスト済み)。この「コード」は 27 コード ポイントを取る必要があります。もちろん、「lol」や「L33T」などの「ちんぷんかんぷん」はすべて永久に失われます。

于 2009-06-25T16:51:32.017 に答える
0

入力ファイルから単語以外の文字を削除する簡単な例を次に示します。

#! perl
use strict;
use warnings;
use 5.010;


use Getopt::Long;
use Pod::Usage;
use autodie;

my %opts = (
  infile  => '-',
  outfile => '-',
);
GetOptions (
  'encode|e'    => \$opts{encode},
  'decode|d'    => \$opts{decode},
  'infile|i=s'  => \$opts{infile},
  'outfile|o=s' => \$opts{outfile},
  'help|h'      => \&help,
  'man|m'       => \&man,
);

unless(
  # exactly one of these should be set
  $opts{encode} xor $opts{decode}
){
  help();
}


{
  my $infile;
  if( $opts{infile} ~~ ['-', '&0'] ){
    $infile = *STDIN{IO};
  }else{
    open $infile, '<', $opts{infile};
  }

  my $outfile;
  if( $opts{outfile} ~~ ['-', '&1'] ){
    $outfile = *STDOUT{IO};
  }elsif( $opts{outfile} ~~ '&2' ){
    $outfile = *STDERR{IO};
  }else{
    open $outfile, '>', $opts{outfile};
  }

  if( $opts{decode} ){
    while( my $line = <$infile> ){
      chomp $line;

      say {$outfile} $line;
    }
  }elsif( $opts{encode} ){
    while( my $line = <$infile> ){
      chomp $line;

      $line =~ s/[\W_]+/ /g;

      say {$outfile} $line;
    }
  }else{
    die 'How did I get here?';
  }
}

sub help{
  pod2usage();
}
sub man{
  pod2usage(1);
}
__END__

=head1 NAME

sample.pl - Using GetOpt::Long and Pod::Usage

=head1 SYNOPSIS

sample.pl [options] [file ...]

 Options:
   --help     -h      brief help message
   --man      -m      full documentation
   --encode   -e      encode text
   --decode   -d      decode text
   --infile   -i      input  filename
   --outfile  -o      output filename

=head1 OPTIONS

=over 8

=item B<--help>

Print a brief help message and exits.

=item B<--man>

Prints the manual page and exits.

=item B<--encode>

Removes any character other than /\w/.

=item B<--decode>

Just reads from one file, and writes to the other.

=item B<--infile>

Input filename. If this is '-' or '&0', then read from STDIN instead.
If you use '&0', you must pass it in with quotes.

=item B<--outfile>

Output filename. If this is '-' or '&1', then write to STDOUT instead.
If this is '&2', then write to STDERR instead.
If you use '&1' or '&2', you must pass it in with quotes.

=back

=head1 DESCRIPTION

B<This program> will read the given input file(s) and do something
useful with the contents thereof.

=cut
echo こんにちは、これは何かのテキストです | perl sample.pl -e
こんにちは、これはテキストです
于 2009-06-22T17:06:45.700 に答える