Utwórz nieograniczoną liczbę pasów

11

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 2i 0).

Twoim zadaniem jest stworzyć najkrótszy (to jest ) 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
Thomas Weller
źródło
Jeśli się nie zatrzyma, to jak to przetestujesz?
Leaky Nun
2
Czy ta długość jest w znakach?
TheBikingViking
4
Można udowodnić, że nigdy nie będzie musiał wybrać pomiędzy 995*999*i 995*1000*czy coś takiego?
Leaky Nun
1
W przyszłości skorzystaj z piaskownicy, aby wyeliminować załamania w wyzwaniach przed ich opublikowaniem.
Mego
1
@ThomasWeller Jeśli możemy stworzyć dłuższy wynik, czy możemy nie brać żadnych danych wejściowych i po prostu produkować ciąg 2 GB?
xnor

Odpowiedzi:

4

Haskell, 60 58 bajtów

W funkcji otrzymujemy:

f=length.show
iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

Pełny program, 72 70 bajtów

Powoduje to wygenerowanie nieskończonego ciągu przeciwnego do STDOUT:

f=length.show
main=putStr$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

Podanie długości wymaga 20 dodatkowych bajtów:

main=interact(\j->take(read j)$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show)

Działa to do twojego przybliżonego rozmiaru pamięci RAM, ponieważ Haskell domyślnie ustawia typy całek numerycznych na Integer.

ThreeFx
źródło
3

Pyth, 25 17 15 14 bajtów

<uu++GlN\*k)Qk

Wypróbuj online.

Długość jest pobierana za pośrednictwem STDIN.

PurkkaKoodari
źródło
2

Python 2, 74 72 66 64 61 Bajtów

f=lambda n,i=2:"%d*"%i+f(n,len(`i+2`)-~i)[:n-2]if i<n*2else""

Pobiera liczbę całkowitą n i wyprowadza kontrstrun długości n.

wersja programu, 69 bajtów:

s,n,i="",input(),2
while i<2*n:s+="%d*"%i;i+=len(`i+2`)+1
print s[:n]

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:

n,i=input(),2
while i<2*n:print("%d*"%i)[:n-i],;i+=len(str(i+2))+1
KarlKastor
źródło
1

PowerShell v5, 97 bajtów

param($n)$l=1;for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};ac .\o "$i*" -n}

Pobiera dane wejściowe jako argument wiersza poleceń $n, ustawia pomocnika, $lktórego używamy do śledzenia naszej liczby całkowitej. Następnie zapętlamy od 0do $n. Każda iteracja, zwiększamy $iprzez .lengthłańcucha utworzonego z $ii oznaczone gwiazdką. Następnie, jeżeli .lengthz $izmienione (np przeprowadziliśmy się z 2 cyfr 3 cyfry), zwiększamy zarówno pomocnik $lzmienną ength i $i(aby uwzględnić dodatkową cyfrą). Następnie używamy add-contentpolecenia, aby dołączyć "$i*"do pliku .\ow bieżącym katalogu za pomocą -noNewLine.

NB

  • Wymaga v5, ponieważ -noNewLineparametr został ostatecznie dodany w tej wersji.
  • PowerShell automatycznie skonwertuje w górę z [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ło 1.79769313486232E+308(maksymalna wartość [double]) przed złożeniem skargi, ale oczekuję, że dysk zapełni się, zanim to nastąpi. ;-)
  • Ze względu na warunkowe sprawdzanie pętli, plik ten wyśle ​​do pliku co najmniej długość wejściową. Na przykład dla danych wejściowych 10zostanie to wygenerowane 2*4*6*8*11*, ponieważ 11pierwsza $iwartość jest większa niż wartość wejściowa.

PowerShell v2 +, również 97 bajtów (niekonkurujące)

param($n)$l=1;-join(&{for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};"$i*"}})

Zamiast wysyłać do pliku, hermetyzuje iteracje pętli, a następnie -joins je razem w ciąg. Pozwala to na pracę z wersjami wcześniejszymi niż v5. Ponieważ jednak .NET definiuje [string]konstruktor, taki jak String(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ę'.

AdmBorkBork
źródło
1.79769313486232E + 308 na pewno nie zadziała, ponieważ dodanie małych liczb do liczby zmiennoprzecinkowej nie zmieni już wartości. Zobacz stackoverflow.com/questions/12596695/... Więc zgaduję, że przestaje działać, kiedy zostanie „ulepszony” do podwojenia
Thomas Weller
@ThomasWeller PowerShell [double]s są 64-bitowe. Na przykład, bieg for($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}pokaże stały postęp, $iale Typezmiany 2147483648do double. Jestem pewien, że w pewnym momencie przestanie działać, prawdopodobnie około 15 cyfr precyzji lub kiedy .ToStringzacznie się używać e. To [double]::MaxValuebył bardziej żartobliwy żart niż poważna górna granica.
AdmBorkBork
1

Python 3, 126 114 99 bajtów

def f(x,s=''):
 i=t=2
 while len(s)<x:i+=len(str(t+i))-len(str(t));s+=str(t)+'*';t+=i
 print(s[:x])

Funkcja, 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

s=i=2
while 1:i+=len(str(s+i))-len(str(s));print(end=str(s)+'*');s+=i
TheBikingViking
źródło
1

R, 92 bajty

    N=nchar;f=function(n){z=0;y="";while(z<n){z=z+N(z+N(z)+1)+1;y=paste0(y,z,"*")};strtrim(y,n)}

Przykładowe dane wyjściowe:

f (103) [1] "2 * 4 * 6 * 8 * 11 * 14 * 17 * 20 * 23 * 26 * 29 * 32 * 35 * 38 * 41 * 44 * 47 * 50 * 53 * 56 * 59 * 62 * 65 * 68 * 71 * 74 * 77 * 80 * 83 * 86 * 89 * 92 * 95 * 98 * 102 * 1 "

JDL
źródło
0

Galaretka , 22 19 18 bajtów

2µṾL+®‘¹©=¡=µ³#j”*

Wypróbuj online!

Znajdź pierwsze nliczby w ciągu, a następnie dołącz do listy gwiazdką. To zawsze będzie dłuższe niż nbył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.

dylnan
źródło