Cümleyi yeniden oluşturun


12

Bu zorluk iki bölümden oluşmaktadır. Kazanan, en düşük toplam bayt sayısına sahip çözüm olacaktır. Her iki zorluk için de aynı dil kullanılmalıdır.

Bölüm 1:

Girdi olarak yalnızca geçerli sözcükleri içeren bir cümle alan ve kullanılan karakterlerin bir listesini, her harfin kaç kez kullanıldığını ve orijinal cümledeki kelimelerin her birindeki harf sayısını çıkaran bir işlev veya program yazın . Bu programdan alınan çıktı bir sonraki programa geçerli olarak girilmelidir (tam olarak çıktılandığı gibi)

Daha ayrıntılı örnekler ve ayrıntılı kurallar ekleyeceğim.

Bölüm 2:

İlk programdan çıktıyı girdi olarak alan ve bu İngilizce kelime listesini kullanan ve çıktıdaki bilgilerle bir cümleyi yeniden yaratan bir işlev veya program yazın . Cümlenin orijinal cümle ile aynı olması gerekmez.

Daha fazla bilgi. kurallar ve kısıtlamalar:

Bölüm 1:

  • İlk giriş, tırnak işareti ile veya tırnak işareti olmadan, işlev argümanı olarak veya STDIN'den, köşeli ayraçlarla veya köşeli ayraçlar olmadan herhangi bir uygun formatta olabilir.
  • Giriş cümlesi, noktadaki nokta / nokta haricinde herhangi bir noktalama işareti veya özel karakter içermez. Nokta sembolü hariç, girişteki tüm karakterler kelime listesinde olacaktır.
  • Cümlenin ilk harfi büyük, diğerleri küçük olacak.
  • 2. bölümün çıktısı, orijinal cümle ile aynı büyük harfle başlamalıdır (bu nedenle, girdinin küçük harfe dönüştürülmesi önerilmez (ancak Tamam)).
  • Çıktı herhangi bir uygun biçimde olabilir:
    • Çıktıyı doğrudan bir sonraki programa / işleve kopyalayıp yapıştırmak mümkün olmalıdır
    • Kopya yapıştırırken hiçbir değişiklik yapılamaz, tüm çıktı parçalara değil bir bütün olarak kopyalanmalı ve yapıştırılmalıdır.
    • Örneğin, alfabedeki tüm harflerin veya yalnızca kullanılan harflerin bir histogramını çıktılayabilirsiniz (genel olarak, 2. bölümü tamamlamak için ne gerekiyorsa)
    • Birden çok tekrarlamanın tekrarlandığı bir karakter listesi çıktısı alamazsınız. Örneğin, The queuebir sonuç çıktısı verecektir edemez: Teeehquu (3,5)bu gibi bir şey olmalıdır: Tehqu, (1 3 1 1 2),(3 5).

Bölüm 2:

  • Program / fonksiyon girişi aynen bölüm 1'deki gibi kabul etmelidir (bir istisna, dosya adının girdi olarak alınmasıyla ilgili aşağıdaki açıklamaya bakınız).
    • Girdiyi ayrıştırmak için çevreleyen parantezler, tırnak işaretleri veya benzerleri gerekiyorsa, bunlar bölüm 1'deki çıkışın bir parçası olmalıdır.
  • Kelime listesi burada bulunabilir.
    • Kelime listesi yerel olarak olarak kaydedilebilir w.txtveya url'den getirilebilir. URL yalnızca 5 bayt olarak sayılır, bu nedenle bir URL kısaltıcıya ihtiyacınız yoktur.
    • Program STDIN'den girdi olarak adını okumadan bir dosyayı açamıyorsanız (Ben şuna inanıyorum is en az Pyth için böyleydi), sonra dosya ismi ayrı giriş argüman olarak alınabilir.
  • Çıktı, yalnızca nokta ve isteğe bağlı yeni satırla biten bir cümle (geçerli sözcüklerin listesi) olmalıdır.
    • Çıktı, bölüm 1'deki orijinal cümle ile aynı sayıda harf içeren kelimelere sahip olmalıdır (doğru sırada)
    • Orijinal cümle içinde kullanılan tüm harfler yeni çıktıda kullanılmalıdır.
    • Cümle, orijinal giriş cümlesiyle aynı büyük harfle başlamalı ve nokta ile bitmelidir.

Her iki parça:

  • Parçaların hiçbirinin yürütülmesi 2 dakikadan fazla sürmemelidir (bir çözüme ulaşılana kadar kelimeleri rastgele seçmek kabul edilmez).

Yukarıda listelenen kurallarla, aynı cümlenin yeniden üretilmesi için makul bir şans olmalıdır, ancak bu bir gereklilik değildir.

Örnekler:

Aşağıdaki örneklerde, birkaç farklı giriş ve çıkış biçimi gösterilmektedir. Daha fazlası kabul edilir.

Bölüm 1:

Giriş:

Zulus win.

Çıkış tipi 1:

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

Çıkış tipi 2:

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

Çıkış tipi 3:

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

Bölüm 2:

Giriş: 1. bölümdeki çıktının tam bir kopyası.

Zulus win.

Diğer kelime kombinasyonlarının a ile başladıkları sürece kabul edildiğini Zve ilk kelimenin 5 harf ve ikincisinin 3 olduğunu unutmayın.

Bayttaki en kısa kod kazanır.



@ LegionMammal978: Evet, bunu aşağıdaki kısıtlamalar altında yapabilirsiniz: f1Yapıştırılan çıktı, sorunda f2belirtilen tüm verileri içermelidir. Hiçbir ek veri, çıktıdan alınamaz f1. Hiçbir veri, f1bilgi çağrılırken kullanılabilir hale getirilirken "saklanamaz" f2. f1çağrı başına yalnızca bir dize alabilir.
Stewie Griffin

1
3'ten fazla kelime ile aynı cümleyi elde etme şansı aslında oldukça kötü
Eumel

Genel olarak evet, ancak aynı cümleyi alabileceğiniz birçok durum var. Büyükanneniz eski süveterinizi yeniden yapmaktan bıkmışsa, şöyle olabilir: "örgü takmayı bırakmak". Kontrol etmedim, ama büyükannenizin 2. bölümden sonra hala bırakacağını düşünürdüm. Daha uzun kelime kombinasyonları da aynı cümleyi geri verebilir.
Stewie Griffin

1
@StewieGriffin Kolayca "Peruk ... vay." Alabilirsiniz. bu örnek cümle ile.
question_asker

Yanıtlar:


5

LabVIEW, 166 LabVIEW Temel Öğeleri

Her şeyden önce Labview veri akışı yapar, bu yüzden gerçekten gerek yok çünkü 2 ayrı program oluşturmadı.

Histogramı 1-26 arasında ilk harfi dinlenme ilk öğe = ascii kodu ile kaydeder. Uzunluk basitçe bir diziye kaydedilir.

İlk kelimede 3 kontrol, ilk harf, uzunluk ve histogramda mevcut harfler bulunur. İlk harf denetimi ilk sözcükten sonra durur.

Histogramı her harf için azaltarak ve 0'ın altına düşüp düşmeyeceğini kontrol ederim.

Eğer benim Nth kelime buldum ve harfler üzerinde soldan oluşturulabilir hiçbir kelime varsa ben dikte gelen kelimeleri silmeye başlayacak ve bir çözüm bulana kadar Nth kelime ve benzeri yeniden.

Bu, cümleler için işe yarayıp yaramayabilir, çünkü bu hesaplanması sonsuza dek sürecektir (örneğim zaten birkaç saniye sürdü).

Ne denedim

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 bayt

Ne yazık ki, Android için QPython dosya G / Ç işlemesi yapamayacağı için gerçek w.txt dosyası ATM ile test edemiyorum. Kopyaladığım ve yapıştırdığım verilerle çalıştı.

Bölüm 1, 76 bayt

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

İçinde: 'Hi there.'

Dışarı: {'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)

yani, aşağıdakileri içeren bir liste:

  • histogramlı bir hashmap

  • harf sayımlarının bir listesi

Bölüm 2, 277 bayt

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 saflaştırmayı başardığım için gerçekten çok memnunum. Bu gerçek golf yardımcı olur emin değilim, ama kesinlikle şaşkınlık parçası doğru var: D İşte pt daha insan dostu bir sürümü. 2 (tam olarak aynı akış, ancak değişken adlarıyla):

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 bayt

için 2x +1 içerir -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}

Olması gerekir w.txtyılında unix formatında ( \nsatır sonları). catDosyayı okumak için kullanır ; typepencereler olarak değiştir .
Yukarıdaki oneliner'ı kaydedin 534.plve olarak çalıştırın echo Test. | perl -p 534.pl.

Oldukça büyük, ama bir başlangıç ​​- birçok golf fırsatı, ama ben sadece LabVIEW daha az yalnız ;-) cevap yapmak için göndermek istedim. 30 saniyeden fazla bayt tasarrufu sağlayan ikinci saniyelik yürütme için yapılan optimizasyonları atladım.


İlk snippet (73 bayt):

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

Bir histogram ve kompakt bir biçimde uzunluklar kelimesi üretir. Giriş Zulus win.için (,), burada gerekli olmayan tip-2 çıkış üretir :

s1 l1 u2 Z1 w1 i1 n1 5 3

İşte, ungolfed:

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
}

İkinci snippet (441 bayt)

Bu ana bölüm, G / Ç ve alt harfleri kullanarak gve haşağıda listelenen ilk mektubun özel muamelesi ile ilgilidir .

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.
    $_
}

Bu özyinelemeli işlev, histogramın bir kopyasını, kalan sözcük sayımlarının bir kopyasını ve geçerli sözcüğün bir kopyasını alır. Sözcük uzunluğu dizisi boşsa, true değerini döndürür. Aksi takdirde, verilen kelimedeki harfler için histogram sayısını azaltır, bir sonraki kelime uzunluğunu alır ve kelime listesinden uygun kelimelerin bir listesini bulur. Her uygun kelime için tekrarlanır.

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!
}

Ve son olarak, bu alt rutine bir kelime ve cümle histogramı verilir. Sözcük için yeni bir histogram hesaplar ve tüm harflerin cümle histogramının izin verdiğinden daha sık meydana gelip gelmediğini kontrol eder.

# 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
}

Çözülmemiş snippet'leri ( sub i/o/g/h) tek bir dosyaya yapıştırabilir ve aşağıdaki test kodunu ekleyebilirsiniz.

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 güncellemesi : a substrve parametresini ortadan kaldırarak 12 bayt kaydedin sub g.

Anlıyorum, örneklerimi çalıyorum! Sadece şakalar şaka yapıyor XD
Eumel

@Eumel Evet, sizinkinden farklıydı, bu yüzden onları dahil ettim :-)
Kenney
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.