Reihenfolge der Olympischen Ringe

18

Herausforderung:

Bei einer gegebenen Index-Ganzzahl geben Sie nentweder das n'te Element in dieser Sequenz oder die Sequenz bis einschließlich Index aus n:

25,25,7,28,29,20,21,22,23,14,35,26,7,28,29,20,16,29,12,15,28,21,14,17,30,13,16,29,12,15,28,21,10,6,12,18,15,11,7,13,19,17,13,9,15,21,18,14,10,16,22,19,15,11,17,23,20,16,12,18,24,21,17,13,19,25,23,19,15,21,27,24,20,16,22,28,25,21,17,23,29,16,13,9,15,21,18,14,10,16,22,20,16,12,18,24,21,17,13,19

Wie funktioniert diese Sequenz?

HINWEIS: In dieser Erklärung ist der Index n1-indiziert.
Setzen Sie die Zahlen 1durch xauf zwei Linien der Länge n*6 - 1, wo xauf der aktuellen Iteration und die Länge der Zahlen hängt verwendet, und dann addieren Sie die Ziffern der n‚th / am weitesten rechts stehenden Olympischen Ringen dieser beiden Linien.

Die erste Zahl in der Sequenz wird wie folgt berechnet:

The length of the lines are 5 (because 1*6 - 1 = 5):
12345
67891(0)

Then leave the digits in an Olympic Rings pattern:
1 3 5
 7 9

And sum them:
1+3+5+7+9 = 25

So n=1ergibt sich 25.

Die zweite Zahl in der Sequenz wird wie folgt berechnet:

The length of the lines are 11 (because 2*6 - 1 = 11):
12345678910
11121314151(6)

Then leave the digits in the second/right-most Olympic Rings pattern:
      7 9 0 
       4 5

And sum them:
7+9+0+4+5 = 25

So n=2ergibt sich 25.

Die dritte Zahl in der Folge berechnet sich wie folgt:

The length of the lines are 17 (because 3*6 - 1 = 17):
12345678910111213
14151617181920212(2)

Then leave the digits in the third/right-most Olympic Rings pattern:
            1 2 3
             0 1

And sum them:
1+2+3+0+1 = 7

So n=3ergibt sich 7.

etc.

Herausforderungsregeln:

  • Wenn Sie das n'te Element in der Sequenz ausgeben , können Sie die Eingabe als 0-indiziert statt als 1-indiziert annehmen. Beachten Sie jedoch, dass die Berechnungen von n*6 - 1dann zu (n+1)*6 - 1oder werden (n+1)*5 + n.
  • Einzelne Zahlen mit mehr als einer Ziffer können am Ende der ersten Zeile aufgeteilt werden, wenn die Länge n*5 + n-1erreicht ist. Daher ist es möglich, dass eine Zahl mit zwei oder mehr Ziffern teilweise der hintere Teil von Zeile 1 und teilweise der hintere Teil von Zeile 1 ist führender Teil der Linie 2.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

Hier ist eine Auswahl der Testfälle von 1 bis 1.000. Sie können also eines davon auswählen.

Einige zusätzliche höhere Testfälle:

1010:   24
1011:   24
2500:   19
5000:   23
7500:   8
10000:  8
100000: 25
Kevin Cruijssen
quelle
1*5 + 1-1 = 5? Sollte es nicht sein 1*5 + 5 - 1 = 9?
NieDzejkob
@NieDzejkob Nein, n=1so n*5 + n-1wird 1*5 + 1-1, was wiederum ist 5 - 0 = 5.
Kevin Cruijssen
ist nicht n * 5 + n - 1gleich n * 6 - 1?
Brian H.
@BrianH. Du hast recht, es ist in der Tat. Bemerkte das auch, nachdem er Martins Retina-Antwort gesehen hatte. Ich habe die Herausforderungsbeschreibung bearbeitet, um diese kürzere Formel zu verwenden.
Kevin Cruijssen

Antworten:

4

Schale , 16 Bytes

ΣĊ2ṁ↑_5↑2CṁdN←*6

Probieren Sie es online!

-3 Bytes dank H.PWiz .

(Gehetzte) Erklärung:

ΣĊ2ṁ↑_5↑2CṁdN←*6⁰
Σ                 Sum
 Ċ2                Drop every second element
   ṁ↑_5             Map "take last 5 elements", then concatenate
       ↑2            Take first 2 elements
         C            Cut x into sublists of length y
          ṁdN          [1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3,...] (x)
             ←         Decrement (y)
              *6        Multiply with 6
                ⁰        First argument
Erik der Outgolfer
quelle
@ KevinCruijssen Seltsam, weil ich gerade einen hinzufügen wollte. Allerdings empfehle ich sowieso nicht, eine Antwort zu akzeptieren. ;-)
Erik der Outgolfer
@ KevinCruijssen Ich habe eine übereilte Erklärung hinzugefügt, obwohl es nicht sehr gut atm ...
Erik the Outgolfer
Gut genug für mich, akzeptiert. Und ich persönlich nehme Herausforderungen am liebsten an, obwohl das eigentlich nicht nötig ist. Wenn jemand eine kürzere Antwort schreibt als Sie, werde ich sie natürlich wieder ändern.
Kevin Cruijssen
@KevinCruijssen Das Hauptziel dagegen ist nicht, was passiert, wenn eine kürzere Antwort veröffentlicht wird, sondern dass jemand entmutigt wird, überhaupt eine andere Antwort zu veröffentlichen. Wie auch immer, dein Anruf.
Erik der Outgolfer
5

Retina , 70 68 62 Bytes

.+
10**
.
$.>`
~(`.+
6*$+*
)`.(.+)
L`.{$.1}
%,-6`.

,2,9`.
*
_

Probieren Sie es online!

Erläuterung

Nennen wir den Eingang n und verwenden wir ihn 3als Beispiel.

.+
10**

Das 10**ist die Kurzform, bei 10*$&*_der die Eingabe durch eine Zeichenfolge mit 10n Unterstrichen ersetzt wird.

.
$.>`

Jetzt ersetzen wir jeden Unterstrich durch die Länge des Strings bis einschließlich dieses Unterstrichs. Dies ergibt also nur die Zahl von 1 bis 10n, die alle zusammen verkettet sind ( 10n reicht immer aus, um zwei Zeilen der erforderlichen Länge auszufüllen).

~(`.+
6*$+*

Eval! In dieser und der nächsten Phase wird der Quellcode eines anderen Programms generiert, das dann für diese Zeichenfolge verketteter Ganzzahlen ausgeführt wird.

Um dieses Programm zu generieren, werden in dieser Phase zunächst die Ganzzahlen durch eine Zeichenfolge mit 6n Unterstrichen ersetzt ( $+bezieht sich auf die ursprüngliche Eingabe des Programms).

)`.(.+)
L`.{$.1}

Ersetzen dann die Unterstrichen mit L`.{…}, wo ist 6n-1 (die Länge der Leitungen wir suchen at). Wir haben also einen regulären Ausdruck generiert, dessen Quantifizierer von der ursprünglichen Eingabe abhängt.

Wenn dieses Programm ausgewertet wird, stimmt es mit Teilen der Länge 6n-1 überein , von denen es mindestens zwei geben wird. Für unsere Beispieleingabe erhalten 3wir:

12345678910111213
14151617181920212
22324252627282930

Jetzt müssen wir nur noch die relevanten Ziffern extrahieren.

%,-6`.

Zunächst %entfernen wir in jeder Zeile ( ) alle bis auf die letzten fünf Ziffern ( ,-6). Das gibt uns

11213
20212
82930

Endlich:

,2,9`.
*

Wir erweitern jede zweite Ziffer ( 2) in den ersten zehn ( 9dies ist 0-basiert) in unary. Das sind die Positionen auf den Olympischen Ringen.

_

Und wir zählen die Anzahl der resultierenden Unterstriche, um sie zu summieren und das Ergebnis in Dezimalzahlen umzuwandeln.

Martin Ender
quelle
59 Bytes Ein bisschen chaotisch
H.PWiz
@ H.PWiz Scheint nicht für Eingaben zu funktionieren 1.
Martin Ender
Oh ja, das wird der-7
H.PWiz
3

Japt , 33 32 30 29 28 27 Bytes

Oh, das ist nicht hübsch!

Gibt den n- ten Term 1-indiziert aus.

*6É
*2 õ ¬òU mt5n)¬¬ë2 ¯5 x

Versuch es


Erläuterung

                         :Implicit input of integer U           :e.g., 3
*6É    
*6                       :Input times 6                         :18
  É                      :Subtract 1                            :17
   \n                    :Assign the above to variable U

*2 õ ¬òU mt5n)¬¬ë2 ¯5 x
*2 õ                     :[1,U*2]                               :[1,2,3,...,33,34]
     ¬                   :Join to a string                      :"123...3334"
      òU                 :Partitions of length U                :["123...13","1415...212","22324...30","31323334"]
         m               :Map
          t5n)           :  Get last 5 characters               :["11213","20212","82930","23334"]
              ¬          :Join to a string                      :"11213202128293023334"
               ¬         :Split to an array                     :["1","1","2","1","3","2","0","2","1","2","8","2","9","3","0"],["2","3","3","3","4"]]
                ë2       :Get every second element              :["1","2","3","0","1","8","9","0","3","3"]
                   ¯5    :Get first 5 elements                  :["1","2","3","0","1"]
                      x  :Reduce by addition                    :7
                         :Implicit output of result
Zottelig
quelle
2

Python 3, 129 123 Bytes

p=lambda r,x='',i=1:sum(map(int,str(x[6*r-2]+x[6*r-4]+x[6*r-6]+x[12*r-4]+x[12*r-6])))if len(x)>12*r-2else p(r,x+str(i),i+1)

Probieren Sie es online

Das ist zwar ziemlich durcheinander, funktioniert aber.

Manish Kundu
quelle
2

05AB1E , 22 21 20 Bytes

6*<xLJsô2£íε5£}SāÉÏO

Probieren Sie es online!

Erläuterung

6*<                    # push input*6-1
   xL                  # leave it on the stack while pushing [1 ... 12*input-2]
     J                 # join the numbers to a single string
      sô               # split the string into pieces of size input*6-1
        2£             # take the first 2 such pieces
          í            # reverse each string
           ε5£}        # take the first 5 chars of each
               S       # split to a single list of digits
                ā      # push range [1 ... len(list)]
                 ÉÏ    # keep only the numbers in the list of digits which are odd in this
                   O   # sum

Alternativer 21-Byte-Ansatz

6*<©·LJƵYS24S®-ì®-(èO
Emigna
quelle
@ KevinCruijssen: Sicher. Ich hatte vor, es ein bisschen mehr zu versuchen und zu
golfen,
Vielen Dank! Und ich weiß, dass die meisten Leute es vorziehen, zuerst so viel wie möglich Golf zu spielen, bevor sie eine Erklärung hinzufügen, aber da es seit mehr als 15 Stunden keine Aktualisierung Ihrer Antwort gab, dachte ich, ich würde nur nach einer Erklärung fragen. :) Schöne Antwort, übrigens!
Kevin Cruijssen
2

Jelly , 19 Bytes

×6’µḤD€Ẏsḣ2ṫ€-4Ẏm2S

Probieren Sie es online!

×6’µḤD€Ẏsḣ2ṫ€-4Ẏm2S Arguments: n (1-indexed)
×6                  Multiply by 6
  ’                 Decrement
   µ                Call that value N and start a new chain with argument N
    Ḥ               Double
      €             Create an inclusive range from 1 to 2N and call this link on it
     D               Get the decimal digits of each integer in the range
       Ẏ            Concatenate the lists of digits
        s           Split into length-N chunks
         ḣ2         Get the first two elements
            €-4     Map this link over the length-2 list with right argument -4
           ṫ         Get elements from this index onwards (supports negative indices too)
               Ẏ    Concatenate the two length-5 lists into one length-10 list
                m2  Take every second element starting from the first
                  S Sum
Erik der Outgolfer
quelle
Würde es Ihnen etwas ausmachen, eine Erklärung hinzuzufügen?
Kevin Cruijssen
@ KevinCruijssen sicher, aber ich mache es normalerweise auf Anfrage, ansonsten konzentriere ich mich darauf, andere Herausforderungen zu beantworten, andere
Dinge zu
1

Java 8, 138 111 109 Bytes

n->{String s="";int r=0,i=1;for(n=n*6-1;i<3*n;s+=i++);for(i=5;i>0;r+=s.charAt(n+n*(i%2^1)-i--)-48);return r;}

Ich muss natürlich meine eigene Herausforderung beantworten. :)
Ich habe meinen anfänglichen Code verloren, den ich zum Erstellen der Testergebnisse in der Herausforderungsbeschreibung verwendet habe, also habe ich gerade neu begonnen.

Erläuterung:

Probieren Sie es online aus.

n->{                               // Method with integer as both parameter and return-type
  String s="";                     //  Temp String
  int r=0,                         //  Result-sum, starting at 0
      i=1;                         //  Index integer, starting at 1
  for(n=n*6-1;                     //  Replace the input with `n*6-1`
      i<3*n;                       //  Loop from 1 up to 3*n (exclusive)
      s+=i++);                     //   And append the temp-String with `i`
  for(i=5;i>0;                     //  Loop from 5 down to 0 (exclusive)
    r+=                            //   Add to the result-sum:
       s.charAt(               )-48);
                                   //    The character at index X, converted to a number,
                n+n*(i%2^1)-i--    //    with X being `n-i` (i=odd) or `n+n-i` (i=even)
  return r;}                       //  Return the result-sum
Kevin Cruijssen
quelle