文を作り直す


12

この課題は2つの部分で構成されています。勝者は、総バイト数が最も少ないソリューションになります。両方の課題に同じ言語を使用する必要があります。

パート1:

入力として有効な単語のみを含む文を受け取り、使用する文字のリスト、各文字の使用回数、元の文の各単語の文字数を出力する関数またはプログラムを作成します。このプログラムからの出力は、次のプログラムへの有効な入力でなければなりません(出力されたとおり)

例と詳細なルールをさらに下に追加します。

パート2:

最初のプログラムからの出力を入力として使用し、この英単語のリストを使用して、出力からの情報を使用して文を再作成する関数またはプログラムを作成します。文は元の文と同じである必要はありません。

詳しくは。ルールと制限:

パート1:

  • 最初の入力は、引用符の有無にかかわらず、関数の引数として、または角括弧の有無にかかわらず、STDINからの任意の適切な形式にすることができます。
  • 入力文には、最後のピリオド/ドットを除き、句読点や特殊文字は含まれません。ピリオド記号を除き、入力に含まれるすべての文字は単語リストに含まれます。
  • 文の最初の文字は大文字になり、残りは小文字になります。
  • パート2の出力は、元の文と同じ大文字で開始する必要があります(したがって、入力を小文字に変換することはお勧めしません(ただし、OK)。
  • 出力は任意の適切な形式にすることができます。
    • 出力を次のプログラム/機能に直接コピーアンドペーストできる必要があります
    • コピーアンドペーストの際に変更を加えることはできません。出力全体を部分的にではなく、全体としてコピーして貼り付ける必要があります。
    • たとえば、アルファベットのすべての文字、または使用されているもののみのヒストグラムを出力できます(一般的に、パート2を完了するために必要なものは何でも)
    • 複数のオカレンスが繰り返される文字のリストを出力することはできません。例えば、The queue出力が得られないことができますTeeehquu (3,5)、それは次のようになりますTehqu, (1 3 1 1 2),(3 5)

パート2:

  • プログラム/関数は、パート1からの入力をそのまま受け入れる必要があります(1つの例外、入力としてファイル名を使用することに関する以下のコメントを参照してください)。
    • 入力を解析するために括弧、引用符などが必要な場合、これらはパート1の出力の一部である必要があります。
  • 単語リストはここにあります。
    • 単語リストは、ローカルに保存するかw.txt、URLから取得できます。urlは5バイトとしてカウントされるため、url-shortenerは必要ありません。
    • プログラムはSTDIN(私はこれが信じているから、入力として名を読まずに、ファイルを開くことができない場合である少なくともPythのためのケースだった)、その後、ファイル名は別々の入力引数として撮影することができます。
  • 出力は、ピリオドとオプションの改行で終わる文(有効な単語のリスト)のみである必要があります。
    • 出力には、パート1の元の文と同じ文字数の単語が含まれている必要があります(正しい順序で)
    • 元の文で使用されたすべての文字は、新しい出力で使用する必要があります。
    • 文は、元の入力文と同じ大文字で始まり、ピリオドで終わる必要があります。

両方の部分:

  • どちらの部分も実行に2分以上かかることはありません(ソリューションに到達するまでランダムに単語を選択することは受け入れられません)。

上記の規則を使用すると、まったく同じ文が再現される可能性がかなり高くなりますが、これは必須ではありません。

例:

以下の例では、いくつかの異なる入力および出力形式が示されています。さらに多くが受け入れられます。

パート1:

入力:

Zulus win.

出力タイプ1:

Z i l n s u w
1 1 1 1 1 2 1
5 3

出力タイプ2:

(('Z',1),('i',1),('l',1),('n',1),('s',1),('u',2),('w',1)), (5,2)

出力タイプ3:

'Zilnsuuw',[1,1,1,1,1,2,1],[5,2]

パート2:

入力:パート1からの出力の正確なコピー。出力:

Zulus win.

他の単語の組み合わせは、a Zで始まり、最初の単語が5文字で、2番目の単語が3文字である限り受け入れられます。

バイト単位の最短コードが勝ちです。


コミットは次のとおり
isaacg1

@ LegionMammal978:はい、次の制限の下でこれを行うことができます。そこからの出力には、チャレンジで指定されたすべてのデータが含まf1れているf2必要があります。からの出力に追加データを含めることはできませんf1f1から呼び出すときに情報を利用可能にする際に、データを「保存」することはできませんf2f1呼び出しごとに1つの文字列のみを入力として使用できます。
スティーヴィーグリフィン

1
以上の3つの言葉で外に同じ文を得るチャンスは私が考えて、実際にはかなり悪いです
Eumel

一般的にはそうですが、同じ文を出す可能性が高い場合が多くあります。おばあちゃんが古いセーターをやり直すのにうんざりしている場合、彼女は「編み物をやめるのをやめる」かもしれません。私はチェックしていませんが、おばあちゃんはパート2の後も辞めると思います。また、長い単語の組み合わせは同じ文を返すかもしれません。
スティーヴィーグリフィン

1
@StewieGriffin「Wig ... wows」を簡単に取得できます。その例文に戻ります。
question_asker

回答:


5

LabVIEW、166 LabVIEWプリミティブ

まず第一に、Labviewはデータフローを行うため、実際には必要がないため、2つの別個のプログラムを作成しませんでした。

1〜26の最初の文字の残りの最初の要素= ASCIIコードでヒストグラムを保存します。Lenghtは単純に配列に保存されます。

最初の単語には、3つのチェック、最初の文字、長さ、およびヒストグラムの使用可能な文字があります。最初の文字のチェックは、最初の単語の後に停止します。

ヒストグラムを確認するために、すべての文字についてヒストグラムをデクリメントし、0を下回るかどうかを確認します。

N番目の単語を見つけて、左上の文字から構築できる単語がない場合、辞書から単語の削除を開始し、N番目の単語を繰り返して、解決策が見つかるまで続けます。

これは、計算に永遠にかかるので、そこにある文に対しては機能するかもしれませんし、機能しないかもしれません(私の例はすでに数秒かかりました)。

私が試したもの

In: Zulus win.
Out: Zulus win.

In: Dovecot flagships oleander.
Out: Dolphin advocates forelegs.

In: Abash abel mammal test.
Out: Amass abbe hamlet malt.


3

Python 2.7、353バイト

残念ながら、QPython for AndroidはファイルI / Oを処理できないため、実際のw.txtファイルATMでテストすることはできません。コピーして貼り付けたデータでも機能しました。

パート1、76バイト

h=lambda s:({c:s.count(c)for c in s if c.isalnum()},map(len,s[:-1].split()))

に: 'Hi there.'

でる: {'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)

そのため、以下を含むリスト:

  • ヒストグラムを持つハッシュマップ

  • 文字数のリスト

パート2、277バイト

import itertools as i
m=lambda c:' '.join([s for s in i.product(*[[w for w in open('w.txt')if len(w)==length]for length in c[1]])if sorted(''.join(s))==sorted(sum([[k.lower()]*n for k,n in c[0].items()],[]))and s[0][0]==filter(str.isupper,c[0])[0].lower()][0]).capitalize()+'.'

100%純粋に機能させることができて本当にうれしいです。それが実際のゴルフに役立つかどうかはわかりませんが、私は確かに難読化の部分を正しくしました:Dここにptのより人間に優しいバージョンがあります。2(まったく同じフローですが、変数名を使用):

from itertools import product

def matching(counts):
  histo, word_lengths = counts
  first_letter = filter(str.isupper, histo)[0].lower()

  letters_nested = [ [char.lower()]*count for char, count in histo.items() ]
  letters = sum(letters_nested, [])

  word_options = [[word for word in open('w.txt') if len(word)==length] for length in word_lengths]

  sentences = product(*word_options)

  valid = [sentence for sentence in sentences if sorted(''.join(sentence))==sorted(letters) and sentence[0][0]==first_letter]
  return ' '.join(valid[0]).capitalize()+'.'

3

Perl、516 504バイト

2x +1を含む -p

@l=map{length}/\w+/g;s/\w/$c{$&}++/eg;@h=map{"$_$c{$_}"}keys%c;$_="@h @l";chomp(@w=`cat w.txt`);s/([A-Z])1//;$o=$1;s/(\w)(\d)/$h{$1}=$2,''/eg;@L=/\d/g;$l=shift@L;@O=$_,s/^.//,g([@L],%h)&&last for grep{$l==length&&/^$o/i&&h(\%h,substr$_,1)}@w;$_="@O.";s/^./uc$&/e;sub g{my%g;($R,%g)=@_;my@R=@$R;if($j=shift@R){s/./$g{$&}--/eg;my@C=grep{$j==length&&h(\%g,$_)}@w;push(@O,$_),g([@R],%g)and return 1 or pop@O for@C;0}else{1}}sub h{($y,$z)=@_;my%T;$z=~s/\w/$T{$&}++/eg;$K=1;$K&=$T{$_}<=$y->{$_}for keys%T;$K}

UNIX形式(行末)w.txtである必要があります。ファイルの読み取りに使用します。for Windowsに変更します。 上記のonelinerを保存し、として実行します。\ncattype
534.plecho Test. | perl -p 534.pl

かなり大規模ですが、それは始まりです-ゴルフの機会がたくさんありますが、LabVIEWが孤独にならないようにそれを投稿したかっただけです;-)。1秒未満の実行の最適化を省略し、30バイト以上を節約しました。


最初のスニペット(73バイト):

@l=map{length}/\w+/g;s/\w/$c{$&}++/eg;@h=map{"$_$c{$_}"}keys%c;$_="@h @l"

ヒストグラムと単語長をコンパクトな形式で生成します。入力のZulus win.場合、(,)ここでは必要のない、タイプ2の出力を生成します。

s1 l1 u2 Z1 w1 i1 n1 5 3

ここにあります。

sub i{
    $_=shift;                       # get parameter
    @l = map{length} /\w+/g;        # cound word lengths
    s/\w/$c{$&}++/eg;               # count letters in hash %c
    @h=map{"$_$c{$_}"}keys%c;       # construct letter-frequency pairs
    "@h @l"                         # implicit interpolation with $" (space) separator
}

2番目のスニペット(441バイト)

この主要部分では、I / Oおよび最初の文字の特別な処理について、サブルーチンgを使用して扱いhます。これらは以下にリストされています。

sub o {
    $_=shift;
    chomp(@w=`cat w.txt`);          # load the wordlist.

    s/([A-Z])1//; $o=$1;            # get and remove the uppercase character,
    s/(\w)(\d)/$h{$1}=$2,''/eg;     # reconstruct histogram in hash %h.
    @L=/\d/g;                       # get the word counts.

    $l = shift @L;                  # get the first word length.

    @O = $_,                        # initialize output with first word,
    s/^.//,                         # strip first char of word
    g([@L],%h) && last              # call the main algoritm and quit on success

    for grep {                      
            $l==length &&           # check length
            /^$o/i &&               # only match words starting with the uppercase char
            h(\%h,substr$_,1)       # check if the word satisfies the histogram
        } @w;                       # iterates all words (speedups removed).

    $_="@O.";                       # construct output sentence.
    s/^./uc$&/e;                    # make first char uppercase.
    $_
}

この再帰関数は、ヒストグラムのコピー、残りの単語数のコピー、および現在の単語を取ります。語長配列が空の場合、trueを返します。それ以外の場合は、指定された単語の文字のヒストグラムカウントをデクリメントし、次の単語長を取得して、単語リストから適切な単語のリストを見つけます。適切な単語ごとに、再帰します。

sub g {
    my%g;                           # local version of histogram
    ($R,%g)=@_;                     # get parameters.
    my@R=@$R;                       # dereference arrayref copy of word lengths.

    if($j=shift @R)                 # get the next word-length.
    {
        s/./$g{$&}--/eg;            # update histogram

        my @C =                     # get a list of suitable words.
        grep { $j==length && h(\%g,$_) }
        @w;

        push(@O,$_),                # append word to output
        g( [@R], %g )               # recurse.
            and return 1            # true: append word we're done.
            or pop @O               # remove word from output
        for @C                      # (for some reason the @C=grep doesn't work here)

        ;0
    } else { 1 }                    # no more words, done!
}

そして最後に、このサブルーチンには単語と文のヒストグラムが与えられます。単語の新しいヒストグラムを計算し、文のヒストグラムで許可されているよりも頻繁にすべての文字が出現しないかどうかをチェックします。

# check if first histogram is within bounds of second
sub h{
    ($y,$z)=@_;
    my%T; $z =~ s/\w/$T{$&}++/eg;    # calc histogram

    $K=1;
    $K &= $T{$_} <= $y->{$_}
    for keys %T;#$_[0];
    $K
}

作成されていないスニペット(sub i/o/g/h)を1つのファイルに貼り付けて、以下のテストコードを追加できます。

sub t {
    print $i=i(shift),$/,o($i),$/x2;
    %c=%h=@L=@X=@O=();
}

t "Test.";                              # Test.
t "Zulus win.";                         # Zulus win.
t "Happy solstice.";                    # Happy solstice.
t "Abash abel mammal test.";            # Abase alms embalm that.
t "Dovecot flagships oleander.";        # Dangled horoscope festival.
t 'This code requires further golfing.';# Tech deer fighting ferrous liquors.

  • 更新504:を削除して12バイトを節約substrしてくださいsub g

私の例を盗んでいます!ラサルトをからかうだけで陽気なXD
Eumel

@Eumelええ、彼らはあなたのものとは違うので、私はそれらを含めました:
ケニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.