แก้ไขย่อหน้า


32

ด้วยจิตวิญญาณของPatch the Imageนี่เป็นความท้าทายที่คล้ายกัน แต่มีข้อความ

ท้าทาย

Bit rot ทำให้ข้อความที่มีค่าของคุณทรมาน! ด้วยย่อหน้าที่ประกอบด้วยอักขระ ASCII โดยที่มีรูสี่เหลี่ยมอยู่ที่ไหนสักแห่งโปรแกรมของคุณควรพยายามเติมข้อความที่เหมาะสมลงในหลุมเพื่อให้ย่อหน้านั้นกลมกลืนที่สุดเท่าที่จะทำได้

คำจำกัดความเพิ่มเติม

  • หลุมจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอและอาจขยายหลายบรรทัด
  • จะมีเพียงรูเดียวเท่านั้น
  • โปรดทราบว่ารูไม่จำเป็นต้องตกอยู่ในขอบเขตของคำ
  • หลุมจะมีอย่างน้อยที่สุด 25% ของย่อหน้าอินพุต แต่อาจทับซ้อนหรือขยายผ่านข้อความ "สิ้นสุด" ของข้อความ "ปกติ" (ดูตัวอย่างของ Euclid หรือ Badger ด้านล่าง)
  • เนื่องจากการค้นหาหลุมไม่ใช่ประเด็นหลักของการท้าทายนี้จะประกอบด้วยเครื่องหมายแฮชเพียงอย่างเดียว#เพื่อให้สามารถระบุตัวตนได้ง่าย
  • ไม่มีตำแหน่งอื่นในย่อหน้าอินพุตจะมีเครื่องหมายแฮช
  • รหัสของคุณไม่สามารถใช้ข้อความ "ปกติ" ในตัวอย่างด้านล่าง - มันจะได้รับและประมวลผลข้อความด้วยรูที่อยู่ในนั้น
  • อินพุตสามารถเป็นสตริงแบบหลายบรรทัดเดียวเป็นอาร์เรย์ของสตริง (หนึ่งองค์ประกอบต่อบรรทัด) เป็นไฟล์และอื่น ๆ - คุณเลือกสิ่งที่สะดวกที่สุดสำหรับภาษาของคุณ
  • หากต้องการสามารถป้อนข้อมูลเพิ่มเติมที่เป็นตัวเลือกโดยละเอียดรายละเอียดพิกัดของหลุมได้ (เช่น tuple ของพิกัดหรือสิ่งที่คล้ายกัน)
  • โปรดอธิบายอัลกอริทึมของคุณในการส่งของคุณ

การออกเสียง

ผู้มีสิทธิเลือกตั้งจะถูกขอให้ตัดสินรายการตามวิธีที่อัลกอริธึมเติมเต็มในรูข้อความ ข้อเสนอแนะบางอย่างรวมถึงต่อไปนี้:

  • พื้นที่ที่เติมเต็มตรงกับการกระจายตัวของช่องว่างและเครื่องหมายวรรคตอนโดยประมาณเป็นส่วนที่เหลือของย่อหน้าหรือไม่
  • พื้นที่เติมเต็มมีไวยากรณ์ที่ผิดพลาดหรือไม่? (เช่นสองช่องว่างในแถวจุดที่ตามด้วยเครื่องหมายคำถามลำดับที่ผิดพลาดเช่น, ,ฯลฯ )
  • หากคุณเหล่ตา (ดังนั้นคุณไม่ได้อ่านข้อความจริง ๆ ) คุณจะเห็นหลุมที่เคยเป็น?
  • หากไม่มีคำใด ๆ ของ CamelCase อยู่นอกหลุมรูจะมีคำใด ๆ หรือไม่ หากไม่มีตัวอักษรตัวใหญ่อยู่นอกช่องรูจะมีหรือไม่ หากมีตัวอักษรตัวใหญ่จำนวนมากอยู่นอกรูถ้ำจะมีจำนวนตามสัดส่วนหรือไม่?

เกณฑ์ความถูกต้อง

เพื่อให้การพิจารณามีผลใช้ได้ต้องไม่ดัดแปลงข้อความใด ๆ ของย่อหน้านอกหลุม (รวมถึงช่องว่างต่อท้าย) ขึ้นบรรทัดใหม่ที่ส่วนท้ายสุดเป็นตัวเลือก

กรณีทดสอบ

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

1 (แก้ไขภาพ)

In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, based on the information outside of that patch. And it does a
quite good job, considering it is just a program. As a human, you can sometimes
see that something is wrong, but if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.

In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, #############information outside of that patch. And it does a
quite good job, co#############is just a program. As a human, you can sometimes
see that something#############t if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.

2 (ที่อยู่เกตตีสเบิร์ก)

But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here have thus far so nobly advanced. It
is rather for us to be here dedicated to the great task remaining before us-
that from these honored dead we take increased devotion to that cause for which
they gave the last full measure of devotion-that we here highly resolve that
these dead shall not have died in vain-that this nation, under God, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.

But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here h######################advanced. It
is rather for us to be here dedicated to the######################before us-
that from these honored dead we take increas######################use for which
they gave the last full measure of devotion-######################solve that
these dead shall not have died in vain-that ######################, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.

3 (Lorem Ipsum)

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo conse################irure dolor in reprehenderit
in voluptate velit esse cil################giat nulla pariatur. Excepteur
sint occaecat cupidatat non################in culpa qui officia deserunt
mollit anim id est laborum.

4 (Jabberwocky)

'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogoves,
And the mome raths outgrabe.

'Twas brillig, and the slithy toves
Did gyre a######### in the wabe;
All mimsy #########borogoves,
And the mome raths outgrabe.

5 (หลักฐานของ Euclid เกี่ยวกับทฤษฎีบทพีทาโกรัส)

1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are collinear. Similarly for B, A, and H.
6.Angles CBD and FBA are both right angles; therefore angle ABD
equals angle FBC, since both are the sum of a right angle and angle ABC.
7.Since AB is equal to FB and BD is equal to BC, triangle ABD
must be congruent to triangle FBC.
8.Since A-K-L is a straight line, parallel to BD, then rectangle
BDLK has twice the area of triangle ABD because they share the base
BD and have the same altitude BK, i.e., a line normal to their common
base, connecting the parallel lines BD and AL. (lemma 2)
9.Since C is collinear with A and G, square BAGF must be twice in area
to triangle FBC.
10.Therefore, rectangle BDLK must have the same area as square BAGF = AB^2.
11.Similarly, it can be shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.

1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are #############milarly for B, A, and H.
6.Angles C#############e both right angles; therefore angle ABD
equals ang############# both are the sum of a right angle and angle ABC.
7.Since AB#############FB and BD is equal to BC, triangle ABD
must be co#############iangle FBC.
8.Since A-#############ight line, parallel to BD, then rectangle
BDLK has t############# of triangle ABD because they share the base
BD and hav#############titude BK, i.e., a line normal to their common
base, conn#############rallel lines BD and AL. (lemma 2)
9.Since C #############with A and G, square BAGF must be twice in area
to triangl#############
10.Therefo############# BDLK must have the same area as square BAGF = AB^2.
11.Similar############# shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.

6 (แบดเจอร์แบดเจอร์แบดเจอร์โดย weebl)

Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!

Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger##################badger, badger,
badger##################badger, badger
Mushro##################
Badger##################badger, badger,
badger##################badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!

ฉันขอสมมติว่าหลุมมีความกว้างอย่างน้อยสามตัวอักษร
Rohan Jhunjhunwala

@RohanJhunjhunwala ชัวร์ เมื่อพิจารณาถึงขนาดของข้อความนั่นถือว่าเป็นสมมติฐานที่ค่อนข้างปลอดภัย
AdmBorkBork

ตัวอย่างของ gettysburg มีเครื่องหมายขีดกลาง em ซึ่งไม่ใช่ ascii แบบธรรมดา เพียงแค่ชี้ให้เห็นตั้งแต่คุณพูดถึงความคิดเห็นของคุณในหนึ่งในคำตอบที่คุณจะใช้กรณีทดสอบ ascii ธรรมดา
SuperJedi224

@ SuperJedi224 ขอบคุณ - คงที่
AdmBorkBork

คำตอบ:


15

Python 2

ฉันรู้ว่า@atlasologistได้โพสต์วิธีแก้ปัญหาไว้แล้วใน Python 2 แต่วิธีการทำงานของฉันแตกต่างกันเล็กน้อย วิธีนี้ใช้งานได้โดยผ่านทุกรูจากบนลงล่างซ้ายไปขวามอง 5 ตัวอักษรกลับและที่ตัวละครด้านบนและค้นหาตัวละครที่ตรงกับเหล่านี้ หากพบอักขระหลายตัวจะเลือกอักขระที่พบบ่อยที่สุด ในกรณีที่ไม่พบตัวอักษรมันจะลบข้อ จำกัด ข้างต้นตัวละคร หากยังคงไม่พบตัวอักษรก็จะลดจำนวนของตัวละครที่มองกลับมาและซ้ำ

def fix(paragraph, holeChar = "#"):
    lines = paragraph.split("\n")
    maxLineWidth = max(map(len, lines))
    lines = [list(line + " " * (maxLineWidth - len(line))) for line in lines]
    holes = filter(lambda pos: lines[pos[0]][pos[1]] == holeChar, [[y, x] for x in range(maxLineWidth) for y in range(len(lines))])

    n = 0
    for hole in holes:
        for i in range(min(hole[1], 5), 0, -1):
            currCh = lines[hole[0]][hole[1]]
            over = lines[hole[0] - 1][hole[1]]
            left = lines[hole[0]][hole[1] - i : hole[1]]

            same = []
            almost = []
            for y, line in enumerate(lines):
                for x, ch in enumerate(line):
                    if ch == holeChar:
                        continue
                    if ch == left[-1] == " ":
                        continue
                    chOver = lines[y - 1][x]
                    chLeft = lines[y][x - i : x]
                    if chOver == over and chLeft == left:
                        same.append(ch)
                    if chLeft == left:
                        almost.append(ch)
            sortFunc = lambda x, lst: lst.count(x) / (paragraph.count(x) + 10) + lst.count(x)
            if same:
                newCh = sorted(same, key=lambda x: sortFunc(x, same))[-1]
            elif almost:
                newCh = sorted(almost, key=lambda x: sortFunc(x, almost))[-1]
            else:
                continue
            lines[hole[0]][hole[1]] = newCh
            break


    return "\n".join(map("".join, lines))

นี่คือผลลัพธ์ของ Badger, Badger, Badger:

Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger 
Mushroom, mushroom, a-                 
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger 
Mushroom, mushroom, a- b               
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger 
Mush-mushroom, a                       
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger 
Argh! Snake, a snake!                  
Snaaake! A snaaaake, oooh its a snake! 

นี่คือผลลัพธ์จากการพิสูจน์:

1.Let ACB be a right-angled triangle with right angle CAB.                 
2.On each of the sides BC, AB, and CA, squares are drawn,                  
CBDE, BAGF, and ACIH, in that order. The construction of                   
squares requires the immediately preceding theorems in Euclid,             
and depends upon the parallel postulate. [footnote 14]                     
3.From A, draw a line parallel to BD and CE. It will                       
perpendicularly intersect BC and DE at K and L, respectively.              
4.Join CF and AD, to form the triangles BCF and BDA.                       
5.Angles CAB and BAG are both right angles; therefore C, A,                
and G are the same areamilarly for B, A, and H.                            
6.Angles CAB and CA, sqe both right angles; therefore angle ABD            
equals angle ABD becaus both are the sum of a right angle and angle ABC.   
7.Since ABD because theFB and BD is equal to BC, triangle ABD              
must be construction ofiangle FBC.                                         
8.Since A-angle ABD becight line, parallel to BD, then rectangle           
BDLK has the same area  of triangle ABD because they share the base        
BD and have the base thtitude BK, i.e., a line normal to their common      
base, conngle and G, sqrallel lines BD and AL. (lemma 2)                   
9.Since C = BD × BK + with A and G, square BAGF must be twice in area     
to triangle FBC. (lemma                                                    
10.Therefore angle and  BDLK must have the same area as square BAGF = AB^2.
11.Similarly for B, A,  shown that rectangle CKLE must have the same       
area as square ACIH = AC^2.                                                
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC             
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC             
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.

และผลของ Jabberwocky:

'Twas brillig, and the slithy toves
Did gyre and the mo in the wabe;   
All mimsy toves, anborogoves,      
And the mome raths outgrabe.       

5
ตัวแบดเจอร์นั้นน่าประทับใจทีเดียวและดูเหมือนว่า Jabberwocky อาจเป็นบทกวีที่ถูกกฎหมาย ทำได้ดีมาก
AdmBorkBork

6

Python 2

นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างตรงไปตรงมา มันจะสร้างสตริงตัวอย่างประกอบด้วยคำที่อยู่ระหว่างความยาวของคำโดยเฉลี่ยA- (A / 2) และA+ ( A/ 2) จากนั้นจะใช้พื้นที่ชั้นนำและต่อท้ายตัดชิ้นชิ้นจากตัวอย่างไปยังพื้นที่แพทช์ มันไม่จัดการกับการใช้อักษรตัวพิมพ์ใหญ่และฉันแน่ใจว่ามีกรณีทดสอบพิชต์บอลออกมาที่จะทำลายมัน แต่มันก็โอเคกับตัวอย่าง ดูลิงค์ด้านล่างเพื่อทำการทดสอบทั้งหมด

ฉันยังใส่ปะในรหัสสำหรับวัดดี

def patch(paragraph):
    sample = [x.split() for x in paragraph if x.count('#') < 1]
    length = max([x.count('#') for x in paragraph if x.find('#')])
    s = sum(####################
    sample,[####################
    ])      ####################
    avg=sum(####################
    len(w)  ####################
    for w in####################
    s)//len(s)
    avg_range = range(avg-(avg//2),avg+(avg//2))
    sample = filter(lambda x:len(x) in avg_range, s)
    height=0
    for line in paragraph:
        if line.find('#'):height+=1
        print line.replace('#'*length,' '.join(sample)[(height-1)*length:height*length].strip())
    print '\n'

Lorem Ipsum ต้นฉบับแล้วได้รับการติดตั้งแล้ว:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo conseore dolore magnairure dolor in reprehenderit
in voluptate velit esse cilenim minim quisgiat nulla pariatur. Excepteur
sint occaecat cupidatat nonnisi mollit aniin culpa qui officia deserunt
mollit anim id est laborum.

ลองมัน


3
อิอิmushroger...
AdmBorkBork

มันไม่ได้แก้ไขโค้ดของคุณในวิธีที่น่าสนใจ
mbomb007

@ mbomb007 นั่นเป็นเพราะ#ตัวละครอื่น ๆในรหัส
กายวิภาคศาสตร์

@atlasologist แม้ว่าคุณจะเปลี่ยนเป็นอย่างอื่น@ไม่มีอะไรน่าสนใจ
mbomb007

4

Java Shakespeare

ใครที่ต้องการความเข้าใจในการประชุมภาษาอังกฤษมาตรฐาน? ทำด้วยตัวเอง! เช่นเดียวกับกวีได้รับอนุญาตให้ทำขึ้นคำพูดของเขา บอทนี้ไม่ต้องกังวลมากนักเกี่ยวกับการแก้ไขคำที่ถูกตัดออกเขาแค่แทรกคำที่สุ่ม ผลที่ได้คือบทกวีที่สวยงาม ในฐานะที่เป็นคุณสมบัติโบนัสกวีที่มีความสามารถที่สูงขึ้นและสามารถจัดการหลายหลุมหากพวกเขามีขนาดเดียวกัน!


ตัวอย่างอินพุต

 จากสิ่งมีชีวิตที่ยุติธรรมที่เราต้องการเพิ่มขึ้น
  ดังนั้นความงามของกุหลาบจึงไม่มีวันตาย
  แต่เมื่อไรที่ผู้ตายควรตาย
  ความอ่อนโยนของเขา ############# จำความทรงจำของเขา:
  แต่เจ้าเจ้า ############# เจ้าดวงตาแจ่มใส
  Feed'st th ############ ame ด้วยเชื้อเพลิงที่สำคัญมาก
  การกันดารอาหารซึ่งเกิดขึ้นมากมาย
  เจ้าศัตรูของเจ้าทำให้ตัวเองหวานเกินไปเจ้า:
  ตอนนี้เจ้าเป็นเครื่องประดับที่สดใหม่ของโลกแล้วหรือยัง
  และมีเพียงข่าวประเสริฐไปยังฤดูใบไม้ผลิที่ฉูดฉาด
  ภายในตาของเจ้าเองจะทำให้เนื้อหาของเจ้าน่าเบื่อ
  และ churl อ่อนโยนก็คือ ding ############ ding:
    สงสารโลกหรือมิฉะนั้นก็จะเป็น
    หากต้องการกินอาหารครบทั่วโลกให้ข ############# และท่าน


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


                     3
  มองเข้าไปในแก้วของเจ้าแล้วบอกใบหน้าเจ้าว่า
  ตอนนี้เป็นเวลาที่ใบหน้าควรจะก่อตัวขึ้น
  ใครที่ซ่อมแซมใหม่ถ้าตอนนี้เจ้าไม่ได้ต่ออายุ
  ท่านล่อลวงโลกโดยที่ไม่มีแม่บางคน
  เพราะเธอช่างงามเสียจริง
  ไม่ไถพรวนดินของการเลี้ยงของเจ้า?
  หรือใครที่เขาชอบจะเป็นหลุมศพ
  ของเขารักตัวเองเพื่อหยุดลูกหลาน?  
  เธอเป็นแก้วแม่ของเจ้าและเธออยู่ในเจ้า
  โทรกลับเมษายนที่น่ารักของนายกของเธอ
  ดังนั้นเจ้าจะเห็นผ่านหน้าต่างแห่งอายุของเจ้า
  แม้จะมีเวลาทองของ ############
    แต่ถ้า # ############ mbered ไม่ให้เป็น
    Die singl ############ ภาพตายกับคุณ

เอาท์พุทที่สวยงาม

 จากสิ่งมีชีวิตที่ยุติธรรมที่เราต้องการเพิ่มขึ้น
  ดังนั้นความงามของกุหลาบจึงไม่มีวันตาย
  แต่เมื่อไรที่ผู้ตายควรตาย
  ความอ่อนโยนของเขาควรเป็นความทรงจำของเขา:
  แต่เจ้าทุกคนคร่ำครวญถึงตาที่สดใสของเจ้า
  ให้อาหารหรือพิสูจน์ด้วยเชื้อเพลิงที่มีคุณค่า
  การกันดารอาหารซึ่งเกิดขึ้นมากมาย
  เจ้าศัตรูของเจ้าทำให้ตัวเองหวานเกินไปเจ้า:
  ตอนนี้เจ้าเป็นเครื่องประดับที่สดใหม่ของโลกแล้วหรือยัง
  และมีเพียงข่าวประเสริฐไปยังฤดูใบไม้ผลิที่ฉูดฉาด
  ภายในตาของเจ้าเองจะทำให้เนื้อหาของเจ้าน่าเบื่อ
  และเขาก็อ่อนโยนอย่างที่ทำให้ mink'st:
    สงสารโลกหรืออื่น ๆ ดังนั้นเป็น
    ที่จะกินโลกเนื่องจาก แต่เจ้าและเจ้า


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


                     3
  มองเข้าไปในแก้วของเจ้าแล้วบอกใบหน้าเจ้าว่า
  ตอนนี้เป็นเวลาที่ใบหน้าควรจะก่อตัวขึ้น
  ใครที่ซ่อมแซมใหม่ถ้าตอนนี้เจ้าไม่ได้ต่ออายุ
  ท่านล่อลวงโลกโดยที่ไม่มีแม่บางคน
  เพราะเธอช่างงามเสียจริง
  ไม่ไถพรวนดินของการเลี้ยงของเจ้า?
  หรือใครที่เขาชอบจะเป็นหลุมศพ
  ของเขารักตัวเองเพื่อหยุดลูกหลาน?  
  เธอเป็นแก้วแม่ของเจ้าและเธออยู่ในเจ้า
  โทรกลับเมษายนที่น่ารักของนายกของเธอ
  ดังนั้นเจ้าจะเห็นผ่านหน้าต่างแห่งอายุของเจ้า
  แม้จะมองดูเวลาทองของเจ้า
    แต่ถ้าเมื่อไหร่ mbered ไม่ควรเป็น
    ตาย singl ซ่อมแซมภาพตายกับเจ้า

สองสามบรรทัดสุดท้ายเป็นบทกวีที่ลึกซึ้งถ้าฉันพูดอย่างนั้น มันทำงานได้ดีอย่างน่าประหลาดใจในที่อยู่ gettysburg เช่นกัน

But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here h to of rather us of advanced. It
is rather for us to be here dedicated to the who be it, vain who before us 
that from these honored dead we take increas be dead the the what use for which
they gave the last full measure of devotion  dead government The solve that
these dead shall not have died in vain that  the take nor world , shall have
a new birth of freedom and that government of the people, by the people, for
the people, shall not perish from the earth.


ให้ดูว่าอะไรที่ทำให้ Shakespeare ติ๊ก นี่คือรหัส เป็นหลักเขามุ่งมั่นที่จะสร้างฐานคำศัพท์จากการป้อนข้อมูล จากนั้นเขาก็ใช้คำเหล่านี้และวางมันลงในหลุมแบบสุ่ม เขาเป็นคนกำหนดขึ้นในขณะที่เขาใช้เมล็ดคงที่สำหรับการสุ่ม

package stuff;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;

/**
 *
 * @author rohan
 */
public class PatchTheParagraph {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("File Name :");
        String[] text = getWordsFromFile(in.nextLine());
System.out.println("==ORIGINAL==");
        for(String s:text){
    System.out.println(s);
}
                    int lengthOfHole= 0;
        int rows = 0;
            for(String s: text){
                s = s.replaceAll("[^#]", "");

//      System.out.println(s);
                if(s.length()>0){
                    lengthOfHole = s.length();
                rows++;
                }
            }
            ArrayList<String> words = new ArrayList<>();
            words.add("I");
            for(String s:text){
                String[] w = s.replaceAll("#", " ").split(" ");
for(String a :w){
    words.add(a);
            }

            }
                        Iterator<String> j = words.iterator();
            while(j.hasNext()){
                String o;
                if((o = j.next()).equals("")){
                    j.remove();
                }
            }
            System.out.println(words);
            Stack<String> out = new Stack<>();
            String hashRow = "";
            for(int i = 0;i<lengthOfHole;i++){
                hashRow+="#";
            }

        for(int i = 0;i<rows;i++){
            int length = lengthOfHole-1; 
            String outPut = " ";
            while(length>2){
String wordAttempt = words.get(getRandom(words.size()-1));
while(wordAttempt.length()>length-1){
 wordAttempt = words.get(getRandom(words.size()-1));
}           
length -= wordAttempt.length()+1;
            outPut+=wordAttempt;
                outPut+=" ";
            }
        out.push(outPut);
    }
System.out.println("==PATCHED==");
        for(String s : text){
            if(s.contains(hashRow)){
                System.out.println(s.replaceAll(hashRow,out.pop()));
            }else{
                System.out.println(s);
            }
        }
                                    }
public static final Random r = new Random(42);
    public static int getRandom(int max){
    return (int) (max*r.nextDouble());
}
    /**
     *
     * @param fileName is the path to the file or just the name if it is local
     * @return the number of lines in fileName
     */
    public static int getLengthOfFile(String fileName) {
        int length = 0;
        try {
            File textFile = new File(fileName);
            Scanner sc = new Scanner(textFile);
            while (sc.hasNextLine()) {
                sc.nextLine();
                length++;
            }
        } catch (Exception e) {
System.err.println(e);
        }
        return length;
    }

    /**
     *
     * @param fileName is the path to the file or just the name if it is local
     * @return an array of Strings where each string is one line from the file
     * fileName.
     */
    public static String[] getWordsFromFile(String fileName) {
        int lengthOfFile = getLengthOfFile(fileName);
        String[] wordBank = new String[lengthOfFile];
        int i = 0;
        try {
            File textFile = new File(fileName);
            Scanner sc = new Scanner(textFile);
            for (i = 0; i < lengthOfFile; i++) {
                wordBank[i] = sc.nextLine();
            }
            return wordBank;
        } catch (Exception e) {
            System.err.println(e);
            System.exit(55);
        }
        return null;
    }
}


บทกวีของเช็คสเปียร์ส่วนใหญ่เป็นสาธารณสมบัติ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
เดนนิส

3

Python 2.7

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

รหัสเต็มรวมถึงข้อความตัวอย่างหนึ่งข้อความอยู่ด้านล่าง เนื่องจากตัวอย่างหนึ่งใช้อักขระ Unicode ฉันจึงรวมเพจรหัสที่ชัดเจน (utf-8) เพื่อความเข้ากันได้กับตัวอย่างนั้น

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from collections import defaultdict
import numpy

texts = [
"""'Twas brillig, and the slithy toves
Did gyre a######### in the wabe;
All mimsy #########borogoves,
And the mome raths outgrabe."""
]

class Patcher:
    def __init__(self):
        self.mapper = defaultdict(lambda: defaultdict(int))

    def add_mapping(self, from_value, to_value):
        self.mapper[from_value][to_value] += 1

    def get_patch(self, from_value):
        if from_value in self.mapper:
            sum_freq = sum(self.mapper[from_value].values())
            return numpy.random.choice(
                self.mapper[from_value].keys(),
                p = numpy.array(
                    self.mapper[from_value].values(),dtype=numpy.float64) / sum_freq)
        else:
            return None

def add_text_mappings(text_string, patcher = Patcher(), ignore_characters = ''):
    previous_letter = text_string[0]
    for letter in text_string[1:]:
        if not letter in ignore_characters:
            patcher.add_mapping(previous_letter, letter)
            previous_letter = letter
    patcher.add_mapping(text_string[-1], '\n')

def patch_text(text_string, patcher, patch_characters = '#'):
    result = previous_letter = text_string[0]
    for letter in text_string[1:]:
        if letter in patch_characters:
            result += patcher.get_patch(previous_letter)
        else:
            result += letter
        previous_letter = result[-1]
    return result

def main():
    for text in texts:
        patcher = Patcher()
        add_text_mappings(text, patcher, '#')
        print patch_text(text, patcher, '#')
        print "\n"

if __name__ == '__main__':
    main()

เอาต์พุตตัวอย่างสำหรับ Lorem Ipsum:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo conse Exe eut ccadamairure dolor in reprehenderit
in voluptate velit esse cilore indipserexepgiat nulla pariatur. Excepteur
sint occaecat cupidatat non upir alostat adin culpa qui officia deserunt
mollit anim id est laborum.

บทกวีพิเศษใน Jabberwocky:

'Twas brillig, and the slithy toves
Did gyre and me the in the wabe;
All mimsy was
An inborogoves,
And the mome raths outgrabe.

ข้อความตัวอย่างใดที่มี Unicode พวกเขาทั้งหมดควรตรง ASCII โปรดแจ้งให้เราทราบและฉันจะแก้ไขให้ถูกต้อง
AdmBorkBork

งูหลามบ่นเกี่ยวกับmınxomaτในข้อความแรกหมายถึงPEP 263
ตลอดไป

อา - ไม่รู้ด้วยซ้ำ ฉันได้แก้ไขแล้วว่าให้ตรง ASCII ขอบคุณสำหรับการให้ฉันรู้ว่า!
AdmBorkBork

2

C # 5 ยิ่งใหญ่เช่นเคย

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

มันทำงานโดย tokenizing อินพุตเป็นคำและเครื่องหมายวรรคตอน (เครื่องหมายวรรคตอนมาจากรายการที่ป้อนด้วยตนเองเพราะฉันไม่สามารถใส่ใจที่จะทำงานถ้า Unicode สามารถทำสิ่งนี้ให้ฉันได้) เพื่อให้สามารถใส่ช่องว่างก่อนคำพูดและไม่ใช่ก่อน เครื่องหมายวรรคตอนเพราะนี่เป็นเรื่องปกติ มันแยกบนช่องว่างทั่วไป ในเส้นเลือดของมาร์คอฟโซ่ (ฉันคิดว่า) มันนับความถี่ว่าแต่ละโทเค็นติดตามโทเค็นแต่ละตัวแล้วและไม่คำนวณความน่าจะเป็นสำหรับเรื่องนี้ (ฉันคิดว่าเพราะเอกสารมีขนาดเล็กมากเราควรอคติต่อสิ่งต่างๆ เราเห็นมากที่เราสามารถ) จากนั้นเราทำการค้นหาแบบกว้างครั้งแรกเติมเต็มพื้นที่ที่เหลือโดยแฮชและคำว่า 'บางส่วน' ข้างใดข้างหนึ่งด้วยค่าใช้จ่ายที่คำนวณได้-fabness(last, cur) * len(cur_with_space)ซึ่งfabnessจะส่งกลับจำนวนครั้งcurตามlastสำหรับแต่ละโทเค็นต่อท้ายในสตริงที่สร้าง โดยปกติเราพยายามลดค่าใช้จ่ายให้น้อยที่สุด เนื่องจากเราไม่สามารถเติมช่องว่างด้วยคำและเครื่องหมายวรรคตอนที่พบในเอกสารได้ตลอดเวลาจึงยังพิจารณาโทเค็น 'พิเศษ' จำนวนหนึ่งจากบางรัฐรวมถึงสตริงบางส่วนที่ด้านข้างซึ่งเรามีอคติกับค่าใช้จ่ายที่เพิ่มขึ้นตามอำเภอใจ

หาก BFS ล้มเหลวในการค้นหาวิธีแก้ไขเราจะพยายามเลือกคำวิเศษณ์สุ่มหรือเพียงแค่แทรกช่องว่างเพื่อเติมเต็มช่องว่าง

ผล

ทั้งหมด 6 สามารถพบได้ที่นี่: https://gist.github.com/anonymous/5277db726d3f9bdd950b173b19fec82a

กรณีทดสอบของยุคลิดไม่ได้เป็นไปด้วยดี ...

แก้ไขภาพ

In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, that patches information outside of that patch. And it does a
quite good job, co the patch a is just a program. As a human, you can sometimes
see that something In a short it if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.

Jabberwocky

'Twas brillig, and the slithy toves
Did gyre and the in in the wabe;
All mimsy the mome borogoves,
And the mome raths outgrabe.

รบกวน

Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, badger, badger
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!

_ ฉันดีใจที่สิ่งนี้กลายเป็น ... มันโชคดีที่ "แบดเจอร์แบดเจอร์" เข้ากันไม่ได้หรืออันนี้คงจะทำได้ไม่ดีนัก

รหัส

เรียกใช้ด้วย

csc ParaPatch.cs
ParaPatch.exe infile outfile

มีอยู่มากมายเลยทีเดียว บิตที่น่าสนใจจากระยะไกลเท่านั้นเป็นFillวิธีการ ฉันรวมการติดตั้งฮีปไว้ด้วยเนื่องจาก. NET ไม่ได้มีหนึ่ง (ทำไมต้องเป็น MS ทำไม?)

using System;
using System.Collections.Generic;
using System.Linq;

namespace ParaPatch
{
    class Program
    {
        private static string[] Filler = new string[] { "may", "will", "maybe", "rather", "perhaps", "reliably", "nineword?", "definitely", "elevenword?", "inexplicably" }; // adverbs
        private static char[] Breaking = new char[] { ' ', '\n', '\r', '\t' };
        private static char[] Punctuation = new char[] { ',', '.', '{', '}', '(', ')', '/', '?', ':', ';', '\'', '\\', '"', ',', '!', '-', '+', '[', ']', '£', '$', '%', '^', '—' };

        private static IEnumerable<string> TokenizeStream(System.IO.StreamReader reader)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            HashSet<char> breaking = new HashSet<char>(Breaking);
            HashSet<char> punctuation = new HashSet<char>(Punctuation);

            while (!reader.EndOfStream)
            {
                int ci = reader.Read();
                if (ci == -1) // sanity
                    break;

                char c = (char)ci;

                if (breaking.Contains(c))
                {
                    if (sb.Length > 0)
                        yield return sb.ToString();
                    sb.Clear();
                }
                else if (punctuation.Contains(c))
                {
                    if (sb.Length > 0)
                        yield return sb.ToString();
                    yield return ""+c;
                    sb.Clear();
                }
                else
                {

                    sb.Append(c);
                }
            }

            if (sb.Length > 0)
                yield return sb.ToString();
        }

        private enum DocTokenTypes
        {
            Known,
            LeftPartial,
            RightPartial,
            Unknown,
        }

        private class DocToken
        {
            public DocTokenTypes TokenType { get; private set; }
            public string StringPart { get; private set; }
            public int Length { get; private set; }

            public DocToken(DocTokenTypes tokenType, string stringPart, int length)
            {
                TokenType = tokenType;
                StringPart = stringPart;
                Length = length;
            }
        }

        private static IEnumerable<DocToken> DocumentTokens(IEnumerable<string> tokens)
        {
            foreach (string token in tokens)
            {
                if (token.Contains("#"))
                {
                    int l = token.IndexOf("#");
                    int r = token.LastIndexOf("#");

                    if (l > 0)
                        yield return new DocToken(DocTokenTypes.LeftPartial, token.Substring(0, l), l);

                    yield return new DocToken(DocTokenTypes.Unknown, null, r - l + 1);

                    if (r < token.Length - 1)
                        yield return new DocToken(DocTokenTypes.RightPartial, token.Substring(r + 1), token.Length - r - 1);
                }
                else
                    yield return new DocToken(DocTokenTypes.Known, token, token.Length);
            }
        }

        private class State : IComparable<State>
        {
            // missing readonly params already... maybe C#6 isn't so bad
            public int Remaining { get; private set; }
            public int Position { get; private set; }
            public State Prev { get; private set; }
            public string Token { get; private set; }
            public double H { get; private set; }
            public double Fabness { get; private set; }
            public string FullFilling { get; private set; }

            public State(int remaining, int position, Program.State prev, double fabness, double h, string token, string toAdd)
            {
                Remaining = remaining;
                Position = position;
                Prev = prev;
                H = h;
                Fabness = fabness;
                Token = token;

                FullFilling = prev != null ? prev.FullFilling + toAdd : toAdd;
            }

            public int CompareTo(State other)
            {
                return H.CompareTo(other.H);
            }
        }

        public static void Main(string[] args)
        {
            if (args.Length < 2)
                args = new string[] { "test.txt", "testout.txt" };

            List<DocToken> document;
            using (System.IO.StreamReader reader = new System.IO.StreamReader(args[0], System.Text.Encoding.UTF8))
            {
                document = DocumentTokens(TokenizeStream(reader)).ToList();
            }

            foreach (DocToken cur in document)
            {
                Console.WriteLine(cur.StringPart + " " + cur.TokenType);
            }

            // these are small docs, don't bother with more than 1 ply
            Dictionary<string, Dictionary<string, int>> FollowCounts = new Dictionary<string, Dictionary<string, int>>();
            Dictionary<string, Dictionary<string, int>> PreceedCounts = new Dictionary<string, Dictionary<string, int>>(); // mirror (might be useful)

            HashSet<string> knowns = new HashSet<string>(); // useful to have lying around

            // build counts
            DocToken last = null;
            foreach (DocToken cur in document)
            {
                if (cur.TokenType == DocTokenTypes.Known)
                {
                    knowns.Add(cur.StringPart);
                }

                if (last != null && last.TokenType == DocTokenTypes.Known && cur.TokenType == DocTokenTypes.Known)
                {
                    {
                        Dictionary<string, int> ltable;
                        if (!FollowCounts.TryGetValue(last.StringPart, out ltable))
                        {
                            FollowCounts.Add(last.StringPart, ltable = new Dictionary<string, int>());
                        }

                        int count;
                        if (!ltable.TryGetValue(cur.StringPart, out count))
                        {
                            count = 0;
                        }
                        ltable[cur.StringPart] = count + 1;
                    }


                    {
                        Dictionary<string, int> ctable;
                        if (!PreceedCounts.TryGetValue(cur.StringPart, out ctable))
                        {
                            PreceedCounts.Add(cur.StringPart, ctable = new Dictionary<string, int>());
                        }

                        int count;
                        if (!ctable.TryGetValue(last.StringPart, out count))
                        {
                            count = 0;
                        }
                        ctable[last.StringPart] = count + 1;
                    }
                }

                last = cur;
            }

            // build probability grid (none of this efficient table filling dynamic programming nonsense, A* all the way!)
            // hmm... can't be bothered
            Dictionary<string, Dictionary<string, double>> fabTable = new Dictionary<string, Dictionary<string, double>>();
            foreach (var k in FollowCounts)
            {
                Dictionary<string, double> t = new Dictionary<string, double>();

                // very naive
                foreach (var k2 in k.Value)
                {
                    t.Add(k2.Key, (double)k2.Value);
                }

                fabTable.Add(k.Key, t);
            }

            string[] knarr = knowns.ToArray();
            Random rnd = new Random("ParaPatch".GetHashCode());

            List<string> fillings = new List<string>();
            for (int i = 0; i < document.Count; i++)
            {
                if (document[i].TokenType == DocTokenTypes.Unknown)
                {
                    // shuffle knarr
                    for (int j = 0; j < knarr.Length; j++)
                    {
                        string t = knarr[j];
                        int o = rnd.Next(knarr.Length);
                        knarr[j] = knarr[o];
                        knarr[o] = t;
                    }

                    fillings.Add(Fill(document, fabTable, knarr, i));
                    Console.WriteLine(fillings.Last());
                }
            }

            string filling = string.Join("", fillings);

            int fi = 0;

            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(args[1]))
            using (System.IO.StreamReader reader = new System.IO.StreamReader(args[0]))
            {
                while (!reader.EndOfStream)
                {
                    int ci = reader.Read();
                    if (ci == -1)
                        break;

                    char c = (char)ci;
                    c = c == '#' ? filling[fi++] : c;

                    writer.Write(c);
                    Console.Write(c);
                }
            }

//            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(args[1], false, System.Text.Encoding.UTF8))
//            using (System.IO.StreamReader reader = new System.IO.StreamReader(args[0]))
//            {
//                foreach (char cc in reader.ReadToEnd())
//                {
//                    char c = cc;
//                    c = c == '#' ? filling[fi++] : c;
//                    
//                    writer.Write(c);
//                    Console.Write(c);
//                }
//            }

            if (args[0] == "test.txt")
                Console.ReadKey(true);
        }

        private static string Fill(List<DocToken> document, Dictionary<string, Dictionary<string, double>> fabTable, string[] knowns, int unknownIndex)
        {
            HashSet<char> breaking = new HashSet<char>(Breaking);
            HashSet<char> punctuation = new HashSet<char>(Punctuation);

            Heap<State> due = new Heap<Program.State>(knowns.Length);

            Func<string, string, double> fabness = (prev, next) =>
            {
                Dictionary<string, double> table;
                if (!fabTable.TryGetValue(prev, out table))
                    return 0; // not fab
                double fab;
                if (!table.TryGetValue(next, out fab))
                    return 0; // not fab
                return fab; // yes fab
            };

            DocToken mostLeft = unknownIndex > 2 ? document[unknownIndex - 2] : null;
            DocToken left = unknownIndex > 1 ? document[unknownIndex - 1] : null;
            DocToken unknown = document[unknownIndex];
            DocToken right = unknownIndex < document.Count - 2 ? document[unknownIndex + 1] : null;
            DocToken mostRight = unknownIndex < document.Count - 3 ? document[unknownIndex + 2] : null;

            // sum of empty space and partials' lengths
            int spaceSize = document[unknownIndex].Length
                + (left != null && left.TokenType == DocTokenTypes.LeftPartial ? left.Length : 0)
                + (right != null && right.TokenType == DocTokenTypes.RightPartial ? right.Length : 0);

            int l = left != null && left.TokenType == DocTokenTypes.LeftPartial ? left.Length : 0;
            int r = l + unknown.Length;

            string defaultPrev =
                left != null && left.TokenType == DocTokenTypes.Known ? left.StringPart :
                mostLeft != null && mostLeft.TokenType == DocTokenTypes.Known ? mostLeft.StringPart :
                "";

            string defaultLast =
                right != null && right.TokenType == DocTokenTypes.Known ? right.StringPart :
                mostRight != null && mostRight.TokenType == DocTokenTypes.Known ? mostRight.StringPart :
                "";

            Func<string, string> topAndTail = str =>
            {
                return str.Substring(l, r - l);
            };

            Func<State, string, double, bool> tryMove = (State prev, string token, double specialFabness) => 
            {
                bool isPunctionuation = token.Length == 1 && punctuation.Contains(token[0]);
                string addStr = isPunctionuation || prev == null ? token : " " + token;
                int addLen = addStr.Length;

                int newRemaining = prev != null ? prev.Remaining - addLen : spaceSize - addLen;
                int oldPosition = prev != null ? prev.Position : 0;
                int newPosition = oldPosition + addLen;

                // check length
                if (newRemaining < 0)
                    return false;

                // check start
                if (oldPosition < l) // implies left is LeftPartial
                {
                    int s = oldPosition;
                    int e = newPosition > l ? l : newPosition;
                    int len = e - s;
                    if (addStr.Substring(0, len) != left.StringPart.Substring(s, len))
                        return false; // doesn't match LeftPartial
                }

                // check end
                if (newPosition > r) // implies right is RightPartial
                {
                    int s = oldPosition > r ? oldPosition : r;
                    int e = newPosition;
                    int len = e - s;
                    if (addStr.Substring(s - oldPosition, len) != right.StringPart.Substring(s - r, len))
                        return false; // doesn't match RightPartial
                }

                if (newRemaining == 0)
                {
                    // could try to do something here (need to change H)
                }

                string prevToken = prev != null ? prev.Token : defaultPrev;
                bool isLastunctionuation = prevToken.Length == 1 && punctuation.Contains(prevToken[0]);

                if (isLastunctionuation && isPunctionuation) // I hate this check, it's too aggresive to be realistic
                    specialFabness -= 50;

                double fab = fabness(prevToken, token);

                if (fab < 1 && (token == prevToken))
                    fab = -1; // bias against unrecognised repeats

                double newFabness = (prev != null ? prev.Fabness : 0.0)
                    - specialFabness // ... whatever this is
                    - fab * addLen; // how probabilistic

                double h = newFabness; // no h for now

                State newState = new Program.State(newRemaining, newPosition, prev, newFabness, h, token, addStr);

//                Console.WriteLine((prev != null ? prev.Fabness : 0) + "\t" + specialFabness);
//                Console.WriteLine(newFabness + "\t" + h + "\t" + due.Count + "\t" + fab + "*" + addLen + "\t" + newState.FullFilling);

                due.Add(newState);
                return true;
            };

            // just try everything everything
            foreach (string t in knowns)
                tryMove(null, t, 0);

            if (left != null && left.TokenType == DocTokenTypes.LeftPartial)
                tryMove(null, left.StringPart, -1);

            while (!due.Empty)
            {
                State next = due.RemoveMin();

                if (next.Remaining == 0)
                {
                    // we have a winner!!
                    return topAndTail(next.FullFilling);
                }

                // just try everything
                foreach (string t in knowns)
                    tryMove(next, t, 0);
                if (right != null && right.TokenType == DocTokenTypes.RightPartial)
                    tryMove(next, right.StringPart, -5); // big bias
            }

            // make this a tad less stupid, non?
            return Filler.FirstOrDefault(f => f.Length == unknown.Length) ?? new String(' ', unknown.Length); // oh dear...
        }
    }

    //
    // Ultilities
    //

    public class Heap<T> : System.Collections.IEnumerable where T : IComparable<T>
    {
        // arr is treated as offset by 1, all idxes stored need to be -1'd to get index in arr
        private T[] arr;
        private int end = 0;

        private void s(int idx, T val)
        {
            arr[idx - 1] = val;
        }

        private T g(int idx)
        {
            return arr[idx - 1];
        }

        public Heap(int isize)
        {
            if (isize < 1)
                throw new ArgumentException("Cannot be less than 1", "isize");

            arr = new T[isize];
        }

        private int up(int idx)
        {
            return idx / 2;
        }

        private int downLeft(int idx)
        {
            return idx * 2;
        }

        private int downRight(int idx)
        {
            return idx * 2 + 1;
        }

        private void swap(int a, int b)
        {
            T t = g(a);
            s(a, g(b));
            s(b, t);
        }

        private void moveUp(int idx, T t)
        {
        again:
            if (idx == 1)
            {
                s(1, t);
                return; // at end
            }

            int nextUp = up(idx);
            T n = g(nextUp);
            if (n.CompareTo(t) > 0)
            {
                s(idx, n);
                idx = nextUp;
                goto again;
            }
            else
            {
                s(idx, t);
            }
        }

        private void moveDown(int idx, T t)
        {
        again:
            int nextLeft = downLeft(idx);
            int nextRight = downRight(idx);

            if (nextLeft > end)
            {
                s(idx, t);
                return; // at end
            }
            else if (nextLeft == end)
            { // only need to check left
                T l = g(nextLeft);

                if (l.CompareTo(t) < 0)
                {
                    s(idx, l);
                    idx = nextLeft;
                    goto again;
                }
                else
                {
                    s(idx, t);
                }
            }
            else
            { // check both
                T l = g(nextLeft);
                T r = g(nextRight);

                if (l.CompareTo(r) < 0)
                { // left smaller (favour going right if we can)
                    if (l.CompareTo(t) < 0)
                    {
                        s(idx, l);
                        idx = nextLeft;
                        goto again;
                    }
                    else
                    {
                        s(idx, t);
                    }
                }
                else
                { // right smaller or same
                    if (r.CompareTo(t) < 0)
                    {
                        s(idx, r);
                        idx = nextRight;
                        goto again;
                    }
                    else
                    {
                        s(idx, t);
                    }
                }
            }
        }

        public void Clear()
        {
            end = 0;
        }

        public void Trim()
        {
            if (end == 0)
                arr = new T[1]; // don't /ever/ make arr len 0
            else
            {
                T[] narr = new T[end];
                for (int i = 0; i < end; i++)
                    narr[i] = arr[i];
                arr = narr;
            }
        }

        private void doubleSize()
        {
            T[] narr = new T[arr.Length * 2];
            for (int i = 0; i < end; i++)
                narr[i] = arr[i];
            arr = narr;
        }

        public void Add(T item)
        {
            if (end == arr.Length)
            {
                // resize
                doubleSize();
            }

            end++;
            moveUp(end, item);
        }

        public T RemoveMin()
        {
            if (end < 1)
                throw new Exception("No items, mate.");

            T min = g(1);

            end--;
            if (end > 0)
                moveDown(1, g(end + 1));

            return min;
        }

        public bool Empty
        {
            get
            {
                return end == 0;
            }
        }

        public int Count
        {
            get
            {
                return end;
            }
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public IEnumerator<T> GetEnumerator()
        {
            return (IEnumerator<T>)arr.GetEnumerator();
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.