Ein Counterstring ist eine Art selbstbeschreibender Testdaten, die beim Testen von Software verwendet werden. Ich bin mir nicht sicher, ob es tatsächlich von James Bach erfunden wurde , aber ich weiß es von dort.
Die Idee ist wie folgt: Die Testdaten enthalten viele Sternchen ( *
). Die Zahl vor dem Sternchen gibt an, wie lange die Testdaten zu diesem Zeitpunkt sind. Wenn Sie eine Position in den Testdaten kennen müssen, die kein Sternchen ist, suchen Sie das letzte Sternchen, sehen Sie sich die Nummer zuvor an und fügen Sie die Anzahl der folgenden Ziffern hinzu.
Die Sequenz beginnt wie folgt:
2*4*6*8*11*14*17*20*23*
^
Wie Sie sehen können, befindet sich das markierte Sternchen an Position 14.
Wenn eine Datei wie folgt abgeschnitten wird
[...]2045*20
dann können Sie ableiten, dass es irgendwo ein Limit von 2047 Zeichen gibt (2045, wo das Sternchen plus 2 für 2
und ist 0
).
Es ist Ihre Aufgabe, das kürzeste Programm (dies ist Code-Golf ) zu erstellen, das eine beliebige lange Testzeichenfolge dieses Formats ausgibt (std :: out oder file oder was auch immer). Die Länge in Zeichen wird als Argument angegeben. Das Programm muss bis zu 2 GB Testdaten unterstützen (Eingabewert 2147483647 Zeichen).
"Gefährliche" Positionen in der 2-GB-Datei:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Dies sollte die Frage von @Leaky Nun beantworten, wenn eine Entscheidung zwischen 995 * 999 * und 995 * 1000 * oder ähnlichem getroffen wird: Nein.
Das Ende der 2-GB-Datei mit dem Eingabewert 2147483647 lautet:
2147483640*2147483
995*999*
und995*1000*
oder so etwas entscheiden müssten ?Antworten:
Haskell,
6058 BytesAls Funktion erhalten wir:
Volles Programm,
7270 BytesDies gibt eine unendliche Gegenzeichenfolge an STDOUT aus:
Die Eingabe der Länge erfordert 20 zusätzliche Bytes:
Dies funktioniert bis zu Ihrer ungefähren RAM-Größe, da Haskell standardmäßig numerische Integraltypen verwendet
Integer
.quelle
Pyth,
25171514 BytesProbieren Sie es online aus.
Die Länge wird über STDIN übernommen.
quelle
Python 2,
7472666461 BytesNimmt eine ganze Zahl n und gibt einen Gegenstring der Länge n aus.
Programmversion, 69 Bytes:
Nimmt eine ganze Zahl n von stdin und druckt eine Gegenzeichenfolge der Länge n.
Kürzere, aber nur fast funktionierende alternative Version:
quelle
PowerShell v5, 97 Byte
Nimmt die Eingabe als Befehlszeilenargument
$n
und legt den Helfer fest, mit$l
dem wir unsere Ganzzahllänge verfolgen. Dann schleifen wir von0
bis$n
. Bei jeder Iteration erhöhen wir uns$i
um die.length
aus der Zeichenfolge$i
und einem Sternchen. Wenn sich dann das.length
von$i
geändert hat (z. B. haben wir von 2 auf 3 Stellen gewechselt),$l
erhöhen wir sowohl die Hilfslängenvariable als auch$i
(um die zusätzliche Ziffer zu berücksichtigen). Wir verwenden dann denadd-content
Befehl , um mit oNewLine"$i*"
an die Datei.\o
im aktuellen Verzeichnis-n
anzuhängen.NB
-noNewLine
Parameter in dieser Version endlich hinzugefügt wurde.[int]
nach[double]
(nein, ich weiß nicht, warum es nicht zu geht[long]
), sodass Eingaben bis zu und größer als2147483648
problemlos problemlos verarbeitet werden können. Theoretisch werden Eingaben bis zu ungefähr1.79769313486232E+308
(Maximalwert von[double]
) verarbeitet, bevor Sie sich beschweren, aber ich erwarte, dass sich die Festplatte füllt, bevor dies geschieht. ;-);10
dies beispielsweise ausgegeben2*4*6*8*11*
, da11
der erste$i
Wert größer als die Eingabe ist.PowerShell v2 +, ebenfalls 97 Byte (nicht konkurrierend)
Anstatt an eine Datei zu senden, werden die Schleifeniterationen gekapselt und dann
-join
zu einer Zeichenfolge zusammengefasst. Dies ermöglicht es, für Versionen vor Version 5 zu arbeiten. Da .NET jedoch a[string]
mit einem Konstruktor wie definiertString(char c,Int32 length)
, erfüllt diese Version nicht die maximale Eingabeanforderung, da die Ausgabezeichenfolge überläuft und barf.Möglicherweise möchten Sie auch keine ~ 2 GB-Zeichenfolge in Ihrer Pipeline haben. Ich sag bloß'.
quelle
[double]
s sind 64-Bit. Zum Beispiel zeigt der Lauffor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
einen stetigen Verlauf von,$i
aber dieType
Änderungen bei2147483648
bisdouble
. Ich bin mir sicher, dass es irgendwann nicht mehr funktioniert, wahrscheinlich mit einer Genauigkeit von ca. 15 Stellen oder wenn die.ToString
Verwendung beginnte
. Das[double]::MaxValue
war eher ein Wegwerfwitz als eine ernsthafte Obergrenze.Python 3,
12611499 BytesEine Funktion, die über ein Argument der Zeichenanzahl, bei der die Zeichenfolge abgeschnitten werden soll, Eingaben vornimmt und in STDOUT druckt.
Wie es funktioniert
Die Differenz zwischen den Zahlen in der Zeichenfolge beträgt anfänglich 2. Jedes Mal, wenn eine Größenordnung übergeben wird, wird diese Differenz um 1 erhöht. Dies kann erreicht werden, indem die Differenz zwischen der Anzahl der Ziffern der aktuellen Nummer und der Anzahl der Ziffern der aktuellen Nummer zur Differenz addiert wird, die nur bei Bedarf 1 beträgt. Die Funktion wird einfach wiederholt, während die Länge der Zeichenfolge kleiner als die Eingabe ist, an die Zeichenfolge angehängt und die Differenz und Anzahl nach Bedarf aktualisiert und dann vor dem Drucken abgeschnitten.
Probieren Sie es auf Ideone
Unendliche Ausgabeversion, 69 Bytes
quelle
R, 92 Bytes
Beispielausgabe:
quelle
Gelee ,
221918 BytesProbieren Sie es online aus!
Suchen Sie die ersten
n
Zahlen in der Zeichenfolge und fügen Sie die Liste mit einem Sternchen hinzu. Dies wird immer länger sein, alsn
es OP in den Kommentaren erlaubt hat.Das Programm aktualisiert das Register selektiv mit der aktuellen Nummer in der Sequenz in der
#
Schleife mit¹©=¡
. Ich hatte gehofft, dass dies kürzer sein könnte, indem ich zum Beispiel©
nach dem zweitenµ
setze, aber leider funktioniert das nicht und ich konnte nichts kürzeres herausfinden.quelle