สร้างประโยคใหม่


12

ความท้าทายนี้ประกอบด้วยสองส่วน ผู้ชนะจะได้รับการแก้ไขด้วยจำนวนไบต์ต่ำสุดทั้งหมด ต้องใช้ภาษาเดียวกันทั้งสองข้อ

ส่วนที่ 1:

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้ประโยคที่มีเพียงคำที่ถูกต้องเป็นอินพุตและส่งออกรายการของอักขระที่ใช้จำนวนครั้งที่ใช้ตัวอักษรแต่ละตัวและจำนวนตัวอักษรในแต่ละคำในประโยคต้นฉบับ เอาต์พุตจากโปรแกรมนี้ต้องเป็นอินพุตที่ถูกต้องไปยังโปรแกรมถัดไป (เหมือนกับที่เอาต์พุต)

ฉันจะเพิ่มตัวอย่างและกฎโดยละเอียดเพิ่มเติม

ส่วนที่ 2:

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้เอาต์พุตจากโปรแกรมแรกเป็นอินพุตและใช้รายการคำศัพท์ภาษาอังกฤษนี้และสร้างประโยคใหม่ด้วยข้อมูลจากเอาต์พุต ประโยคไม่จำเป็นต้องเหมือนกับประโยคต้นฉบับ

ข้อมูลมากกว่านี้. กฎและข้อ จำกัด :

ส่วนที่ 1:

  • อินพุตแรกสามารถอยู่ในรูปแบบที่เหมาะสมโดยมีหรือไม่มีเครื่องหมายอัญประกาศเป็นอาร์กิวเมนต์ฟังก์ชันหรือจาก STDIN โดยมีหรือไม่มีเครื่องหมายวงเล็บเป็นต้น
  • ประโยคอินพุตจะไม่มีเครื่องหมายวรรคตอนหรืออักขระพิเศษยกเว้นจุด / จุดในที่สุด ยกเว้นสัญลักษณ์ช่วงเวลาอักขระทั้งหมดที่อยู่ในอินพุตจะอยู่ในรายการคำ
  • ตัวอักษรตัวแรกของประโยคจะเป็นตัวพิมพ์ใหญ่ส่วนที่เหลือจะเป็นตัวพิมพ์เล็ก
  • ผลลัพธ์ของส่วนที่ 2 จะต้องเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่เหมือนกันกับประโยคต้นฉบับ (ดังนั้นไม่แนะนำให้แปลงอินพุตเป็นตัวพิมพ์เล็ก (แต่ตกลง)
  • เอาต์พุตสามารถอยู่ในรูปแบบที่เหมาะสม:
    • จะต้องสามารถคัดลอกวางผลลัพธ์ลงในโปรแกรม / ฟังก์ชันถัดไปได้โดยตรง
    • ไม่สามารถทำการแก้ไขได้เมื่อการคัดลอกวางผลลัพธ์ทั้งหมดจะต้องคัดลอกและวางโดยรวมไม่ใช่ในส่วน
    • ตัวอย่างเช่นคุณอาจแสดงฮิสโตแกรมของตัวอักษรทั้งหมดในตัวอักษรหรือใช้เฉพาะที่ใช้ (โดยทั่วไปสิ่งใดก็ตามที่จำเป็นในการเติมส่วนที่ 2)
    • คุณไม่สามารถส่งออกรายการของตัวละครที่เกิดซ้ำหลายครั้ง ยกตัวอย่างเช่นThe queueไม่สามารถให้ผลผลิตออก: มันควรจะเป็นสิ่งที่ชอบ:Teeehquu (3,5)Tehqu, (1 3 1 1 2),(3 5)

ส่วนที่ 2:

  • โปรแกรม / ฟังก์ชั่นจะต้องยอมรับอินพุตเหมือนกับที่มาจากส่วนที่ 1 (ข้อยกเว้นหนึ่งข้อโปรดดูความคิดเห็นด้านล่างเกี่ยวกับการตั้งชื่อไฟล์เป็นอินพุต)
    • หากเครื่องหมายวงเล็บล้อมรอบเครื่องหมายอัญประกาศหรือสิ่งที่คล้ายกันจำเป็นต้องแยกวิเคราะห์อินพุตดังนั้นสิ่งเหล่านี้ต้องเป็นส่วนหนึ่งของเอาต์พุตจากส่วนที่ 1
  • รายการคำสามารถพบได้ที่นี่
    • รายการคำสามารถถูกบันทึกไว้ในเครื่องเป็นw.txtหรือสามารถดึงจาก url URL จะนับเป็น 5 ไบต์เท่านั้นดังนั้นคุณไม่จำเป็นต้องใช้ตัวย่อ URL
    • หากโปรแกรมไม่สามารถเปิดไฟล์โดยไม่อ่านชื่อเป็นอินพุตจาก 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 ตัวอักษรและคำที่สองมี 3

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


นี่คือความมุ่งมั่น: github.com/isaacg1/pyth/commit/…
PurkkaKoodari

@ LegionMammal978: ใช่คุณสามารถทำได้ภายใต้ข้อ จำกัด ดังต่อไปนี้: ผลลัพธ์จากf1สิ่งที่วางลงในนั้นf2จะต้องมีข้อมูลทั้งหมดที่ระบุในการท้าทาย f1ไม่มีข้อมูลเพิ่มเติมสามารถเป็นส่วนหนึ่งของการส่งออกจาก ไม่มีข้อมูลที่สามารถ "เก็บไว้" ในการทำให้ข้อมูลที่มีอยู่เมื่อเรียกใช้งานจากf1 สามารถรับหนึ่งสายเป็นอินพุตต่อการโทรเท่านั้น f2f1
Stewie Griffin

1
โอกาสที่จะได้ประโยคเดียวกันมากกว่า 3 คำจริง ๆ แล้วค่อนข้างแย่ฉันคิดว่า
Eumel

โดยทั่วไปแล้วใช่ แต่มีหลายกรณีที่คุณน่าจะได้ประโยคเดียวกัน หากคุณยายของคุณเบื่อที่จะทำเสื้อกันหนาวเก่าคุณอาจจะ: "เลิกถักนิตติ้งการเลิก" ฉันไม่ได้ตรวจสอบ แต่ฉันคิดว่าคุณยายของคุณจะยังคงลาออกหลังจากตอนที่ 2 และการรวมกันของคำที่ยาวกว่าอาจให้ประโยคเดียวกันกลับมา
Stewie Griffin

1
@StewieGriffin คุณสามารถรับ "Wig ... wows" กลับมาพร้อมประโยคตัวอย่างนั้น
question_asker

คำตอบ:


5

LabVIEW, 166 LabVIEW Primitives

ก่อนอื่นฉันไม่ได้สร้าง 2 โปรแกรมแยกต่างหากเนื่องจาก Labview ทำดาต้าโฟลว์ดังนั้นจึงไม่จำเป็นต้องใช้เลย

บันทึกฮิสโตแกรมที่มีองค์ประกอบแรก = รหัส ascii ของส่วนที่เหลือตัวอักษรตัวแรกจาก 1-26 ไปตามจำนวน ความยาวจะได้รับการบันทึกในอาร์เรย์

คำแรกมี 3 การตรวจสอบตัวอักษรตัวแรกความยาวและตัวอักษรที่มีอยู่ในฮิสโตแกรม การตรวจสอบตัวอักษรตัวแรกจะหยุดหลังจากคำแรก

ฉันตรวจสอบฮิสโตแกรมโดยการลดลงสำหรับตัวอักษรทุกตัวและตรวจสอบว่าจะลดลงต่ำกว่า 0 หรือไม่

หากฉันพบคำที่ Nth ของฉันและไม่มีคำใด ๆ ที่สร้างได้จากตัวอักษรด้านซ้ายฉันจะเริ่มลบคำจาก dictonary และทำซ้ำคำที่ Nth และต่อไปจนกว่าฉันจะได้พบวิธีแก้ปัญหา

สิ่งนี้อาจหรืออาจใช้ไม่ได้กับประโยคที่มีเนื่องจากจะใช้เวลานานในการคำนวณ (ตัวอย่างของฉันใช้เวลาสองสามวินาทีแล้ว)

สิ่งที่ฉันพยายาม

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 เพราะ QPython สำหรับ Android ไม่สามารถจัดการไฟล์ 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)

ดังนั้นรายการที่มี:

  • hashmap พร้อมฮิสโตแกรม

  • รายการตัวอักษรนับ

ส่วนที่ 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}

ต้องมีw.txtในรูปแบบunix (การ\nสิ้นสุดบรรทัด) ใช้catเพื่ออ่านไฟล์; เปลี่ยนเป็นtypeสำหรับ windows
บันทึก oneliner ดังกล่าวข้างต้นในและทำงานเป็น534.plecho 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.มันสร้างเอาต์พุต type-2 โดยไม่มี(,)ซึ่งไม่จำเป็นที่นี่:

s1 l1 u2 Z1 w1 i1 n1 5 3

นี่มันคือ 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
}

ตัวอย่างที่สอง (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.
    $_
}

ฟังก์ชันเรียกซ้ำนี้ใช้เวลาคัดลอกฮิสโตแกรมสำเนาของจำนวนคำที่เหลืออยู่และคำปัจจุบัน ถ้าอาร์เรย์ความยาวคำว่างเปล่าส่งคืนจริง มิฉะนั้นจะทำให้ฮิสโตแกรมนับจำนวนลดลงสำหรับตัวอักษรในคำที่กำหนดใช้ความยาวคำถัดไปและค้นหารายการคำที่เหมาะสมจากรายการคำ สำหรับแต่ละคำที่เหมาะสมมันจะเกิดขึ้นอีกครั้ง

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 ไบต์กำจัดและพารามิเตอร์สำหรับsubstrsub g

ฉันเห็นขโมยตัวอย่างของฉัน! เพียงแค่ล้อเล่น rasults เป็นเฮฮา XD
Eumel

@Eumel ใช่พวกเขาแตกต่างจากของคุณดังนั้นฉันรวมพวกเขาไว้ :-)
Kenney
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.