Hardcodierung der Bullen und Räuber (Cops)


28

Dies ist eine Herausforderung für . Der Räuberfaden ist da .

Eine interessante Frage zum Nachdenken ist die folgende:

Wenn ich eine Folge von Zahlen habe, wie viele muss ich angeben, bevor klar ist, über welche Folge ich spreche?

Wenn ich zum Beispiel über die positiven ganzen Zahlen in der Reihenfolge ab sprechen möchte , könnte ich sagen , aber ist das wirklich genug?11,2,3,

Ich habe eine Möglichkeit, diese Frage zu beantworten, und als Code-Golfer geht es um Code-Golf. Sie haben genügend Terme einer Sequenz angegeben, wenn der kürzeste Code, der diese Terme erzeugt, alle Terme der Sequenz erzeugt. Wenn wir dies in Form von Code-Golf betrachten, würde dies bedeuten, dass Sie genügend Testfälle bereitgestellt haben, so dass der kürzeste Code, der die Testfälle besteht, die gewünschte Aufgabe erfüllt.

Herausforderung

Diese Herausforderung ist eine Herausforderung für . In welchen Cops Testfälle präsentieren und Räuber einen kürzeren Weg finden müssen, um andere Testfälle als die beabsichtigte Sequenz zu fälschen. Cops werden die folgenden Dinge präsentieren:

  • Ein Teil des Codes, der eine nicht negative Ganzzahl als Eingabe annimmt und eine Ganzzahl als Ausgabe erzeugt. Dieser Code definiert Ihre Sequenz. Ihr Code muss nicht 0 als Eingabe unterstützen, sondern 1 als kleinste Eingabe. Es sollte klar sein, ob dies in Ihrer Antwort der Fall ist.

  • Alle relevanten Plattform- oder Sprachanforderungen, die sich auf die Ausgabe auswirken können, z. B. die Größe von longint.

  • Eine Zahl , zusammen mit den ersten Begriffen der Sequenz, wie vom Code berechnet. Diese dienen als "Testfälle".nn

Sie werden aufgefordert, die Funktionsweise Ihrer Sequenz zu erläutern und OEIS zu verknüpfen, sofern vorhanden. Es ist jedoch Ihr Code, der die Sequenz und nicht die Beschreibung definiert.

Räuber werden ein Programm in derselben Sprache finden, das kürzer ist als das vorgestellte und alle Testfälle besteht (erzeugt die gleiche Ausgabe für die ersten Eingaben wie der Code des Polizisten). Der Code des Räubers muss sich auch in der Ausgabe vom Programm des Polizisten für eine Zahl unterscheiden, die größer als .nn

Polizisten müssen in der Lage sein, ihre eigenen Antworten zu knacken, bevor sie sie einreichen.

Nach einer Woche ein Polizist kann ihren Riss offenbart und markiert ihre Antwort als sicher. Als solche gekennzeichnete Antworten können nicht mehr geknackt werden.

Wertung

Die Antworten der Polizei werden nach der Anzahl der Bytes bewertet, wobei weniger Bytes besser sind. Gebrochene Antworten erzielen eine unendliche Punktzahl.


Es ist klar, dass es Möglichkeiten gibt, ein Problem unmathematisch zu knacken, z. B. alle Testfälle auszudrucken, aber dieses Problem hängt von den von der Polizei bereitgestellten Fällen ab. Sollte es eine Regel geben? Gibt es eine Einschränkung gegen die Berechenbarkeit der Sequenzen oder irgendetwas von Ramsey Theory? (dh müssen Sie in der Lage sein, auf Ihrer Maschine zu knacken?)
theREALyumdub

2
@theReallyumdub Die Frage besagt, dass Sie in der Lage sein müssen, Ihren eigenen Beitrag zu knacken.
Weizen-Assistent

@CatWizard Danke, ich bin weitergegangen und das steht schon auf einem offensichtlichen Meta-Post, es behindert anscheinend einige dieser Jungs. Es liegt also nicht im Geiste des Tags, dass ein Riss mehr als eine Stunde
dauert


Gibt es eine "obwohl theoretisch Ihre Lösung für alle Zahlen in der Praxis funktionieren muss, muss sie nur für ... funktionieren" -Zustand?
user202729

Antworten:


6

cQuents , 4 Bytes ( geknackt )

"::$

Probieren Sie es online!

Hier sind acht ( n=8) Fälle:

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

Code Erklärung:

"      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

Die Sequenz ist also 1,2,3,4,5 ..., sie wird ""so verbunden, dass sie wird 12345 ..., und ::bedeutet, dass sie bis zur Eingabe gedruckt wird.



5

Python 3 , 66 57 Bytes ( geknackt )

von xnor
geknackt auch von Cat Wizard vor einer Bearbeitung geknackt

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

Probieren Sie es online!

Hallo! Hier ist eine Sequenz für zu knacken . Es gibt diese ersten 40 Elemente mit 0-Indexierung, es ist keine OEIS-Sequenzn=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]

Ich habe vergessen, das Leerzeichen zu entfernen. Ich bin noch kein erfahrener Golfer: p Stört es Sie, wenn ich das Problem bearbeite?
crashoz

Sicher, gehen Sie vor. Ich werde meinen Riss entfernen.
Wheat Wizard


5

Python 2 , 44 Bytes ( geknackt )

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

Probieren Sie es online!

Die Primzahlen. Welche Reihenfolge könnte reiner sein? Oder mehr übertrieben ? Ihr Ziel ist es, die ersten 50 Primzahlen für n=1zu produzieren n=50.

Der Code ist ein Wilson-Theorem- Generator, der genau von diesem Tipp kopiert wurde .

Die unterschiedlichen Werte für die alternative Reihenfolge sind nicht auf Maschineneinschränkungen wie Überläufe und Präzision zurückzuführen. Keine Bibliotheken von Drittanbietern.


Gebrochene von Arnauld, @PoonLevi und Herr Xcoder.


Ziemlich sicher , dass Sie bedeutete nicht durch geknackt werden dies ; Geben Sie vielleicht "Python (ohne Bibliotheken von Drittanbietern)" oder "Python (ohne Importe)" oder so etwas an?
Jonathan Allan

@ JonathanAllan Danke, ich habe bearbeitet, dass es keine Bibliotheken von Drittanbietern gibt.
xnor

Ich habe dies noch nicht geknackt (mein derzeit bester Versuch ist 47 Byte oder so), aber ich denke, dass es etwas Interessantes gibt, das an diesen bestimmten Primzahlen zu beachten ist. Für jedes gilt mit i [ 1 , 50 ] N : 2 p i2 ( mod  p i ) . Gleichzeitig gilt dies nicht für eine Zahl, die keine Primzahl ist (in dem oben angegebenen Bereich), aber dies ist der Fallpii[1,50]N2pi2(mod pi)also für höhere Werte. Ich lasse diese Idee hier, damit andere sich mit der genannten Technik an einem Riss versuchen und vielleicht eine bessere Punktzahl erzielen :)
Mr. Xcoder

@ Mr.Xcoder Hier ist mein bester Versuch basierend auf deiner vorgeschlagenen Methode. Es divergiert erfolgreich bei N = 69 und gibt 341 (das erste Fermat-Pseudoprime zur Basis 2 oder die erste Poulet-Zahl) zurück, aber es schlägt auch bei N = 1 fehl. Ich bezweifle, dass ich es selbst reparieren kann, also dachte ich mir, ich teile besser, was ich habe. (Mein bester Fix sind 46 Bytes ...)
Arnauld

1
@Arnauld Ich habe mit dieser Methode eine 44-Byte- Lösung gefunden . Ich kann nicht weiter gehen. Vielleicht kann jemand anderes das herausfinden.
Poon Levi

4

Wolfram Language (Mathematica) , 39 34 Bytes (Sicher)

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

Probieren Sie es online!

Sieht einfach aus, die Lösung sollte schwierig sein.

1-indiziert und . Diese Sequenz ist im OEIS nicht verfügbar.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}

Diese obige Liste ist gleich:

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

Hier ist eine Vorlage zur Überprüfung Ihrer Lösung: Probieren Sie es online aus!

Beabsichtigter Riss

Der Haken dabei ist, dass die Ausgabe mit Ausnahme der ersten drei Terme um 1 zunimmt, wenn die Anzahl der Stellen um 1 zunimmt. Die beabsichtigte Lösung hat etwas mit der Zeichenfolgenkonvertierung zu tun.

Wenn man also die Dokumentation zum Konvertieren zwischen Ausdrücken und Strings liest , findet man die Funktion SpokenString.

Die Lösung ist einfach die Länge der gesprochenen String-Version des Ausdrucks x^nfür verschiedene Eingaben:StringLength@SpokenString[x^#]&


3

Haskell , 29 Bytes (geknackt: 1 , 2 )

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

Probieren Sie es online!

Dies ist A093005 : .ein(n)=nn2

Testfälle für , das heißt :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]

Geplante Lösung (20 Bytes)

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

Probieren Sie es online! Unterscheidet sich bei mit a ( 23 ) = 276 und b ( 23 ) = 253 .n=23ein(23)=276b(23)=253

Diese Funktion ist äquivalent zu . Dank der Obergrenze überlappen sich beide Funktionen für ganzzahlige Argumente im Bereich von 0 bis 22 :b(n)=n len(3n)=nlOG10(1+3n)022

Quelle



@Laikoni, wenn der beabsichtigte Riss kürzer ist, könnte möglicherweise jemand anderes den Räuber von BMO fordern.
Freitag,

@ fəˈnəˈtɛk Danke, mir war diese Regel nicht bekannt.
Laikoni,


2
@ BMO Los geht's :)
Laikoni

2

JavaScript (ES6), 12 Bytes ( geknackt )

Dieser ist ziemlich einfach.

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

Probieren Sie es online!

Dies ist A139275 :

ein(n)=n(8n+1)

0n<9

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

Und gemäß den Herausforderungsregeln muss es darüber hinaus abweichen.


n=>8*n*n+nunterscheidet sich für n=94906273, ist dies ein gültiger Riss?
ngn

@ngn Es sieht für mich nach den Herausforderungsregeln gültig aus, aber vielleicht sollten Sie das OP fragen, ob ein Genauigkeitsverlust als gültige Abweichung gilt? Der beabsichtigte Riss unterscheidet sich jedoch für n=9.
Arnauld

@CatWizard ^
ngn

Ich würde sagen, es ist ein gültiger Riss.
Wheat Wizard

2
geknackt ( |statt +)
ngn


2

> <> , 276 Bytes ( geknackt )

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[}:{]~{<

Probieren Sie es online! Rufe dieses mit -v nauf, um das n-te Element (1-indiziert) zu erhalten.

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[}:{]~{<

Probieren Sie es online! Rufen Sie mit -v nauf, um eine Liste von n-1 Elementen ab 1 zu erhalten

Online Fischdolmetscher

Dies ist ein langer und komplexer OEIS A004000 .

Sei a (n) = k, bilde m durch Umkehren der Ziffern von k, addiere m zu k und sortiere dann die Ziffern der Summe in aufsteigender Reihenfolge, um a (n + 1) zu erhalten.

Beispiel: 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

Wie führt man das Programm aus, um eine einzelne Ausgabe für eine gegebene n(von der Frage geforderte) zu ergeben?
Jonathan Allan

Da es in fish nicht wirklich "Funktionen" gibt, habe ich eine Version hinzugefügt, die Sie aufrufen können, um das n-te zu erhalten (was im Wesentlichen dasselbe ist, da es die vorherigen n-1-Elemente berechnen muss)
crashoz

Noch wichtiger ist, haben Sie einen Riss, der zur gleichen Eingabeindizierung passt, die die einzelne Ausgabe ergibt?
Jonathan Allan

1
1<=n<=34n>34


2

Gelee , 6 Bytes , sicher!

<4+ạ2ȯ

Dies definiert eine mit Nullen indizierte Sequenz, wobei:

ein(n)={1n<32n=3n-2n>3

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

Probieren Sie es online! ( hier ist eine einwertige Version)

Dies ist derzeit nicht in der OEIS (obwohl A34138 als Riss funktionieren wird, wenn kurz genug)

Beabsichtigter Riss

16n
17th1070045392852801514=ein(16)

!ÆsDL


1

JavaScript, 26 Bytes ( geknackt )

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

Ausgabe sind die ersten 6 Elemente mit einer Indexierung von 0 (1,1,2,3,7,22)

(etwas abweichend von dem, was OEIS als aufgeführt hat)

Erstellen Sie einfach eine einfach zu lösende Antwort, um die Dinge anzukurbeln

Probieren Sie es online!



Die Ausgabe Ihres Beispiel-Snippets beginnt bei 1, nicht bei 0?
Paŭlo Ebermann

@ PaŭloEbermann Das wurde behoben
am






0

> <> , 42 Bytes, geknackt

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

Probieren Sie es online!

Sequenz zum Knacken (0-indiziert): 101786, 5844, 19902(nicht bei OEIS).

Beabsichtigte Lösung als Referenz.



Normalerweise sollten die Räuber die Ausgabe hart codieren
Jo King

@JoKing Ihr Riss scheint keine anderen Werte zu produzieren als ich (oder ich habe ihn nicht gründlich genug getestet, um herauszufinden, welche Werte sich unterscheiden), aber das ist wahrscheinlich leicht zu beheben. Die Regeln, die Hardcodierung verbieten, scheinen zwar nichts zu enthalten, aber ich stimme zu, dass sie möglicherweise nicht dem Geist der Herausforderung entsprechen - auf jeden Fall haben Sie gezeigt, dass Hardcodierung (für einen Cop) mit eigenen Risiken verbunden ist.
Aidan F. Pierce

1
Ich habe meine Antwort aktualisiert, um einen anderen Wert für "4
Jo King" zu erhalten.

0

Perl 6 , 53 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der die 0-indizierte Kolakoski-Sequenz zurückgibt ( OEIS A000002 ). Die Lösungen müssen mit den ersten 130 Elementen übereinstimmen, sodass n > 129sie sich für einige von der Kolakoski-Sequenz unterscheiden.


0

Pascal (FPC) , 86 Bytes ( geknackt )

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.

Probieren Sie es 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


Meine ursprüngliche Lösung war

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

aber r_64 hat es noch besser gemacht !


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.