문장을 다시 만드십시오


12

이 과제는 두 부분으로 구성됩니다. 총 바이트 수가 가장 적은 솔루션이 승자가됩니다. 두 가지 과제 모두에 동일한 언어를 사용해야합니다.

1 부:

유효한 단어 입력 하여 문장을 입력하고 사용 된 문자 목록, 각 문자 사용 횟수 및 원래 문장의 각 단어에있는 문자 수를 출력 하는 함수 또는 프로그램을 작성 하십시오. 이 프로그램의 출력은 다음 프로그램에 대한 올바른 입력이어야합니다 (정확하게 출력 됨).

아래에 예제와 자세한 규칙을 추가하겠습니다.

2 부:

첫 번째 프로그램의 출력을 입력으로 사용 하고이 영어 단어 목록을 사용하는 기능 또는 프로그램을 작성하고 출력의 정보로 문장을 다시 작성하십시오. 문장이 원본 문장과 같을 필요는 없습니다.

추가 정보. 규칙 및 제한 사항 :

1 부:

  • 첫 번째 입력은 함수 인수 또는 STDIN 또는 괄호 등이 있거나없는 인용 부호가 있거나없는 모든 적합한 형식 일 수 있습니다.
  • 입력 문장은 마침표 나 점을 제외하고 구두점이나 특수 문자를 포함하지 않습니다. 마침표 기호를 제외하고 입력 된 모든 문자는 단어 목록에 있습니다.
  • 문장의 첫 글자는 대문자가되고 나머지는 소문자가됩니다.
  • 파트 2의 출력은 원래 문장과 동일한 대문자로 시작해야합니다 (따라서 입력을 소문자로 변환하지 않는 것이 좋습니다 (그러나 OK)).
  • 출력은 적절한 형식으로 될 수 있습니다.
    • 출력을 다음 프로그램 / 기능에 직접 복사하여 붙여 넣을 수 있어야합니다.
    • 복사-붙여 넣기시에는 변경할 수 없으며 전체 출력물은 부분이 아닌 전체로 복사하여 붙여 넣어야합니다.
    • 예를 들어, 알파벳으로 된 모든 문자의 히스토그램 또는 사용 된 문자의 히스토그램을 출력 할 수 있습니다 (일반적으로 2 부 완료에 필요한 모든 것)
    • 여러 번 반복되는 문자 목록을 출력 할 수 없습니다. 예를 들어, The queue출력을 산출 할 수 없습니다 Teeehquu (3,5): Tehqu, (1 3 1 1 2),(3 5).

2 부:

  • 프로그램 / 함수는 파트 1에서와 정확히 동일하게 입력을 받아 들여야합니다 (한 가지 예외, 파일 이름을 입력으로 사용하는 방법에 대해서는 아래 주석 참조).
    • 입력을 구문 분석하기 위해 대괄호, 인용 부호 또는 이와 유사한 것이 필요한 경우, 이것들은 파트 1의 출력의 일부 여야합니다.
  • 단어 목록은 여기에서 찾을 수 있습니다.
    • 단어 목록은로 로컬에 저장 w.txt하거나 URL에서 가져올 수 있습니다. URL은 5 바이트로만 계산되므로 URL 단축기가 필요하지 않습니다.
    • 프로그램이 STDIN에서 입력으로 이름을 읽지 않고 파일을 열 수없는 경우 (I이 생각 IS는 적어도 Pyth의 경우 WAS), 파일 이름은 별도의 입력 인수로 간주 될 수있다.
  • 출력은 문장 (유효한 단어 목록)이어야하며 마침표와 선택적인 개행 문자로 끝나야합니다.
    • 출력은 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.

다른 단어 조합은로 시작 Z하고 첫 번째 단어는 5 자이고 두 번째 단어는 3입니다.

바이트 단위의 가장 짧은 코드가 이깁니다.



@ LegionMammal978 : 예, 다음 제한 사항에 따라이 작업을 수행 할 수 있습니다. f1붙여 넣은 출력 f2에는 챌린지에 지정된 모든 데이터가 포함되어야합니다. 의 출력에 추가 데이터를 포함 할 수 없습니다 f1. 에서 f1호출 할 때 정보를 사용할 수 있도록 데이터를 "저장"할 수 없습니다 f2. f1호출 당 하나의 문자열 만 입력으로 사용할 수 있습니다.
Stewie Griffin

1
3 개 이상의 단어로 같은 문장을 얻을 수있는 기회는 실제로 매우 나쁘다
Eumel

일반적으로 그렇습니다. 그러나 같은 문장을 얻을 가능성이있는 경우가 많습니다. 할머니가 낡은 스웨터를 다시 입히는 데 지치면 "뜨거운 뜨개질을하는 것"일 것이다. 확인하지는 않았지만 할머니가 2 부 후에도 여전히 종료 될 것이라고 생각합니다. 더 긴 단어를 조합해도 같은 문장이 다시 나올 수 있습니다.
Stewie Griffin

1
@StewieGriffin "Wig ... wows"를 쉽게 얻을 수 있습니다. 그 예제 문장으로 돌아갑니다.
question_asker

답변:


5

LabVIEW, 166 LabVIEW 프리미티브

우선 Labview가 데이터 흐름을 수행하므로 실제로는 필요하지 않기 때문에 2 개의 별도 프로그램을 만들지 않았습니다.

1-26부터 첫 번째 문자 나머지의 첫 번째 요소 = ASCII 코드로 히스토그램을 저장합니다. 길이는 단순히 배열에 저장됩니다.

첫 번째 단어는 3 개의 수표, 첫 글자, 길이 및 히스토그램에 사용 가능한 글자가 있습니다. 첫 번째 문자 검사는 첫 번째 단어 다음에 중지됩니다.

모든 문자에 대해 히스토그램을 줄이고 0 아래로 떨어졌는지 확인하여 히스토그램을 확인합니다.

내 N 번째 단어를 찾았고 왼쪽 글자에서 작성할 수있는 단어가 없으면 dictonary에서 단어를 삭제하고 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

파이썬 2.7, 353 바이트

불행히도 Android 용 QPython이 파일 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 % 순수한 기능으로 만들게되어 정말 기쁩니다. 그것이 실제 골프에 도움이되는지 확실하지 않지만, 난독 화 부분을 확실히 가지고 있습니다. 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

펄, 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유닉스 형식 ( \n행 끝). 사용 cat파일을 읽을 수; type창으로 변경하십시오 .
위의 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
}

ungolfed 스 니펫 ( 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

@Eumel 그래, 그들은 당신과 달랐다 그래서 내가 그들을 포함 :-)
Kenney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.