3

これは、次の学期に予定されている学校での追加単位の割り当てのためのものです。段落を画面に出力する必要がありますが、コードの文字数は段落の文字数よりも少なくする必要があります。段落は次のとおりです。

「私の名前が記載されているすべてのプログラムは、私 (および共著者がいる場合は共著者) によって作成され、そのプログラムを完全に理解していることを誓います。私が提出するすべてのプログラムは、特に明記されていない限り、完全に私自身の作品です。私は理解しています。その学術的不正行為には、他の人の作品をコピーするだけでなく、コピーを助長または助長することも含まれます.過去または現在の他の提出物と同様のコードは、説明が何であれ、クレジットを取得しません.私は、学術的不正の結果は「クラスの F'. 私は自分のプログラムを書くことによって Java を学ぶことに全力を尽くすことを約束します. 私は細部に気を配り、私自身と他のプログラマーが理解できるプログラムを書くように努力します.

プログラムの総文字数は、誓約の総文字数よりも少なくする必要があります (655 印刷可能、合計 793)。

プログラムは入力を一切受け付けません...ファイル、ダウンロードなどはありません。

私が最初に考えたのは、誰もそれを行うことができなかったので、これまでの授業で学んだことの範囲外に違いないということでした. 少なくする必要があるため、課題の最初の部分 (通常のクレジット) で全員が行うように、段落を 1 行ずつ印刷することは明らかにできません。

java.util.zip を使用して文字列圧縮を調査しましたが、入力が許可されていないという問題が発生し続けています。今のところ棚上げしたアイデアは次のとおりです。文字列を圧縮形式でコーディングし、コードを圧縮されていないバージョンの段落よりも文字数を少なくし、コンソールに出力するときに文字列を単純に圧縮解除する方法はありますか?

私はASCII値にも手を出しましたが、ASCII値は文字のみを表し、すべてのASCII値は、それらが表すために使用される文字よりも長い文字長を持っているため、その使用法はわかりませんでした.

私が今のところ決めた考えは、最も長く繰り返される単語を取り出し、それらに文字列変数名を割り当てることです。次に、段落内の単語を変数連結スタイルに置き換えるだけです。これまでの私のコードは次のとおりです。

import static java.lang.System.out;

public class Pledge {
  public static void main(String[] args){
    String s=" understand ",p=" program",z=" academic dishonesty ",c=" copying",i="I pledge ";
    out.println(i+"that every"+p+" with my name on it shall be written by me (and my co-authors, if any) and that i fully"+s+"the"+p+". Every"+p+" I submit shall be entirely my own work unless otherwise attributed. I"+s+"that"+z+"not only includes"+c+" other people's work, but also abetting or facilitating"+c+". Code that is similar to any other submission past");
    out.println("or present will get no credit whatever the explanation. I"+s+"that the consequence of"+z+"is a grade of 'F' for the class."+i+"to devote my efforts to learning Java by writing my own"+p+"s. I shall strive to be attentive to detail and write"+p+"s "+s+"able by myself and other"+p+"mers.");
  }
}

付属のコードは、印刷可能な 762 文字です。私は 112 文字離れており、コードはすでに 2 つの巨大な println ステートメントで見栄えが悪いため、正しい軌道に乗っていないように感じます。私のためにコードが書かれるとは思っていません (私はそれが嫌いです) が、私を正しい方向に導くためのいくつかのヒントやヒントをいただければ幸いです。ありがとう!

4

3 に答える 3

2

調べたいことの 1 つは、ハフマン エンコーディングです。このアプローチは、投稿したプログラムのアプローチとていますが、段落を圧縮する方法に関してははるかに徹底しています。したがって、テキストを (事前に) 圧縮し、圧縮バージョンをソース ファイルに配置し、解凍して印刷することができます。

また、いくつかの文字を削ることができる小さなトリックがあちこちにあります。例えば、

  • main(String[] args)可能性がありますmain(String[]v)(4 文字節約)
  • より短い名前を使用できますPledge。おそらく 1 文字の名前です (5 文字が節約されます)。
  • すべてを1行に入れることができます(多くの文字が節約されます)

それらは些細なことですが、それらは合計されます。

于 2012-11-21T21:13:32.023 に答える
1

プログラムを Unicode で記述し、UTF-16 を使用して文字列をエンコードするのが独創的な解決策かもしれません。これにより、「印刷可能な文字」の半分の数を使用して文字列を格納できます。例えば:

public static void main(String[] args) throws Exception {
    String s = "䤠灬敤来⁴桡琠敶敲礠灲潧牡洠";
    System.out.println(new String(s.getBytes("UTF-16BE"),"UTF-8"));
}

印刷しI pledge that every programます。出力は 28 文字ですが、文字列を格納するために使用される「印刷可能な文字」の数は 14 しかありません。エンコードする 793 の印刷可能な文字では、文字列に 397 文字が必要で、実際のコードで作業するために 258 文字が残ります。 .

于 2012-11-21T21:45:50.940 に答える
0

現在のアプローチの改良はprintf()明示的な引数のインデックス作成機能を使用しています。これにより、元の文字列に出現するたびに1文字節約できます(したがって、短い部分文字列を「圧縮」できます。また、文字列変数の宣言が不要になります。これにより、部分文字列ごとに3文字少なくなります。

ネタバレのイデオネ バージョンはこちら: http://ideone.com/lnrTrG – 非常に巧妙なものを使用することなく、なんとか 784 文字まで減らすことができました。抽出された部分文字列の選択が最適ではなかった可能性もあります。

を使用して同じことを達成しようとしましたMessageFormat.format()が、すべてのプレースホルダーが置き換えられるわけではありません。バージョンがどれだけ限界に近づいているかを考えるとprintf()、短い部分文字列を圧縮する機能 (MessageFormatの明示的なインデックス プレースホルダーは のものよりも 1 文字短いためprintf()) は、 からの余分な 32 文字のオーバーヘッドを相殺することさえできない可能性がありますjava.text.MessageFormat.format()。(とは言っても、試してみる価値はあります。プレースホルダーだけで 29 文字を節約できるので、近いです。)


あなたの質問の別の点に対する直接的な答えもあります:

文字列を圧縮形式でコーディングし、圧縮されていないバージョンの段落よりもコードの文字数を少なくし、コンソールに出力するときに文字列を単純に圧縮解除する方法はありますか?

パズルの欠けてjava.util.zipいるピースはbase-64 エンコーディングです。これにより、圧縮されたバイトを印刷可能な文字で構成される文字列に格納できます。エンコードされた配列の長さよりも多くの文字を使用しますが、(幸いなことに) 元の文字列よりもはるかに少なくなります。(また、バイト配列の値を直接書き出すよりも短くする必要があります。) のユーティリティ メソッドを使用してDatatypeConverter、このエンコーディングを操作できます。(ヒントをくれた @owlstead に感謝します。)

私の同僚が提案した base-64 よりもさらに優れた方法は、Latin-1 などの従来の文字セットを使用して圧縮データを単純にエンコードすることです。ほとんどの Latin-1 文字は印刷可能であるため、1 文字を使用して Java 文字列リテラルに記述できます。エスケープが必要ないくつかは、base-64 よりも膨張が少なくなります。ソース ファイルも Latin-1 でエンコードできる場合は、文字とバイトの違いについて議論する必要がなくなります。

于 2012-11-22T02:19:14.330 に答える