In meiner vorherigen Code-Abfrage habe ich Sie gebeten, eine Funktion zu schreiben, die Ihnen mitteilt, welche der Zeilen entfernt wurden.
Die Anweisungen lauteten:
Schreiben Sie eine Funktion, die fünf Zeilen enthält.
Wenn Sie die Funktion so ausführen, wie sie ist, sollte sie 0 zurückgeben.
Wenn Sie eine der fünf Zeilen entfernen und die Funktion ausführen, sollte sie Ihnen mitteilen, welche der Zeilen entfernt wurde (wenn Sie beispielsweise die letzte Zeile entfernen, sollte sie 5 zurückgeben).
Lassen Sie uns jetzt etwas versuchen, das ein bisschen schwieriger ist.
Befolgen Sie die gleichen Regeln wie oben, aber dieses Mal sollte die Funktion ein Array zurückgeben, das Ihnen mitteilt, welche ZWEI Zeilen entfernt wurden.
Wenn ich zum Beispiel die Zeilen 1 und 5 entferne, sollte der Rückgabewert [1,5] sein, und wenn ich die Zeilen 3 und 4 entferne, sollte der Rückgabewert [3,4] sein.
Wenn keine Zeilen entfernt werden, sollte die Funktion wieder 0 zurückgeben. Bonuspunkte, wenn Sie auch den Fall der Entfernung einer Zeile behandeln können, dies ist jedoch nicht unbedingt erforderlich.
Können Sie Hilfsfunktionen nutzen? Ja, aber nur wenn Sie müssen. Eine einzige eigenständige Funktion, die dies ermöglicht, ist das Ideal.
Wie bei der letzten Herausforderung gewinnt die am höchsten bewertete Lösung. Ich werde den Gewinner in einer Woche ermitteln oder früher, wenn innerhalb von 24 Stunden keine neuen Einsendungen eingegangen sind.
quelle
Antworten:
Perl
Dies funktioniert tatsächlich für eine beliebige Anzahl entfernter Zeilen (sofern dies nicht alle Zeilen sind) und kann trivial auf mehr als 5 Zeilen erweitert werden. Es werden keine Hilfsfunktionen verwendet und es wird sogar nur eine Anweisung pro Zeile verwendet. Es beruht auf der Tatsache, dass
return
der Rückgabewert einer Perl-Funktion ohne explizite Anweisung der Wert der letzten Anweisung in der Perl-Funktion ist.Beachten Sie, dass dieser Code (im Listenkontext) eine leere Liste anstelle der Nummer 0 zurückgibt, wenn keine Zeilen gelöscht wurden. Dies könnte behoben werden (zB durch Anhängen von "
@a ? @a : 0;
" an die letzte Zeile), würde aber den Code hässlicher machen. Auf jeden Fall in skalaren Kontext es tut die Anzahl der gelöschten Zeilen zurückgeben, die 0 sein wird , wenn keine Linien entfernt wurden. ;-)quelle
Rubin
Ähnlich wie die Perl-Version, jedoch in Ruby. Ich gebe 0 zurück, wenn keine Zeilen wie gewünscht gelöscht wurden, aber ich bin damit einverstanden, dass der Code hässlicher wird und als Rückgabewert keinen Sinn ergibt.
Wenn ein leeres Array als Rückgabewert akzeptiert wird, wenn keine Zeilen gelöscht werden, sieht der Code folgendermaßen aus:
Beide Methoden funktionieren für eine beliebige Anzahl von Zeilen, die zwischen 0 und 5 gelöscht wurden.
quelle
JavaScript, 152 Zeichen Golf
Golf gespielt:
In sich geschlossen (aber hässlich):
Nutzt grundsätzlich die Funktion aus,
toString
indem jede Zeile nummeriert wird. Beachten Sie, dass Sie die Zeile aus diesem Grund tatsächlich entfernen müssen (das Auskommentieren funktioniert nicht).Dies funktioniert tatsächlich für beliebig viele entfernte Zeilen ! Es wird ein Array der entfernten Zeilen oder ein leeres Array zurückgegeben, wenn keines entfernt wurde. (Ich könnte das leicht ändern, um Null zurückzugeben (durch Ersetzen
return ra
durchreturn ra || 0
), aber ich mag die leere Array-Lösung, da sie in der realen Welt nützlicher wäre.)Wenn Sie beispielsweise die erste Zeile
[1]
entfernen, wird alles außer der ersten Zeile zurückgegeben[2,3,4,5]
. (Natürlich funktioniert es nicht, wenn Sie alle Zeilen entfernen;-)
)quelle
Rubin
So funktioniert das: Meine Idee war: Erstellen Sie ein Array und entfernen Sie in jeder Zeile einen bestimmten Wert. In der ersten Zeile habe ich also das Array
[ 1, 2, 3, 4, 5]
, wobei das Element1
entfernt wurde.a
Entfernen Sie in der zweiten Zeile, falls bereits definiert, das Element2
. Andernfalls erstellen Sie ein neues Array, wobei das Element2
entfernt wird. Gehen Sie für Zeile 3 genauso vor. In Zeile 4 können Sie sicher sein, dass bereits ein Array erstellt wurde. Entfernen Sie also einfach das Element4
. Entfernen Sie in Zeile 5 zuerst das Element5
und geben Sie zurück, wenna
es sich dann um ein leeres Array handelt0
. Andernfalls kehren Sie zurücka
.quelle
Python
Gibt 0 zurück, wenn keine Zeile entfernt wurde, andernfalls werden die entfernten Zeilen zurückgegeben. Sie können 1 bis 5 Zeilen mit Ausnahme der 0. und 6. Zeile entfernen ;-).
quelle
JavaScript, in sich geschlossen, funktioniert für 0, 1, 2 entfernte Zeilen (
607315186 Zeichen)→ Live-Demo ←
Missbrauch von JS variablem Heben und globaler Leckage, wie bei der anderen Herausforderung :)
mit dem Array [1,2,3,4,5] als Parameter aufgerufen werden.
315 Zeichen
mit einem leeren Array als Parameter aufgerufen werden.
Nicht-Golf-Version
(funktioniert auch für 3 und 4 Zeilen entfernt):
mit einem leeren Array als Parameter aufgerufen werden.
quelle
JavaScript:
Geige
quelle
Javascript
Nenne es wie du willst, aber ich finde es hübsch .
Lässt Sie wissen, welche Zeilen entfernt wurden (1 oder mehr), oder 0, wenn keine Zeilen entfernt wurden. Alle 5 Zeilen können entfernt werden.
BEARBEITEN:
Da ich darauf hingewiesen wurde, dass mein Code möglicherweise aus 6 Zeilen besteht und gegen die Regeln verstößt, habe ich ihn folgendermaßen angepasst:
Gleiches gilt - es wird ein Array von entfernten Zeilen zurückgegeben, das von 1 - Alle oder 0 reicht, falls keine vorhanden sind.
quelle
function(){
und}
(und eventuelle Hilfsfunktionen ). Zählen Sie die Anzahl der Zeilen.Common Lisp
Es funktioniert zum Entfernen von 1-4 Zeilen. Wenn Sie alle Zeilen entfernen, wird dasselbe zurückgegeben, als wenn Sie keine entfernen.
NB: Endeklammern in einer eigenen Zeile zu haben, wird als schlechter Stil angesehen, aber da es andere Sprachen gibt
end
und}
ich davon ausgehe, dass dies zulässig ist.quelle
Python
Es funktioniert für alle Zeilen - aber nur, wenn zwei gelöscht werden. Wenn nur eine Zeile gelöscht wird, werden die gelöschte Zeile und Zeile 5 gedruckt. Wenn zu viele Zeilen gelöscht werden, wird nichts gedruckt.
Dies verwendet eine Hilfsfunktion, da das del-Schlüsselwort nicht in einer Zeile mit einem; verwendet werden kann (soweit ich weiß).
Grundsätzlich löscht sich jede Zeile in dem Array, das im Konstruktor deklariert ist. Wenn genügend Zeilen gelöscht wurden, wird das Array gedruckt.
Diese Funktion verfehlt die Spezifikation auf zwei Arten:
print
undreturn
ist austauschbarquelle
print ''
Generiert dies jedoch kein zusätzliches Newline-Zeichen?Déjà Vu
Funktioniert zum Entfernen einer beliebigen Anzahl von Zeilen (solange Sie mindestens eine Zeile belassen)
quelle
R
Ich habe eine andere Version in R, die ich für besser halte (aber eine Hilfsfunktion verwendet):
Oder Sie können die Verwendung der Hilfsfunktion vermeiden, indem Sie sie als Standardargument definieren (funktioniert identisch, ist aber weniger lesbar - es wird jedoch keine "separat definierte" Hilfsfunktion verwendet):
Beide
reportRemovedLines()
undfunnyVersion()
arbeiten mit einer beliebigen Anzahl entfernter Zeilen - es sei denn, Sie entfernen alle Zeilen (in diesem Fall werden sie zurückgegebenNULL
). Sie tatsächlich zurückgeben die Zeilennummern, nicht nur sie drucken - wie in R, der Wert des letzten Ausdrucks innerhalb einer Funktion ausgewertet wird automatisch zurückgegeben werden.Wie funktioniert es? Der Trick liegt in der
trick
Funktion, die alle Objekte aus ihrer "übergeordneten Umgebung" (dh der Umgebung der Funktion, die sie aufruft) entnimmt, ihre Werte in einem Vektor zusammenfügt und zurückgibt, welche Werte von 1 bis 5 nicht dargestellt sind.quelle
JavaScript (136/166 Zeichen)
Eine kleinere Version mit einigen am Anfang deklarierten Werten:
Eine eigenständige Version (Sie müssen nichts übergeben - das Argument b ist vorhanden, damit ich überprüfen kann, ob b mit definiert ist.
||
)Ja, beide haben
return
Aussagen, aber das ist nur fair, wenn ich mit Sprachen mit impliziter Rendite konkurriere.quelle
R
Eine einfache Version (nicht narrensicher, da Sie eine Fehlermeldung erhalten, wenn Sie Zeile 5 entfernen):
Und eine narrensichere Version:
Es funktioniert mit beliebig vielen entfernten Zeilen (außer wenn Sie alle Zeilen entfernen) und kann problemlos auf mehr als 5 Zeilen erweitert werden. Wenn Sie es "wie es ist" ausführen, wird es zurückgegeben,
integer(0)
was konzeptionell dem Zurückgeben von "nur " ähnelt0
. Das Zurückgeben einer tatsächlichen 0 würde sie hässlicher und länger machen, wäre aber nicht kompliziert.Zum Schluss eine Version mit Magie:
Hilfsfunktion:
Die eigentliche Funktion:
quelle
C ++
Verwendung: Rufen Sie die Funktion mit i auf und verwenden Sie func2, um zu verstehen, welche Funktion aussagt.
Wenn Sie die Zeile int arr [] = {0,0} in int arr [] = {0,0,0,0,0} ändern, funktioniert dies auch für alle fünf Zeilen automatisch benutze ich einfach ein Bit einer Variablen als Flag für jede Zeile ...
quelle
function
sechs Zeilen, nicht fünf?