Um das Jahr 1637 schrieb Pierre de Fermat am Rande seines Exemplars der Arithmetica:
It is impossible to separate a cube into two cubes, or a fourth power
into two fourth powers, or in general, any power higher than the
second, into two like powers. I have discovered a truly marvelous
proof of this, which this margin is too narrow to contain.
Leider ist die Marge für uns immer noch zu eng, um den Beweis aufzunehmen. Heute werden wir ein einfaches Programm in die Ränder schreiben, das den Beweis für willkürliche Eingaben bestätigt.
Die Herausforderung
Wir wollen ein Funktionsprogramm, das eine Potenz in zwei Paare von zwei Potenzen aufteilt, die der Potenz so nahe wie möglich kommen. Wir möchten, dass das Programm, das dies tut, so klein wie möglich ist, damit es in die Ränder passt.
Eingang
Die Kraft und die Macht Nummer: c
,x
Einschränkungen: c > 2
undx > 2
Die Eingabe kann über Programmargumente, Funktionsargumente oder vom Benutzer erfolgen.
Ausgabe
Diese exakte Zeichenfolge: „ a^x + b^x < c^x
“ mit a
, b
, c
, und x
mit ihren wörtlichen ganzzahlige Werte ersetzt. a
und b
muss so gewählt werden a^x + b^x < c^x
und keine anderen Werte von a
oder b
würden es näher bringen c^x
. Ebenfalls:a>=b>0
Die Ausgabe kann über den Funktionsrückgabewert stdout erfolgen, in einer Datei gespeichert oder auf dem Bildschirm angezeigt werden.
Beispiele:
> 3 3
2^3 + 2^3 < 3^3
> 4 3
3^3 + 3^3 < 4^3
> 5 3
4^3 + 3^3 < 5^3
> 6 3
5^3 + 4^3 < 6^3
> 7 3
6^3 + 5^3 < 7^3
> 8 3
7^3 + 5^3 < 8^3
Aufgrund der durchschnittlichen Schreibfähigkeiten von Fermat sind nicht druckbare Zeichen nicht zulässig. Das Programm mit der geringsten Anzahl von Zeichen gewinnt.
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N characters
Alternativ können Sie mit Folgendem beginnen:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=57363,OVERRIDE_USER=32700;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
a>=b>0
oder dein erstes Beispiel wäre ungültig. Und warum müssen wir anzeigen,<
wenn Sie es möchten<=
?x
dannc
?Antworten:
Pyth, 38 Bytes
Nimmt Eingaben in diesem Format vor:
quelle
Matlab,
169.153BytesDie Punktzahl kann + -1 sein, abhängig von den ungelösten Problemen in den Kommentaren =)Die Punktzahl bleibt gleich. Dies ist nur eine Bruteforce-Suche nach dem besten(a,b)
Paar.Ziemlich enttäuschend: Ich habe zuerst versucht, mit 'ausgefallenen' Dingen zu experimentieren, und dann festgestellt, dass zwei einfach verschachtelte For-Loops viel kürzer sind ...
Alte Version:
quelle
m = 0
? Dennoch, das wird dich nicht nah an meine Antwort bringen: -PPq=
aus der Funktionsdefinition entfernenq
Variable irgendwo verwendet wird. Sie können ein paar Bytes abschneiden, indem Sie einfach das Semikolonfunction f(c,x)
entfernen.Mathematica,
79 9580 BytesDies könnte auf den Rand passen.
Testen
quelle
CJam,
514643 BytesDieses vollständige Programm liest die Leistung und dann die Basis von STDIN.
Probieren Sie es online im CJam-Interpreter aus .
quelle
Matlab,
141140 BytesDies ist eine Funktion, die das Ergebnis in stdout anzeigt.
Beispiel Verwendung:
Oder versuchen Sie es online in Octave .
Vielen Dank an @flawr für das Entfernen eines Bytes.
quelle
sprintf
weil es so kompliziert schien, obwohl es das eigentlich nicht ist! Und ich habe esbsxfun
noch einmal vergessen , das ist also eine sehr elegante Lösung. Mir gefällt besonders die Art und Weise, wie Sie die einfache / doppelte Indizierung im letzten Argument missbraucht haben =) (Sie könnten dort auch ein Leerzeichen entfernen!)disp
auch, außer in Code Golf :-Pfprintf
anstelle von verwendensprintf
, wird "ans" nicht angezeigt>>
in der gleichen Zeile, was ein bisschen seltsam istfprintf
, müssen jedoch einen manuellen Wagenrücklauf einfügen.CJam,
5351 BytesProbieren Sie es online aus
Das Eingabeformat
x c
ist das Gegenteil der in den Beispielen verwendeten Reihenfolge.Erläuterung:
quelle
R, 139 Zeichen
quelle
Python 2,
182161157 BytesNormalerweise antworte ich in MATLAB, aber da es in dieser Sprache bereits zwei Lösungen gibt, würde ich wahrscheinlich eine andere Sprache ausprobieren :)
Ungolfed Code mit Erklärungen
Beispielläufe
Ich habe dies in IPython ausgeführt:
Probieren Sie es online!
http://ideone.com/tMjGdh
Wenn Sie den Code ausführen möchten, klicken Sie oben auf den Link Bearbeiten und ändern Sie den Parameter STDIN mit zwei durch ein Leerzeichen getrennten Ganzzahlen. Die erste Ganzzahl ist
c
und die nächste istx
. Im Moment wirdc=3
undx=3
und das Ergebnis angezeigt.quelle
Pyth,
535250 BytesProbieren Sie es online aus.
Wird als Eingabe verwendet,
c,x
wobeic
die Zielnummer undx
die Basis ist.quelle
Pyth, 60 Bytes
Die Eingabe erfolgt als c, k
Probieren Sie es online
quelle
C 175 Bytes
Um den Code in den Rand einzufügen, habe ich Zeilenumbrüche eingefügt und ein String-Literal darüber geteilt - der Code, der gezählt / kompiliert werden soll, ist
Funktion
f
nimmtc
undx
als Argumente und erzeugt das Ergebnis aufstdout
.Erläuterung
Dies ist eine iterative Lösung, die die durch definierte Linie im Zickzack darstellt
a^x + b^x = c^x
. Wir beginnen mita=c
undb=1
. Das bringt uns offensichtlich auf die falsche Seite, weilc^x + 1 > c^x
. Wir dekrementieren,a
bis wir die Grenze überschreiten. Wenn wir uns unterhalb der Linie befinden, erhöhenb
wir uns, bis wir sie in die andere Richtung überqueren. Wiederholen , bisb
triffta
, die Erinnerung an die beste LösungA
undB
wie wir gehen. Dann drucken Sie es aus.p
ist eine einfache rekursive Implementierung vona^x
(forx>0
), da C keinen Operator für die Potenzierung bereitstellt.Im Pseudocode:
Einschränkungen
c^x
muss darstellbar sein im Bereich vonint
. Wenn diese Beschränkung zu restriktiv ist, die Unterschriftp
könnte trivially modifiziertlong p(long,int)
oderdouble p(double,int)
undm
undM
anlong
oderdouble
jeweils ohne Änderungf()
.Testprogramm
Dies akzeptiert
c
undx
als Befehlszeilenargumente und gibt das Ergebnis aus.quelle
Haskell, 120 Bytes
Ich glaube, ich habe so viel Golf gespielt, wie ich kann:
Ungolfed:
Verwendung:
quelle
Haskell,
132128 BytesVerwendungsbeispiel:
7 # 3
Gibt die Zeichenfolge zurück"6^3 + 5^3 < 7^3"
.quelle
Perl 5, 119 Bytes
Ein Unterprogramm:
Verwendung als zB:
quelle
Ruby, 125 Bytes
Anonyme Funktion. Erstellt eine Liste von
a
Werten, erstellt darausa,b
Paare, ermittelt dann die maximale Anzahl der Werte, die den Kriterien entsprechen, und gibt von dort eine Zeichenfolge zurück.quelle