Ein Buch zu lesen ist einfach, aber ein Buch zu drucken kann etwas schwierig sein. Beim Drucken einer Broschüre müssen die Seiten auf dem Drucker in einer bestimmten Reihenfolge angeordnet sein, damit sie von links nach rechts gelesen werden können. Hierfür wird ein Muster wie das folgende verwendet
n, 1, 2, n-1, n-2, 3, 4, n-3, n-4, 5, 6, n-5, n-6, 7, 8, n-7, n-8, 9, 10, n-9, n-10, 11, 12, n-11…
Testfälle
4-seitiges Booklet: 4, 1, 2, 3
8-seitiges Booklet: 8,1,2,7,6,3,4,5
12-seitiges Booklet: 12,1,2,11,10,3,4,9,8,5,6,7
16-seitiges Booklet: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9
20-seitiges Booklet: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11
Aufgabe
Ihre Aufgabe ist es, bei einer Ganzzahl n
, die ein Vielfaches von 4 ist, ein Array von Zahlen anzuzeigen, mit denen Sie ein Buch mit n
Seiten drucken können .
Hinweis: Solange die Ausgabe die richtigen Zahlen generiert, unabhängig davon, ob sie durch Leerzeichen, Kommas, Bindestriche oder Klammern getrennt sind, kann jede Methode zum Erreichen einer Lösung verwendet werden
Dies ist eine Code-Golf- Frage, daher werden die Antworten in Bytes gewertet, wobei die wenigsten Bytes gewinnen.
Antworten:
05AB1E ,
987 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
4945 Bytes4 Bytes mit Hilfe von @RickHitchcock gespeichert
Demo
Code-Snippet anzeigen
Nicht rekursiv, 51 Bytes
Demo
Code-Snippet anzeigen
quelle
f=(n,a=1)=>n<a+3?[]:[n,a,a+1,n-1,...f(n-2,a+2)]
n<a
ist eigentlich genug, das sind also 4 Bytes gespart. Vielen Dank!Python 2,
999388585655 BytesProbieren Sie es online!
-6 Bytes durch Entfernen nicht benötigter Einrückungen, danke Oliver Ni
-5 Bytes durch Ändern der Bedingung, danke Luis Mendo
-30 Bytes durch Optimierung der Druckanweisungen, danke Arnold Palmer
-2 Bytes durch Setzen der Schleife in eine Zeile, danke nedla2004
-1 Byte durch Zauberkunst, danke Mr. Xcoder
quelle
lambda
(obwohl dies möglicherweise anders ist, um eine separate Antwort zu rechtfertigen).f-i+1,i,i+1,f-i
in jeder Schleife gedruckt, anstatt den letzten Wert bedingt zu drucken. Dadurch konnte auch die Initiale entfernt werdenprint f,
.Python 2 , 46 Bytes
Probieren Sie es online!
Erzeugt den Bereich
[1..n]
und springt von vorne und hinten in das sich wiederholende Musterback, front, front, back, ...
Python 2 , 49 Bytes
Probieren Sie es online!
Erzeugt die ersten 4 Elemente und fährt dann rekursiv fort, wobei der obere Wert
n
um 2 verringert und der untere Wertk
um 2 erhöht wird.Python 2 , 49 Bytes
Probieren Sie es online!
Erzeugt direkt den
i
'ten Wert der Liste, wobei-i%4/2
als Boolescher Wert verwendet wird, ob der niedrigere oder der höhere Wert verwendet werden soll.quelle
Python 3 ,
686362 Bytes−5 Bytes dank @notjagan (Leerzeichen entfernen und
[*...]
statt verwendenlist()
).−1 Byte dank @ovs (
*1
anstelle von[:]
) .Probieren Sie es online!
quelle
r*1
anstattr[:]
für -1 byte`MATL ,
191710 BytesProbieren Sie es online!
Erläuterung
quelle
Jelly ,
1211 BytesVerbessert auf 11 Bytes, "Kombinatorische Methoden":
Probieren Sie es online!
Wie?
Dies verwendet Permutationsberechnungen und das Fakultätszahlensystem:
Unverbesserte 12 Bytes, "Knitting Patterns":
Probieren Sie es online!
Wie?
Dies ist der einfache Ansatz, der zwei Stränge erzeugt, diese verschachtelt und dann die losen Enden schneidet:
quelle
Oktave ,
4336 BytesEin Port dieser Antwort in C (gcc) ist hier zu finden .
Erläuterung
k=1:2:n/2
: Erzeugt eine lineare Sequenz von 1 bisn/2
in Schritten von 2. Beachten Sie, dass dies sofort im nächsten Schritt verwendet wird.[n-k+1;k;k+1;n-k]
: Erstellt eine Matrix mit 4 Zeilen, sodass die erste Zeile die Sequenzn, n-2, n-4...
bis erstelltn-(n/2)+2
, die zweite Zeile1, 3, 5...
bisn/2 - 1
, die dritte Zeile die zweite Zeile, die um 1 erhöht wird, und die vierte Zeile die erste Zeile, die um 1 erhöht wird.[n-k+1;k;k+1;n-k](:)'
: Hiermit werden alle Spalten dieser Matrix von links nach rechts gestapelt, um einen einzelnen Spaltenvektor zu erstellen, und wir transponieren ihn zur einfachen Anzeige in einen Zeilenvektor. Wenn Sie die Spalten auf diese Weise genau stapeln, wird die gewünschte Reihenfolge erstellt.Beachten Sie, dass dies eine anonyme Funktion ist, sodass Sie sie vor der Verwendung einer Variablen zuweisen oder die integrierte
ans
Variable verwenden können, die nach dem Erstellen der Funktion erstellt wird.Probieren Sie es online!
quelle
input
und die Syntax ein bisschen mehr missbraucht, indem ich den Basis-Inkrementalvektor beim Erstellen der ersten Zeile gespeichert und die Eingaben
von der tatsächlichen anonymen Funktionseingabe selbst übernommen habe, damit ich sie jetzt einpassen kann eine Aussage. Vielen Dank!R , 48 Bytes (verbessert)
Vielen Dank an @ Giuseppe für -7 Bytes!
Der Trick ist, dass
x=1:n;x[order(x%%2)]
entsprichtorder(1:n%%2)
.Probieren Sie es online!
R , 55 Bytes (original)
Golf gespielt
Ungolfed mit Kommentaren
Lesen Sie
n
aus Standard.Definieren Sie
x
als Folge von Seiten von 1 bisn
.Bestellen Sie Seiten so, dass gerade Seiten vor ungeraden Seiten stehen.
Ordnen Sie die Seiten in absteigender Reihenfolge in Bezug auf die Mitte des von berechneten Buches an
n/2+.5
.Beispiel mit 8 Seiten:
Probieren Sie es online!
quelle
(1:n)[order(1:n%%2)]
der gleiche ist wieorder(1:n%%2)
Mathematica,
545345 BytesErläuterung
quelle
Python 2 ,
6463 Bytes-1 Byte dank ovs!
Probieren Sie es online!
quelle
n-i-1
kann seinn+~i
Haskell, 42 Bytes
Probieren Sie es online!
Ein Byte länger:
Haskell, 43 Bytes
quelle
Java 8,
8472 Bytesoder
-12 Bytes dank @TheLethalCoders Kommentar zur C # Antwort.
Alte Antwort (84 Bytes):
Erläuterung:
Probieren Sie es hier aus.
quelle
Perl 5 , 47 + 1 (-n) = 48 Bytes
Probieren Sie es online!
quelle
Schnelle 3 , 74 Bytes
Probieren Sie es online!
Schnelle 3 , 60 Bytes
Aus irgendeinem Grund funktioniert dies in keiner Online-Umgebung, die ich bisher ausprobiert habe. Wenn Sie es testen möchten, stellen Sie es
var g=
davor und rufen Sie es mitprint(g(12))
in Xcode (Playgrounds) auf .Hier ist ein Bild, nachdem ich es auf einem Xcode-Spielplatz, Version 8.3.1 (Running Swift 3.1), ausgeführt habe:
quelle
QBIC , 25 Bytes
Obwohl die Eingabe% 4 ist, basiert der tatsächliche Rhythmus auf 2.
Erläuterung
quelle
C (gcc) , 66 Bytes
Ein Port meiner Octave-Antwort auf C (gcc):
Probieren Sie es online!
quelle
cQuents , 21 Bytes
Probieren Sie es online!
Erläuterung
quelle
R ,
6460 BytesVerheerend überfordert von Djhurio ! Seine Antwort ist ziemlich elegant.
Ein Port von Rayryengs Octave-Antwort .
Probieren Sie es online!
ursprüngliche Lösung (64 Bytes):
Rekursive Funktion.
Probieren Sie es online!
quelle
Bash + Perl + Groff + Psutils, 48 Bytes
Zeigt die Ausgabe an
stderr
. Die Ausgabe enthält nachgestellten Müll.Anwendungsbeispiel:
quelle
Pyth ,
21 bis20 BytesTest Suite.
Wenn die Ausgabe als verschachtelte Liste zulässig ist:
Pyth ,
20 bis19 BytesTest Suite.
Erläuterung
quelle
Ruby , 40 Bytes
Probieren Sie es online!
quelle
C #, 107 Bytes
Behalten Sie zwei Zähler bei, einer beginnend bei 1, einer bei p. Schreiben Sie in jeder Schleifeniteration vier Elemente und erhöhen oder verringern Sie die Zähler nach jedem Eintrag. Wenn sich die Zähler in der Mitte treffen, hören Sie auf.
quelle
p=>{var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;};
mit derSystem.Func<int, int[]> f =
nicht einbezogen in die bytecount haben. Sie können auch einen Link zu TIO hinzufügen, was sehr nützlich ist, wenn Sie versuchen, Ihren Code selbst auszuprobieren!q
auf0
und erhöhen Sie vorq<p
->++q<p
und entfernen Sie dann das zweite Nachinkrement, um ein Byte zu speichern. Verschieben Sie die beiden nachfolgenden Schleifenanweisungen in die letzte Stufe der for-Schleife, damit Sie die geschweiften Klammern entfernen können.p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}
. TIO.Haskell , 58 Bytes
Probieren Sie es online!
quelle
Pyth ,
272423 Bytes-3 Bytes durch Drucken durch anstatt am Ende.
-1 Danke an Herrn Xcoder
Probieren Sie es online!
Oder im Online Compiler / Executor
Dies ist mein erstes echtes Programm in Pyth, daher gibt es wahrscheinlich bessere Methoden, die ich nicht kenne.
Erläuterung
quelle
FN
mitV
für -1 ByteC ++ (GCC) ,
898468 ByteWie unbenanntes generisches Lambda.
n
ist #pages (% 4 == 0) undC
ist ein Referenzparameter für das Ergebnis, wie ein leerer Containervector<int>
(wird nurpush_back
benötigt).vorherige Lösung:
Probieren Sie es online!
Leicht ungolfed:
vorherige Lösung leicht ungolfed :
Es wurde recht einfach entwickelt und es gibt sicher einige kleinere Optimierungen in der Arithmetik.
Verwendungszweck:
Druckvariante, 77 Bytes veraltet
Wenn Sie darauf bestehen, die Werte auszudrucken, gibt es diese Lösung:
Wo
o
ist dein Wunschstd::ostream
, wiestd::cout
Verwendung (wenn 2. Lambda zugeordnet wurde
g
):quelle
Common Lisp, 79 Bytes
Probieren Sie es online!
quelle
Lua, 94 Bytes
Für diese Herausforderung habe ich mir 2 verschiedene Methoden ausgedacht, die beide 94 Bytes lang sind.
Methode 1:
Kommentierter Code:
Methode 2:
Diese Methode ähnelt der ersten Methode, jedoch wird statt string.format () eine verkettete Zeichenfolge zurückgegeben.
In beiden Methoden habe ich das Konzept von n verwendet und ich komme näher zusammen
quelle
PHP, 51 + 1 Bytes
druckt Seitenzahlen, die durch einen Unterstrich mit einem nachgestellten Trennzeichen getrennt sind.
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle
J , 22 Bytes
Probieren Sie es online!
Erläuterung
quelle