Erstellen Sie den Satz neu

12

Diese Herausforderung besteht aus zwei Teilen. Der Gewinner ist die Lösung mit der niedrigsten Gesamtbytezahl. Für beide Herausforderungen muss dieselbe Sprache verwendet werden.

Teil 1:

Schreiben Sie eine Funktion oder ein Programm, das einen Satz mit nur gültigen Wörtern als Eingabe verwendet und eine Liste der verwendeten Zeichen, der Häufigkeit, mit der jeder Buchstabe verwendet wird, und der Anzahl der Buchstaben in jedem der Wörter im ursprünglichen Satz ausgibt. Die Ausgabe dieses Programms muss eine gültige Eingabe für das nächste Programm sein (genau so, wie sie ausgegeben wird).

Ich werde weiter unten Beispiele und detaillierte Regeln hinzufügen.

Teil 2:

Schreiben Sie eine Funktion oder ein Programm, das die Ausgabe des ersten Programms als Eingabe verwendet, diese Liste englischer Wörter verwendet und einen Satz mit den Informationen aus der Ausgabe erstellt. Der Satz muss nicht mit dem ursprünglichen Satz identisch sein.

Mehr Informationen. Regeln und Einschränkungen:

Teil 1:

  • Die erste Eingabe kann in jedem geeigneten Format erfolgen, mit oder ohne Anführungszeichen, als Funktionsargument oder von STDIN, mit oder ohne Klammern usw.
  • Der Eingabesatz enthält keine Interpunktion oder Sonderzeichen, außer einem Punkt am Ende. Mit Ausnahme des Punktsymbols befinden sich alle Zeichen in der Eingabe in der Wortliste.
  • Der erste Buchstabe des Satzes wird in Großbuchstaben geschrieben, der Rest in Kleinbuchstaben.
  • Die Ausgabe von Teil 2 muss mit dem gleichen Großbuchstaben wie der ursprüngliche Satz beginnen. Es wird daher nicht empfohlen, die Eingabe in Kleinbuchstaben umzuwandeln (aber OK).
  • Die Ausgabe kann in jedem geeigneten Format erfolgen:
    • Es muss möglich sein, die Ausgabe direkt in das nächste Programm / die nächste Funktion einzufügen
    • Beim Kopieren und Einfügen können keine Änderungen vorgenommen werden. Die gesamte Ausgabe muss als Ganzes kopiert und eingefügt werden, nicht in Teilen.
    • Sie können beispielsweise ein Histogramm aller Buchstaben des Alphabets oder nur der verwendeten Buchstaben ausgeben (im Allgemeinen alles, was zum Abschließen von Teil 2 erforderlich ist).
    • Sie können keine Liste von Zeichen ausgeben, bei denen mehrere Vorkommen wiederholt werden. Zum Beispiel The queuekann eine Ausgabe nicht nachgeben: Teeehquu (3,5)sollte es so etwas wie: Tehqu, (1 3 1 1 2),(3 5).

Teil 2:

  • Das Programm / die Funktion muss die Eingabe genau wie in Teil 1 akzeptieren (eine Ausnahme, siehe Kommentar unten zum Eingeben des Dateinamens).
    • Wenn umgebende Klammern, Anführungszeichen oder Ähnliches erforderlich sind, um die Eingabe zu analysieren, müssen diese Teil der Ausgabe von Teil 1 sein.
  • Die Wortliste finden Sie hier.
    • Die Wortliste kann entweder lokal gespeichert w.txtoder über die URL abgerufen werden. Die URL zählt nur 5 Bytes, sodass Sie keinen URL-Shortener benötigen.
    • Wenn das Programm eine Datei nicht ohne das Lesen der Namen als eine Eingabe von STDIN (ich glaube , das öffnen kann heißt der Fall für Pyth war zumindest), dann kann der Dateiname als separate Eingabeargument genommen werden.
  • Die Ausgabe darf nur ein Satz (Liste der gültigen Wörter) sein, der mit einem Punkt und einer optionalen Newline endet.
    • Die Ausgabe muss Wörter mit der gleichen Anzahl von Buchstaben enthalten wie der ursprüngliche Satz in Teil 1 (in der richtigen Reihenfolge).
    • Alle Buchstaben, die im ursprünglichen Satz verwendet wurden, müssen in der neuen Ausgabe verwendet werden.
    • Der Satz muss mit dem gleichen Großbuchstaben wie der ursprüngliche Eingabesatz beginnen und mit einem Punkt enden.

Beide Teile:

  • Die Ausführung beider Teile sollte nicht länger als 2 Minuten dauern (das zufällige Heraussuchen von Wörtern, bis eine Lösung gefunden wurde, wird nicht akzeptiert).

Mit den oben aufgeführten Regeln sollte es eine faire Chance geben, dass genau derselbe Satz wiedergegeben wird, dies ist jedoch keine Voraussetzung.

Beispiele:

In den folgenden Beispielen werden einige verschiedene Eingabe- und Ausgabeformate gezeigt. Viele weitere werden akzeptiert.

Teil 1:

Eingang:

Zulus win.

Ausgabetyp 1:

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

Ausgabetyp 2:

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

Ausgabetyp 3:

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

Teil 2:

Eingabe: Eine genaue Kopie der Ausgabe von Teil 1. Ausgabe:

Zulus win.

Beachten Sie, dass andere Wortkombinationen akzeptiert werden, solange sie mit a beginnen Z und das erste Wort 5 Buchstaben und das zweite 3 Buchstaben hat.

Der kürzeste Code in Bytes gewinnt.

Stewie Griffin
quelle
Hier ist das Commit: github.com/isaacg1/pyth/commit/…
PurkkaKoodari
@ LegionMammal978: Ja, Sie können dies unter folgenden Einschränkungen tun: Die Ausgabe von f1, in die eingefügt wird, f2muss alle in der Challenge angegebenen Daten enthalten. In der Ausgabe von können keine zusätzlichen Daten enthalten sein f1. Es können keine Daten "gespeichert" werden f1, um Informationen verfügbar zu machen, wenn Sie diese von aufrufen f2. f1Pro Aufruf kann nur eine Zeichenfolge als Eingabe verwendet werden.
Stewie Griffin
1
Die Chance, den gleichen Satz mit mehr als 3 Wörtern herauszubekommen, ist meiner Meinung nach ziemlich schlecht
Eumel
Im Allgemeinen ja, aber es gibt viele Fälle, in denen Sie wahrscheinlich den gleichen Satz herausfinden. Wenn Ihre Oma es satt hat, Ihren alten Pullover zu überarbeiten, könnte sie sagen: "Aufhören zu stricken". Ich habe nicht nachgeprüft, aber ich denke, deine Oma wird nach Teil 2 immer noch aufhören. Auch Kombinationen längerer Wörter könnten den gleichen Satz zurückgeben.
Stewie Griffin
1
@StewieGriffin Du könntest leicht "Wig ... wows" bekommen. zurück mit diesem Beispielsatz.
question_asker

Antworten:

5

LabVIEW, 167 LabVIEW-Grundelemente

Zunächst einmal habe ich keine zwei separaten Programme erstellt, da Labview den Datenfluss übernimmt, so dass es wirklich keine Notwendigkeit gibt.

Speichert das Histogramm mit dem ersten Element = ASCII-Code des ersten Buchstabens Rest von 1-26 nach Betrag. Länge wird einfach in einem Array gespeichert.

Das erste Wort hat 3 Schecks, Anfangsbuchstaben, Länge und verfügbare Buchstaben im Histogramm. Die erste Buchstabenprüfung stoppt nach dem ersten Wort.

Ich überprüfe das Histogramm, indem ich es für jeden Buchstaben dekrementiere und prüfe, ob es unter 0 fallen würde.

Wenn ich mein n-tes Wort gefunden habe und es keine Wörter gibt, die aus den verbleibenden Buchstaben zusammengesetzt werden können, lösche ich Wörter aus dem Dikton und wiederhole das n-te Wort usw., bis ich eine Lösung gefunden habe.

Dies könnte bei Sätzen, die es gibt, funktionieren oder auch nicht, da das Berechnen ewig dauern würde (mein Beispiel hat bereits einige Sekunden gedauert).

Was ich versucht habe

In: Zulus win.
Out: Zulus win.

In: Dovecot flagships oleander.
Out: Dolphin advocates forelegs.

In: Abash abel mammal test.
Out: Amass abbe hamlet malt.

Eumel
quelle
3

Python 2.7, 353 Bytes

Leider kann ich es nicht mit der eigentlichen w.txt-Datei ATM testen, da QPython für Android offenbar nicht mit Datei-E / A umgehen kann. Es funktionierte jedoch mit Daten, die ich kopiert und eingefügt habe.

Teil 1, 76 Bytes

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

Im: 'Hi there.'

Aus: {'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)

also eine Liste mit:

  • eine Hashmap mit dem Histogramm

  • eine Liste der Buchstaben zählt

Teil 2, 277 Bytes

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()+'.'

Ich bin wirklich froh, dass ich es geschafft habe, es zu 100% funktional zu machen. Ich bin mir nicht sicher, ob das beim eigentlichen Golfen hilft, aber ich habe mit Sicherheit den Teil der Verschleierung richtig verstanden: D Hier ist eine menschlichere Version von pt. 2 (genau der gleiche Ablauf, aber mit Variablennamen):

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()+'.'
uryga
quelle
3

Perl, 516 504 Bytes

beinhaltet 2x +1 für -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}

Erfordert w.txtein Unix- Format ( \nZeilenende). Verwendet cat, um die Datei zu lesen; Wechseln Sie zu typefür Windows.
Speichern Sie den Oneliner oben in 534.plund führen Sie ihn als ausecho Test. | perl -p 534.pl .

Ziemlich groß, aber es ist ein Anfang - viele Möglichkeiten zum Golfen, aber ich wollte es nur posten, um die LabVIEW-Antwort weniger einsam zu machen ;-). Ich habe die Optimierungen für die Ausführung in Sekundenbruchteilen ausgelassen und mehr als 30 Bytes eingespart.


Erstes Snippet (73 Bytes):

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

Es erzeugt ein Histogramm und die Wortlänge in einem kompakten Format. Für die Eingabe Zulus win.wird eine Ausgabe vom Typ 2 ohne das erzeugt (,), was hier nicht erforderlich ist:

s1 l1 u2 Z1 w1 i1 n1 5 3

Hier ist es, 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
}

Zweites Snippet (441 Bytes)

Dieser Hauptteil beschäftigt sich mit E / A und die spezielle Behandlung des ersten Briefes, unter Verwendung von Subroutinen gund hdass sind unten aufgeführt.

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

Diese rekursive Funktion erstellt eine Kopie des Histogramms, eine Kopie der verbleibenden Wortanzahl und des aktuellen Wortes. Wenn das Array mit der Wortlänge leer ist, wird true zurückgegeben. Andernfalls wird die Histogrammzahl für die Buchstaben im angegebenen Wort dekrementiert, die nächste Wortlänge verwendet und eine Liste geeigneter Wörter aus der Wortliste gefunden. Für jedes passende Wort wird es wiederholt.

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

Und schließlich erhält diese Unterroutine ein Wort und das Satzhistogramm. Es berechnet ein neues Histogramm für das Wort und prüft, ob nicht alle Buchstaben öfter vorkommen, als es das Satzhistogramm zulässt.

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

Sie können die ungolfed Snippets ( sub i/o/g/h) in eine einzelne Datei einfügen und den folgenden Testcode anhängen.

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.

  • update 504 : speichere 12 bytes indem du a substrund einen parameter für eliminierst sub g.
Kenney
quelle
Ich sehe, meine Beispiele zu stehlen! Nur ein Scherz die rasults sind urkomisch XD
Eumel
@Eumel Ja, sie waren anders als deine, also habe ich sie aufgenommen :-)
Kenney