Counterstring jest pewnego rodzaju danych testowych własny opisując, który jest używany w testowaniu oprogramowania. Nie jestem pewien, czy rzeczywiście został wymyślony przez Jamesa Bacha , ale wiem to od tego momentu.
Pomysł jest następujący: dane testowe zawierają wiele gwiazdek ( *
). Liczba przed gwiazdką informuje, jak długo trwają dane testowe. Jeśli chcesz poznać pozycję w danych testowych, która nie jest gwiazdką, znajdź ostatnią gwiazdkę, spójrz na poprzednią liczbę i dodaj liczbę kolejnych cyfr.
Sekwencja zaczyna się w następujący sposób:
2*4*6*8*11*14*17*20*23*
^
Jak widać, zaznaczona gwiazdka znajduje się w pozycji 14.
Jeśli plik zostanie obcięty w następujący sposób
[...]2045*20
wtedy możesz wywnioskować, że istnieje gdzieś limit 2047 znaków (2045, gdzie gwiazdka plus 2 dla 2
i 0
).
Twoim zadaniem jest stworzyć najkrótszy (to jest kod-golf ) program, który wypisuje (std :: out lub plik lub cokolwiek) dowolny długi ciąg testowy tego formatu. Długość znaków jest podana jako argument. Program obsługuje do 2 GB danych testowych (wartość wejściowa 2147483647 znaków).
„Niebezpieczne” pozycje w pliku 2 GB:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
To powinno odpowiedzieć na pytanie @Leaky Nun , jeśli istnieje decyzja o podjęciu decyzji między 995 * 999 * a 995 * 1000 * lub podobnym: nie.
Koniec pliku 2 GB z wartością wejściową 2147483647 to:
2147483640*2147483
995*999*
i995*1000*
czy coś takiego?Odpowiedzi:
Haskell,
6058 bajtówW funkcji otrzymujemy:
Pełny program,
7270 bajtówPowoduje to wygenerowanie nieskończonego ciągu przeciwnego do STDOUT:
Podanie długości wymaga 20 dodatkowych bajtów:
Działa to do twojego przybliżonego rozmiaru pamięci RAM, ponieważ Haskell domyślnie ustawia typy całek numerycznych na
Integer
.źródło
Pyth,
25171514 bajtówWypróbuj online.
Długość jest pobierana za pośrednictwem STDIN.
źródło
Python 2,
7472666461 BajtówPobiera liczbę całkowitą n i wyprowadza kontrstrun długości n.
wersja programu, 69 bajtów:
Pobiera liczbę całkowitą n ze standardowego wejścia i wypisuje strunę o długości n.
Krótsza, ale prawie działająca, wersja alternatywna:
źródło
PowerShell v5, 97 bajtów
Pobiera dane wejściowe jako argument wiersza poleceń
$n
, ustawia pomocnika,$l
którego używamy do śledzenia naszej liczby całkowitej. Następnie zapętlamy od0
do$n
. Każda iteracja, zwiększamy$i
przez.length
łańcucha utworzonego z$i
i oznaczone gwiazdką. Następnie, jeżeli.length
z$i
zmienione (np przeprowadziliśmy się z 2 cyfr 3 cyfry), zwiększamy zarówno pomocnik$l
zmienną ength i$i
(aby uwzględnić dodatkową cyfrą). Następnie używamyadd-content
polecenia, aby dołączyć"$i*"
do pliku.\o
w bieżącym katalogu za pomocą-n
oNewLine.NB
-noNewLine
parametr został ostatecznie dodany w tej wersji.[int]
na[double]
(nie, nie wiem, dlaczego nie idzie do[long]
), więc poprawnie obsłuży dane wejściowe do i większe niż2147483648
, bez problemu. Teoretycznie obsłuży dane wejściowe do około1.79769313486232E+308
(maksymalna wartość[double]
) przed złożeniem skargi, ale oczekuję, że dysk zapełni się, zanim to nastąpi. ;-)10
zostanie to wygenerowane2*4*6*8*11*
, ponieważ11
pierwsza$i
wartość jest większa niż wartość wejściowa.PowerShell v2 +, również 97 bajtów (niekonkurujące)
Zamiast wysyłać do pliku, hermetyzuje iteracje pętli, a następnie
-join
s je razem w ciąg. Pozwala to na pracę z wersjami wcześniejszymi niż v5. Ponieważ jednak .NET definiuje[string]
konstruktor, taki jakString(char c,Int32 length)
ta, ta wersja nie spełnia maksymalnego wymagania wejściowego, ponieważ łańcuch wyjściowy przepełni się i pojawi się błąd.Ponadto możesz nie chcieć, aby ciąg ~ 2 GB unosił się w rurociągu. Tylko mówię'.
źródło
[double]
s są 64-bitowe. Na przykład, biegfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
pokaże stały postęp,$i
aleType
zmiany2147483648
dodouble
. Jestem pewien, że w pewnym momencie przestanie działać, prawdopodobnie około 15 cyfr precyzji lub kiedy.ToString
zacznie się używaće
. To[double]::MaxValue
był bardziej żartobliwy żart niż poważna górna granica.Python 3,
12611499 bajtówFunkcja, która pobiera dane wejściowe za pomocą argumentu liczby znaków, przy których skraca ciąg znaków, i drukuje do STDOUT.
Jak to działa
Różnica między liczbami w łańcuchu początkowo wynosi 2. Za każdym razem, gdy przekazywany jest rząd wielkości, różnica ta jest zwiększana o 1; można to osiągnąć, biorąc różnicę między liczbą cyfr bieżącego numeru a liczbą cyfr bieżącego numeru dodaną do różnicy, która wynosi 1 tylko w razie potrzeby. Funkcja po prostu zapętla się, gdy długość ciągu jest mniejsza niż wartość wejściowa, dołącza się do ciągu i aktualizuje różnicę i liczbę zgodnie z wymaganiami, a następnie obcina przed drukowaniem.
Wypróbuj na Ideone
Nieskończona wersja wyjściowa, 69 bajtów
źródło
R, 92 bajty
Przykładowe dane wyjściowe:
źródło
Galaretka ,
221918 bajtówWypróbuj online!
Znajdź pierwsze
n
liczby w ciągu, a następnie dołącz do listy gwiazdką. To zawsze będzie dłuższe niżn
było to dozwolone przez OP w komentarzach.Program selektywnie aktualizuje rejestr o bieżący numer w sekwencji w
#
pętli z¹©=¡
. Miałem nadzieję, że może to być krótsze©
po drugimµ
, ale niestety to nie działa i nie mogłem wymyślić nic krótszego.źródło