重新造句


12

这一挑战包括两个部分。获胜者将是总字节数最少的解决方案。两种挑战都必须使用相同的语言。

第1部分:

编写一个函数或程序,该函数或程序将仅包含有效词的句子作为输入,并输出所用字符的列表,每个字母的使用次数以及原始句子中每个词的字母数。该程序的输出必须是对下一个程序的有效输入(与输出一样)

我将在后面添加示例和详细规则。

第2部分:

编写一个函数或程序,将第一个程序的输出作为输入,并使用此英语单词列表,并使用来自输出的信息重新创建一个句子。该句子不必与原始句子相同。

更多信息。规则和限制:

第1部分:

  • 第一个输入可以是任何合适的格式,带或不带引号,作为函数参数或来自STDIN,带或不带括号等。
  • 输入的句子将不包含任何标点符号或特殊字符,但最后一个句点/点除外。除句点符号外,输入中的所有字符都将在单词列表中。
  • 句子的第一个字母为大写,其余字母为小写。
  • 第2部分的输出必须以与原始句子相同的大写字母开头(因此不建议将输入转换为小写(但可以)。
  • 输出可以是任何合适的格式:
    • 必须可以将输出直接复制粘贴到下一个程序/函数中
    • 粘贴粘贴时不能进行任何更改,必须将整个输出整体复制并粘贴,而不是部分粘贴。
    • 例如,您可以输出字母表中所有字母的直方图,或仅输出所使用字母的直方图(通常,完成第二部分所需的一切)
    • 您无法输出重复出现多次的字符列表。例如,The queue不能产生output:,Teeehquu (3,5)它应该类似于:Tehqu, (1 3 1 1 2),(3 5)

第2部分:

  • 程序/函数必须完全像第1部分一样接受输入(一个例外,请参阅以下有关将文件名作为输入的注释。)
    • 如果必须使用方括号,引号或类似内容来解析输入,则这些必须是第1部分输出的一部分。
  • 单词列表可以在这里找到。
    • 单词列表可以在本地另存为w.txt,也可以从url中获取。该网址仅计为5个字节,因此您不需要网址缩短器。
    • 如果程序无法打开文件,而不必读取名称从标准输入的输入(我相信这就是是为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个字母,第二个单词有3个字母。

以字节为单位的最短代码获胜。



@ LegionMammal978:是的,您可以在以下限制下执行此操作:f1粘贴到其中的输出f2必须包含挑战中指定的所有数据。不能将其他数据作为输出的一部分f1。从中f1调用信息时,无法“存储”任何数据f2f1每个呼叫只能接受一个字符串作为输入。
Stewie Griffin 2015年

1
我认为用3个以上的单词来表达相同句子的机会实际上是非常糟糕的
Eumel 2015年

通常是的,但是在很多情况下,您很可能会说出相同的句子。如果您的祖母厌倦了重做旧毛衣的事情,那么她可能会:“放弃重新针织”。我还没有检查过,但我认为您的祖母在第2部分之后仍然会退出。而且,较长单词的组合可能会使相同的句子返回。
Stewie Griffin

1
@StewieGriffin您可以轻松获得“假发...哇”。回到那个例句。
question_asker

Answers:


5

LabVIEW,166个LabVIEW原语

首先,我没有创建2个单独的程序,因为Labview进行数据流,因此实际上没有必要。

将第一个元素=第一个字母的余数的ascii码从1-26开始保存直方图。长度仅保存在数组中。

第一个单词有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个字节

不幸的是,我无法使用实际的w.txt文件ATM对其进行测试,因为适用于Android的QPython似乎无法处理文件I / O。但是,它可以处理我复制并粘贴的数据。

第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%纯净。不知道这是否对实际打高尔夫球有帮助,但是我确实对混淆部分感到满意​​: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,516504字节

包括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}

要求w.txt采用Unix格式(\n行尾)。用于cat读取文件;更改type为Windows。
将上述oneliner保存在中534.pl并以方式运行echo Test. | perl -p 534.pl

很大,但是这是一个开始-很多打高尔夫球的机会,但是我只是想发布它,以使LabVIEW的回答不再那么孤单;-)。我省略了亚秒级执行的优化,节省了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
}

第二段(441字节)

与I / O这主要部分涉及的第一个字母的特殊处理,使用子程序gh下面列出。

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)粘贴到单个文件中,并附加以下测试代码。

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,2015年

@Eumel是的,它们与您的有所不同,所以我将它们包括在内:-)
Kenney
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.