Hardcoding the Cops and Robbers (Cops)


28

To wyzwanie dla . Wątek rabusiów jest tutaj .

Ciekawe pytanie do przemyślenia to:

Jeśli mam ciąg liczb, ile z nich muszę podać, zanim stanie się jasne, o jakiej sekwencji mówię?

Na przykład, jeśli chcę mówić o dodatnich liczbach całkowitych w kolejności od , mógłbym powiedzieć , ale czy to naprawdę wystarczy?11,2,3,

Mam jeden sposób na udzielenie odpowiedzi na to pytanie, a bycie golfistą wymaga od golfa. Podano wystarczającą liczbę sekwencji, jeśli najkrótszy kod, który je tworzy, tworzy wszystkie warunki sekwencji. Jeśli myślimy o tym w kategoriach golfa kodu, oznacza to, że dostarczyłeś wystarczającą liczbę przypadków testowych, tak aby najkrótszy kod, który przejdzie przez przypadki testowe, wykonał pożądane zadanie.

Wyzwanie

To wyzwanie jest wyzwaniem dla . W którym policjanci będą prezentować przypadki testowe, a złodzieje będą musieli znaleźć krótszy sposób na sfałszowanie przypadków testowych niż zamierzona sekwencja. Gliniarze przedstawią następujące rzeczy:

  • Fragment kodu, który przyjmuje nieujemną liczbę całkowitą jako dane wejściowe i tworzy liczbę całkowitą jako dane wyjściowe. Ten kod określi Twoją sekwencję. Twój kod nie musi obsługiwać 0 jako danych wejściowych, zamiast tego wybierz 1 jako najmniejszą wartość wejściową. Powinno być jasne, czy tak jest w twojej odpowiedzi.

  • Wszelkie odpowiednie wymagania dotyczące platformy lub języka, które mogą wpłynąć na wynik, na przykład rozmiar longinta.

  • Liczba wraz z pierwszymi członami sekwencji obliczonymi przez kod. Będą one działać jako „przypadki testowe”.nnn

Zachęcamy do wyjaśnienia, co robi twoja sekwencja i połączenia OEIS, jeśli istnieje, jednak to kod definiuje sekwencję, a nie opis.

Rabusie znajdą program w tym samym języku, który jest krótszy niż ten przedstawiony i przejdzie wszystkie przypadki testowe (produkuje takie same dane wyjściowe dla pierwszych danych wejściowych jak kod gliniarza). Kod rabusia musi również różnić się wyjściem z programu policjanta dla pewnej liczby większej niż .nnn

Gliniarze muszą umieć łamać własne odpowiedzi przed ich przesłaniem.

Po tygodniu policjant może ujawnić swój crack i oznaczyć swoją odpowiedź jako Bezpieczną. Odpowiedzi oznaczone jako takie nie mogą być już łamane.

Punktacja

Odpowiedzi gliniarzy zostaną ocenione według liczby bajtów, przy czym im mniej bajtów, tym lepiej. Pęknięte odpowiedzi dają nieskończony wynik.


Oczywiste jest, że istnieją sposoby nie matematycznego rozwiązania problemu, takie jak po prostu wydrukowanie wszystkich przypadków testowych, ale problem ten jest uzależniony od przypadków dostarczonych przez gliniarzy. Czy powinna istnieć reguła? Czy istnieje ograniczenie możliwości obliczania sekwencji lub czegokolwiek z teorii Ramseya? (tj. czy musisz umieć włamać się na maszynę?)
THEREALyumdub

2
@Reallyumdub pytanie mówi, że musisz być w stanie złamać własne zgłoszenie.
Wheat Wizard

@CatWizard Dzięki, poszedłem naprzód i to już jest na oczywistym meta postu, przeszkadza to niektórym z tych facetów Więc nie jest w duchu tagu, aby pęknięcie trwało godzinę, aby obliczyć czy coś
theREALyumdub


Czy istnieje „chociaż teoretycznie twoje rozwiązanie musi działać dla wszystkich liczb, w praktyce musi działać tylko dla…”?
user202729,

Odpowiedzi:


6

cQuents , 4 bytes ( Cracked )

"::$

Wypróbuj online!

Oto osiem ( n=8) przypadków:

1 1
2 12
3 123
4 1234
5 12345
6 123456
7 1234567
8 12345678

Objaśnienie kodu:

"      Stringify sequence (join on "", remove it and see what happens)
 ::    Given input n, output all items in the sequence up to and including n
   $   Each item in the sequence equals the index

Sekwencja jest 1,2,3,4,5 ...więc połączona, ""więc staje się 12345 ...i ::oznacza, że ​​drukuje do wejścia.



5

Python 3 , 66 57 bajtów ( pęknięty )

cracked by xnor
również cracked przez Cat Wizard przed edycją

def f(n):x=n/10-2;return int(x*60-x**3*10+x**5/2-x**7/84)

Wypróbuj online!

Dzień dobry! Oto sekwencja do złamania dla . Daje te pierwsze 40 elementów z indeksowaniem 0, to nie jest sekwencja OEISn=40

[-54, -56, -58, -59, -59, -59, -59, -57, -55, -53, -50, -46, -43, -38, -33, -28, -23, -17, -11, -5, 0, 5, 11, 17, 23, 28, 33, 38, 43, 46, 50, 53, 55, 57, 59, 59, 59, 59, 58, 56]

Zapomniałem usunąć białe znaki, nie jestem jeszcze golfistą: p Masz coś przeciwko, jeśli edytuję, aby to naprawić?
crashoz

Pewnie, dawaj. Usunę moje pęknięcie.
Wheat Wizard


5

Python 2 , 44 bajty ( pęknięty )

f=lambda n,i=1,p=1:n and-~f(n-p%i,i+1,p*i*i)

Wypróbuj online!

Liczby pierwsze. Jaka sekwencja może być czystsza? Lub więcej przesadzone ? Twoim celem jest stworzenie pierwszych 50 liczb pierwszych do n=1celu n=50.

Kod jest generatorem twierdzenia Wilsona skopiowanym dokładnie z tej wskazówki .

Różne wartości dla sekwencji alternatywnej nie wynikają z ograniczeń maszyny, takich jak przelewy i precyzja. Brak bibliotek stron trzecich.


Cracked przez Arnaulda, @PoonLevi i Mr. Xcodera.


Jestem pewien, że nie chciałeś być przez to złamany ; może podać „Python (bez bibliotek stron trzecich)” lub „Python (bez importów)” czy coś?
Jonathan Allan

@JonathanAllan Dzięki, edytowałem, że nie ma bibliotek stron trzecich.
xnor

pii[1,50]N2pi2(mod pi)więc dla wyższych wartości. Zostawiam ten pomysł tutaj, aby inni mogli spróbować swoich sił w crack przy użyciu wspomnianej techniki i być może uzyskać lepszy wynik :)
Mr. Xcoder

@ Mr.Xcoder Oto moja najlepsza próba oparta na proponowanej metodzie. Pomyślnie rozbiera się przy N = 69, zwracając 341 (pierwszy pseudopierwszy Fermat do podstawy 2 lub pierwszy numer Pouleta), ale również nie udaje się dla N = 1. Wątpię, czy mogę to naprawić samodzielnie, więc pomyślałem, że lepiej podzielę się tym, co mam. (Moja najlepsza poprawka to 46 bajtów ...)
Arnauld,

1
@Arnauld I znaleziono 44 bajtów roztworu za pomocą tej metody. Nie mogę iść dalej. Może ktoś inny będzie w stanie to rozgryźć.
Poon Levi

4

Wolfram Language (Mathematica) , 39 34 bajtów (Bezpieczny)

Check[{1,9,7}[[#]],18+Boole[#>9]]&

Wypróbuj online!

Wygląda na proste, rozwiązanie powinno być trudne.

n=99

{1, 9, 7, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}

Powyższa lista jest równa:

Join[{1, 9, 7}, Table[18, 6], Table[19, 90]]

Oto szablon do sprawdzenia rozwiązania: Wypróbuj online!

Zamierzone pęknięcie

Problem polega na tym, że wynik wzrasta o 1, gdy liczba cyfr wzrasta o 1, z wyjątkiem pierwszych trzech wyrazów; zamierzone rozwiązanie ma coś wspólnego z konwersją ciągów znaków.

Dlatego czytając dokumentację dotyczącą konwersji między wyrażeniami i ciągiem , można znaleźć funkcję SpokenString.

Rozwiązaniem jest po prostu długość wyrażenia mówionego x^ndla różnych danych wejściowych:StringLength@SpokenString[x^#]&


3

Haskell , 29 bajtów (Pęknięty: 1 , 2 )

a n=n*ceiling(realToFrac n/2)

Wypróbuj online!

a(n)=nn2

0n20map a [0..20]

[0,1,2,6,8,15,18,28,32,45,50,66,72,91,98,120,128,153,162,190,200]

Zamierzone rozwiązanie (20 bajtów)

b n=sum$n<$show(3^n)

n=23a(23)=276b(23)=253

b(n)=n len(3n)=nlog10(1+3n)022

źródło



@Laikoni, jeśli zamierzony crack jest krótszy, to ktoś inny może potencjalnie odebrać rabusiom BMO.
fəˈnɛtɪk

@ fəˈnɛtɪk Dzięki, nie byłem świadomy tej zasady.
Laikoni


2
@BMO Proszę bardzo :)
Laikoni

2

JavaScript (ES6), 12 bajtów ( pęknięty )

Ten jest raczej łatwy.

n=>n*(8*n+1)

Wypróbuj online!

To jest A139275 :

a(n)=n(8n+1)

0n<9

0,9,34,75,132,205,294,399,520

I zgodnie z zasadami wyzwania musi się różnić.


n=>8*n*n+nróżni się n=94906273, czy jest to poprawny crack?
ngn

@ngn Wydaje mi się to zgodne z zasadami wyzwania, ale może powinieneś zapytać PO, czy utrata precyzji liczy się jako ważna rozbieżność? Jednak zamierzony crack jest inny n=9.
Arnauld

@CatWizard ^
ngn

Powiedziałbym, że to poprawny crack.
Wheat Wizard

2
cracked ( |zamiast +)
ngn

2

Malbolge, 10 bajtów

ub&;$9]J6

Zauważ, że kod kończy się bajtem 0x14 (kontrola urządzenia 4).

Wypróbuj online!

Sekwencja 0 do indeksowania to crack [9, 19, 29].


2

> <> , 276 bajtów ( pęknięty )

1$1-:?!v$:      1[0$          >:?!va2[$:{:@%:{$-{,]v
       >$n; v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Wypróbuj online! Zadzwoń do tego, -v naby uzyskać n-ty element (1-indeksowany)

1$1-:?!;$::n84*o1[0$          >:?!va2[$:{:@%:{$-{,]v
            v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Wypróbuj online! Zadzwoń z, -v naby uzyskać listę elementów n-1, zaczynając od 1

Internetowy tłumacz ryb

Długi i skomplikowany, to OEIS A004000 .

Niech a (n) = k, utwórz m poprzez odwrócenie cyfr k, dodaj m do k Następnie posortuj cyfry sumy w porządku rosnącym, aby uzyskać (n + 1).

Przykład: 668 -> 668 + 866 = 1534 -> 1345.

n=34

1 2 4 8 16 77 145 668 1345 6677 13444 55778 133345 666677 1333444 5567777 12333445 66666677 133333444 556667777 1233334444 5566667777 12333334444 55666667777 123333334444 556666667777 1233333334444 5566666667777 12333333334444 55666666667777 123333333334444 556666666667777 1233333333334444 5566666666667777

W jaki sposób uruchomić program, aby uzyskać jedno wyjście dla danego n(zgodnie z pytaniem)?
Jonathan Allan

Ponieważ w rybach nie ma tak naprawdę „funkcji”, dodałem wersję, którą można wywołać, aby uzyskać n-ty (który jest w zasadzie taki sam, ponieważ musi on obliczyć poprzednie elementy n-1)
crashoz

Co ważniejsze, czy masz crack, który pasuje do tego samego indeksowania wejściowego, co daje pojedyncze wyjście?
Jonathan Allan

1
1<=n<=34n>34


2

Galaretka , 6 bajtów , Bezpiecznie!

<4+ạ2ȯ

Definiuje to sekwencję o indeksie zerowym , w której:

a(n)={1n<32n=3n2n>3

a(0)a(15)1,1,1,2,2,3,4,5,6,7,8,9,10,11,12,13

Wypróbuj online! ( tutaj jest wersja z jedną wartością)

Obecnie nie ma tego w OEIS (chociaż A34138 będzie działać jako crack, jeśli będzie wystarczająco krótki)

Zamierzone pęknięcie

16n
17th1070045392852801514=a(16)

!ÆsDL


1

JavaScript, 26 bajtów ( pęknięty )

let f=x=>x>1?f(x-1)*f(x-2)+1:1

for (x of [0,1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

OEIS A007660

Wyjście to pierwsze 6 elementów z indeksowaniem 0 (1,1,2,3,7,22)

(nieco przesunięty w stosunku do tego, co ma na liście OEIS)

Wystarczy stworzyć prostą do rozwiązania odpowiedź, aby rozpocząć

Wypróbuj online!



Twój wyjściowy fragment kodu zaczyna się od 1, a nie od 0?
Paŭlo Ebermann

@ PaŭloEbermann Naprawiono to
fəˈnɛtɪk






0

> <> , 42 bajty, pęknięty

i3%0v
642 .
840
789
159
a 1
v<<
n
l
?
\/
;

Wypróbuj online!

Sekwencja do złamania (indeksowana 0): 101786, 5844, 19902(nie w OEIS).

Zamierzone rozwiązanie , w celach informacyjnych.



Zazwyczaj złodzieje powinni mocno kodować wyjście
Jo King

@JoKing Twój crack nie wydaje się generować żadnych wartości innych niż moje (a może nie przetestowałem go wystarczająco dokładnie, aby ustalić, które wartości się różnią), ale prawdopodobnie jest to łatwe do naprawienia. Chociaż w przepisach zabraniających twardego kodowania nie ma nic, zgadzam się, że może nie pasować do ducha wyzwania - w każdym razie wykazałeś, że twarde kodowanie (dla policjanta) wiąże się z własnym ryzykiem.
Aidan F. Pierce

1
Zaktualizowałem swoją odpowiedź, aby uzyskać inną wartość4
Jo King

0

Perl 6 , 53 bajtów

{(1,2,2,{$!=++$;prepend(@,2-$!%2 xx$_).pop}...*)[$_]}

Wypróbuj online!

Anonimowy blok kodu, który zwraca zindeksowaną sekwencję Kolakoski ( OEIS A000002 ). Wymagane są rozwiązania, aby dopasować pierwsze 130 elementów, aby dla niektórych n > 129różniły się od sekwencji Kolakoskiego.


0

Pascal (FPC) , 86 bajtów ( pęknięty )

var n:word;begin read(n);write(n div 2+n div 4+n div 8+n div 16+n div 32+n div 64)end.

Wypróbuj online!

n=120

0   0   1   1   3   3   4   4   7   7   8   8  10  10  11  11  15  15  16  16  18  18  19  19  22  22  23  23  25  25  26  26  31  31  32  32  34  34  35  35  38  38  39  39  41  41  42  42  46  46  47  47  49  49  50  50  53  53  54  54  56  56  57  57  63  63  64  64  66  66  67  67  70  70  71  71  73  73  74  74  78  78  79  79  81  81  82  82  85  85  86  86  88  88  89  89  94  94  95  95  97  97  98  98 101 101 102 102 104 104 105 105 109 109 110 110 112 112 113 113 116


Moje oryginalne rozwiązanie było

var n,i,s:word;begin read(n);i:=2;repeat s:=s+n div i;i:=i*2until i>n;write(s)end.

ale r_64 uczynił to jeszcze lepszym !


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.