Ente, Ente, Josephus

49

Gegeben ein Integer-Array:

  1. Beginnen Sie mit der ersten Nummer
  2. N Positionen vorwärts springen, wobei n der Wert der aktuellen Position ist
  3. Löschen Sie die aktuelle Position und machen Sie die nächste Position zur aktuellen Position.
  4. Fahren Sie mit Schritt 2 fort, bis eine Nummer übrig ist
  5. Diese Nummer ausdrucken

Regeln

Das Array wird umbrochen (die nächste Zahl nach der letzten Zahl im Array ist die erste Zahl).

Eine Null entfernt sich (offensichtlich).

Negative Zahlen sind als Eingabe nicht zulässig.

Testfälle

[1] => 1
[1,2] => 1
[1,2,3] => 3
[1,2,2] => 1
[1,2,3,4] => 1
[6,2,3,4] => 4
[1,2,3,4,5] => 5
[0,1] => 1
[0,0,2,0,0] => 0

Beispiel Schritt für Schritt

[1,4,2,3,5]
 ^          start from the first position
   ^        jump 1 position (value of the position)
[1,  2,3,5] remove number in that position
     ^      take next position of the removed number (the 'new' 'current' position)
         ^  jump 2 positions
[1,  2,3  ] remove number in that position
 ^          take next position (looping on the end of the array)
     ^      jump 1 position
[1,    3  ] remove number in that position
       ^    take next position (looping)
 ^          jump 3 positions (looping on the end of the array)
[      3  ] remove number in that position
print 3

Beispiel # 2

[4,3,2,1,6,3]
 ^            start from the first position
         ^    jump 4 positions
[4,3,2,1,  3] remove number in that position    
           ^  take next position
     ^        jump 3 positions
[4,3,  1,  3] remove number in that position    
       ^      take next position
           ^  jump 1 positions
[4,3,  1    ] remove number in that position    
 ^            take next position
   ^          jump 4 positions
[4,    1    ] remove number in that position    
       ^      take next position
 ^            jump 1 position
[      1    ] remove number in that position
print 1

Das ist , die kürzeste Antwort in Bytes gewinnt!

workoverflow
quelle
14
Schöne erste Herausforderung!
Luis Mendo
2
@ LuisMendo Ja .. die "Sprung wie ein ..." Herausforderungen
J42161217
2
@Jenny_mathy Ich hätte nicht gedacht, dass es ein ähnliches geben würde, aber wie Luis sagte, ist das Rundum-Array eine interessante Herausforderung für das Golfen. Ich denke: /
Workoverflow
3
@EriktheOutgolfer Nicht wirklich ein Betrüger. Die Elemente sind dort nicht zu unterscheiden und die Schrittweite ist fest vorgegeben. Luis ist viel näher, aber immer noch ausreichend anders, denke ich.
Martin Ender
3
Muss die endgültige Nummer tatsächlich gedruckt werden oder kann sie nur zurückgegeben werden? Muss die Nummer tatsächlich zurückgegeben werden, oder kann sie nur direkt auf das Array angewendet werden, sodass das Array nach Ausführung der Funktion nur die Nummer enthält?
iamnotmaynard

Antworten:

9

Schale , 7 Bytes

Dies gibt das Ergebnis als Singleton-Liste zurück

ΩεSotṙ←

Probieren Sie es online!

Erläuterung

Ω               Until
 ε              the result is a singleton list
     ṙ          Rotate left by
  S   ←         the first element
   ot           Then remove the first element  
H.PWiz
quelle
7

Haskell , 54 50 48 Bytes

f[x]=x
f(x:r)=f$snd<$>zip r(drop(x+1)$cycle$x:r)

Probieren Sie es online!

Erläuterung:

  • f[x]=x: Wenn die angegebene Liste eine Singleton-Liste ist, geben Sie ihr Element zurück.
  • f(x:r)=f$ ...: Ansonsten rekursiv fauf folgende Liste anwenden :
    • Die Elemente der aktuellen Liste werden unendlich oft durchlaufen ( cycle$x:r),
    • mit den ersten x+1Elementen entfernt ( drop(x+1)$),
    • und auf die Länge von gekürzt r. ( snd<$>zip rist eine kürzere Alternative zu take(length r)).

Vorherige 54-Byte-Version:

f=(%)=<<head
_%[x]=x
n%(x:r)|n<1=f r|s<-r++[x]=(n-1)%s

Probieren Sie es online!

Laikoni
quelle
6

MATL , 21 Bytes

1`yy)+ynX\[]w(5Mynq]x

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

1        % Push 1: current position in the array
`        % Do...while
  yy     %   Duplicate top two elements in the stack. Takes input implicitly
         %   in the first iteration.
         %   STACK: array, position, array, position
  )      %   Get specified entry in the array
         %   STACK: array, position, selected entry
  +      %   Add
         %   STACK: array, position (updated)
  y      %   Duplicate from below
         %   STACK: array, position, array
  n      %   Number of elements of array
         %   STACK: array, position, number of elements or array
  X\     %   1-based modulus
         %   STACK: array, position (wrapped around)
  []     %   Push empty array
         %   STACK: array, position, []
  w      %   Swap
         %   STACK: array, [], position
  (      %   Write value into specified entry in array. Writing [] removes
         %   the entry
         %   STACK: array (with one entry removed)
  5M     %   Push latest used position. Because of the removal, this now
         %   points to the entry that was after the removed one
         %   STACK: array, position
  y      %   Duplicate from below
         %   STACK: array, position, array
  n      %   Number of elements of array
         %   STACK: array, position, number of elements of array
  q      %   Subtract 1
         %   STACK: array, position, number of elements of array minus 1
]        % End. If top of the stack is nonzero, proceed with next iteration
         % STACK: array (containing 1 entry), position
x        % Delete. Implicitly display
         % STACK: array (containing 1 entry)
Luis Mendo
quelle
1
Hinweis: Wenn Sie Listenrotationen verwenden, anstatt einen Zeiger zu behalten, wird dies wahrscheinlich viel kürzer.
Erik der Outgolfer
1
@ Erik Danke. Aber jetzt, da ich die Erklärung hinzugefügt habe, denke ich, werde ich es so
belassen
Nun, Sie können die Erklärung immer entfernen, sie wird in der Geschichte aufbewahrt :)
Erik the Outgolfer
6

Python 3 , 54 51 Bytes

f=lambda x:x and f((x+x*x[0])[x[0]:][1:len(x)])or x

Die Ausgabe ist eine Singleton-Liste.

Probieren Sie es online!

Dennis
quelle
Völlig unabhängig, aber ich mag deinen Einhornhut, Dennis. xD (Und nette Antwort natürlich wie immer!)
Kevin Cruijssen
5

CJam , 15 Bytes

l~_,({_0=m<1>}*

Probieren Sie es online!

Erläuterung

Anstatt einen Zeiger zu verfolgen, verschiebe ich das Array nur zyklisch, sodass das aktuelle Element immer vorne ist.

l~     e# Read and evaluate input.
_,(    e# Get its length L and decrement to L-1.
{      e# Run this block L-1 times...
  _0=  e#   Get the first element X.
  m<   e#   Rotate the array left by X positions.
  1>   e#   Discard the first element.
}*
       e# The final element remains on the stack and gets printed implicitly.

Eine spaßige Alternative, die leider keine Bytes spart:

l~_{;m<1>_0=}*;
Martin Ender
quelle
5

Gehirn-Flak , 88 Bytes

([[]]()){({}<(({})){({}<({}<([]){({}{}<>)<>([])}{}>)<>{({}[<>[]])<>}<>>[()])}{}{}>())}{}

Probieren Sie es online!

Erläuterung

([[]]())                      Push negative N: the stack height - 1
{({}< … >())}{}               Do N times
     (({}))                     Duplicate M: the top of the stack
     {({}< … >[()])}{}          Do M times 
                                  Rotate the stack by 1:
          ({}< … >)               Pop the top of the stack and put it back down after
          ([]){({}{}<>)<>([])}{}  Pushing the rest of the stack on to the other one, in reverse, with the stack height added to each element (to ensure that all are positive)
          <>{({}[<>[]])<>}<>      Push the rest of the stack back, unreversing, and subtracting the stack height from each element
                      {}        Pop the top of stack
H.PWiz
quelle
1
Ein sehr seltsames Golfspiel, aber hier ist es in 88 Bytes .
Wheat Wizard
1
@ WheatWizard Nizza, überraschenderweise habe ich so etwas schon früher versucht.
H.PWiz
Ich kann nie wissen, wie Leute so codieren können! Gibt es einen Pseudocode-Übersetzer oder so?
Workoverflow
1
@workoverflow nein, es ist ehrlich gesagt einfacher als es aussieht. Es war sehr entmutigend, bevor ich anfing, aber wenn die Befehle so einfach sind, ist es leicht zu lernen.
H.PWiz
5

Python 2 , 55 Bytes

def f(a):
 while a[1:]:l=a[0]%len(a);a[:]=a[-~l:]+a[:l]

Probieren Sie es online!

Ausgabe als Singleton-Liste, wie standardmäßig zulässig . Ein paar Bytes gespart dank Dennis , indem er mich daran erinnerte, dass das Ändern des Funktionsarguments erlaubt ist.

Wie es funktioniert

  • def f(a)- Definiert eine Funktion mit einem Parameter a.

  • while a[1:]:- aWenn das erste entfernte Element wahr ist, führen Sie den folgenden Codeblock aus. Eine Liste mit einem oder mehreren Elementen ist wahr, und leere Listen sind in Python falsch. Daher wird diese Liste angehalten, sobald aeine Länge von 1 erreicht ist.

  • l=a[0]%len(a)- Nehmen Sie das erste Element und erhalten Sie den Rest seiner Division durch die Länge von a. Ordnen Sie das Ergebnis zu l.

  • a[:]=a[-~l:]+a[:l]- Drehen Sie adie lElemente nach links und entfernen Sie die erste, während Sie diese an der richtigen aStelle zuweisen .


Python 2 , 63 Bytes

f=lambda a,i=0:a[1:]and f(a,a.pop(((a*-~i)[i]+i)%len(a))+1)or a

Probieren Sie es online!

Obwohl länger, scheint dies viel eleganter. Danke auch an ovs für die Hilfe im Chat.

Mr. Xcoder
quelle
1
a,*b=input()Könntest du nicht so etwas wie (python3) machen und ein paar Bytes sparen? Allerdings bin ich nicht sicher, wie sich das auswirken würde lund die Scheibe
Rod
1
@ Rod Ich glaube nicht, ich müsste die Eingabe auch in Python 3 auswerten
Mr. Xcoder
4

Gelee , 7 Bytes

ṙḷ/ḊµḊ¿

Probieren Sie es online!

Volles Programm.

Erik der Outgolfer
quelle
3
Das ḷ/ist verdammt schlau.
Mr. Xcoder
Könnten Sie bitte eine Erklärung hinzufügen? Ich habe mir jetzt die Quicks und Atoms auf den verlinkten GIT-Seiten angesehen und darauf basierend +1 gegeben, aber ich kann mir nicht vorstellen, dass jeder die Patienten dazu bringt, dasselbe zu tun. ;)
Kevin Cruijssen
4

Gelee , 9 Bytes

ṙḷ/ḊµL’$¡

Probieren Sie es online!

-2 Bytes dank user202729

Erläuterung

ṙḷ/ḊµL’$¡  Main Link
     L’$¡  Repeat <length - 1> times
ṙ          Rotate left by
 ḷ/        The first element (from JHT; thanks to user202729)
   Ḋ       Take all but the first element
HyperNeutrino
quelle
3

Mathematica, 36 Bytes

benutzt Martins Algorithmus

#//.l:{x_,__}:>Rest@RotateLeft[l,x]&

-5 Bytes von Mischa Lawrow & Martin Ender

Probieren Sie es online!

J42161217
quelle
1
Sie können zwei Bytes speichern, indem Sie das Muster verwenden, um das erste Element auszuwählen #//.{x_,y__}:>Rest@RotateLeft[{x,y},x]&. (Dies hört auf, wenn es nur ein Element gibt, da es {a}nicht mehr mit dem Muster übereinstimmt {x_,y__}.)
Misha Lavrov
1
@MishaLavrov kann momentan nicht getestet werden, aber Sie können dies wahrscheinlich noch weiter verkürzen, indem Sie das löschen y, die gesamte Liste aufrufen lund dann lanstelle von verwenden {x,y}.
Martin Ender
1
@MartinEnder Du meinst so - #//.l:{x_,__}:>Rest@RotateLeft[l,x]&?
Mischa Lawrow
1
@ Mischa Lawrow yep.
Martin Ender
3

J , 21 17 Bytes

-4 Bytes dank FrownyFrog

((1<#)}.{.|.])^:_

Probieren Sie es online!

Original:

([:}.{.|.])^:(1<#)^:_

Wie es funktioniert:

^:_ Wiederholen, bis sich das Ergebnis nicht mehr ändert

^:(1<#) wenn die Länge der Liste größer als 1 ist

{.|.] Drehe die Liste um das erste Mal nach links

[:}. Lassen Sie das erste Element fallen und verschließen Sie die Gabel

Probieren Sie es online!

Galen Ivanov
quelle
@ FrownyFrog Danke, ich habe das nicht ausprobiert - es ist viel besser!
Galen Ivanov
3

JavaScript (ES6), 54 bis 60 Byte

1 Byte gespart dank @Shaggy
Fixed Version (+6 Byte)

Ändert das Eingabearray , das auf einen Singleton reduziert ist.

f=(a,p=0)=>1/a||f(a,p=(p+a[p%(l=a.length)])%l,a.splice(p,1))

Testfälle

Wie?

Wir wenden den in der Challenge beschriebenen Algorithmus rekursiv an. Nur die Stoppbedingung 1/amag etwas seltsam erscheinen. Wenn Sie einen arithmetischen Operator anwenden:

  • Arrays von mehr als einem Element werden gezwungen NaNund 1/NaNsind auch NaN(falsch).
  • Arrays mit genau einer ganzen Zahl werden zu dieser ganzen Zahl gezwungen, was entweder zu 1/0 = +Infinityoder 1/N = positive floatfür N> 0 (beide wahr) führt.
f = (a, p = 0) =>                 // a = input array, p = pointer into this array
  1 / a ||                        // if a is not yet a singleton:
    f(                            //   do a recursive call with:
      a,                          //     a
      p = (                       //     the updated pointer
        p + a[p % (l = a.length)] //
      ) % l,                      //
      a.splice(p, 1)              //     the element at the new position removed
    )                             //   end of recursive call
Arnauld
quelle
Wenn Sie splicedas ursprüngliche Array ändern, können Sie es f=(a,p=0)=>1/a||f(a,p=p+a[p]%a.length,a.splice(p,1))für 52 Bytes
Shaggy
es scheint, dass es nicht das richtige Ergebnis für das zweite schrittweise Beispiel gibt, f=(a,p=0)=>1/a?a:f(a,p=(p%a.length+a[p%a.length])%a.length,a.splice(p,1))ist in Ordnung, kann aber optimiert werden
Nahuel Fouilleul
@NahuelFouilleul Ups. Ich dachte irgendwann, dass die Klammern p+a[p]entfernt werden könnten. Was natürlich nicht der Fall ist. Vielen Dank für den Hinweis!
Arnauld
Sehen Sie sich diesen Konsens an , auf den @Neil hier aufmerksam gemacht hat .
Shaggy
@ Shaggy Oh, ich verstehe. Danke! (Ich habe Ihren TIO-Link zum ersten Mal verpasst ...)
Arnauld
3

Julia 0,6 , 46 42 Bytes

!x=length(x)>1?!circshift(x,-x[])[2:end]:x

Probieren Sie es online!

Unkomplizierte rekursive Julia-Version. x[]greift auf das erste Element von x zu.

LukeS
quelle
3

Java 8, 79 Bytes

Dieses Lambda akzeptiert ein Stack<Integer>und gibt ein intoder zurück Integer.

l->{for(int i=0,s=l.size();s>1;)l.remove(i=(i+l.get(i%s))%s--);return l.pop();}

Probieren Sie es online

Ungolfed

l -> {
    for (
        int i = 0, s = l.size()
        ; s > 1
        ;
    )
        l.remove(
            i = (i + l.get(i % s)) % s--
        );
    return l.pop();
}

Danksagung

  • -2 Bytes dank Nahuel Fouilleul
Jakob
quelle
1
i%=skann entfernt werden, wenn l.get(i)geändert vonl.get(i%s)
Nahuel Fouilleul
2

Pyth , 9 Bytes

.WtHt.<Zh

Probieren Sie es hier aus!

Dies gibt das Ergebnis als Singleton-Liste aus, wie dies standardmäßig zulässig ist .

Wie es funktioniert

.WtHt.<Zh ~ Full program.

.W        ~ Functional while. It takes three arguments, two functions: A and B
            and a starting value, which in this case is automatically assigned
            to the input. While A(value) is truthy, value is set to B(value).
            Returns the ending value. A's argument is H and B's is Z.
  tH      ~ A (argument H): Remove the first element of H. A singleton list
            turns into [], which is falsy and thus breaks the loop. Otherwise,
            it is truthy and the loops goes on until the list reaches length 1.
     .<Zh ~ B (argument Z): Cyclically rotate Z by Z[0] places, whereas Z[0]
            represents the first element of Z.
    t     ~ And remove the first element.

Hinweis: Wenn Sie diese Klammern nicht sehen möchten, fügen Sie einfach hoder evor dem gesamten Code ein.

Mr. Xcoder
quelle
2

Schnell , 87 Bytes

func f(a:inout[Int]){var i=0,c=0;while(c=a.count,c>1).1{i=(i+a[i%c])%c;a.remove(at:i)}}

Gibt als Singleton-Liste zurück, indem die Eingabe geändert wird . Probieren Sie es online!

Erläuterung

func f(a:inout[Int]){
  var i=0,c=0;            // Set the index i to 0
  while(c=a.count,c>1).1{ // While the length of the list > 0:
    i=(i+a[i%c])%c;       //  Add a[i] to i and loop back using modulo
    a.remove(at:i)        //  Remove a[i]
  }
}
Herman L
quelle
2

Perl 6 , 46 45 Bytes

(-1 Byte dank Brad Gilbert)

{($_,{(|$_ xx*)[.[0]+(1..^$_)]}...1)[*-1][0]}

Probieren Sie es online!

($_, { ... } ... 1)generiert eine Folge von Listen, beginnend mit der eingegebenen Liste $_, wobei jedes nachfolgende Element vom geschweiften Ausdruck generiert wird und endet, wenn die Liste smart-matches 1--ie eine Länge von 1 hat. Das nachfolgende Element [* - 1]erhält das letzte und das letzte Element [0]Nimmt das einzige Element aus dieser Singleton-Liste.

(|$_ xx *)generiert eine flache, unendlich replizierte Kopie des aktuellen Elements. Diese Liste wird mit dem Bereich indiziert .[0] + (1 ..^ $_), um die nächste endliche Liste in der Reihe zu extrahieren.

Sean
quelle
1
Geist geblasen oO
Adrian
[*-1][0]kann zum [*-1;0]Speichern eines Bytes kombiniert werden . Auch 1..$_-1wird besser geschrieben als 1..^$_nochmal ein Byte zu speichern.
Brad Gilbert b2gills
@ BradGilbertb2gills Ich habe es versucht [*-1;0], aber es scheint irgendwie nicht äquivalent zu sein. Die Funktion gibt dann eher eine Liste als eine Zahl zurück.
Sean
Das stoppt die 1..^$_Optimierung nicht
Brad Gilbert b2gills
1

Perl 5 , 47 43 41 + 2 ( -ap) = 43 Bytes

$\=splice@F,($_+=$F[$_%@F])%@F,1while@F}{

Probieren Sie es online!

Nimmt die Eingabe als durch Leerzeichen getrennte Zahlen.

Xcali
quelle
es scheint, dass es nicht genau dasselbe ist wie das folgende schrittweise Beispiel, aber es ist länger$x%=@F,splice@F,$x=($x+$F[$x])%@F,1while$#F;$_="@F"
Nahuel Fouilleul
1
wow oO Muss mein Spiel auf Vordermann bringen.
Adrian
1

Java 8 , 325 Bytes

Golf gespielt:

static void n(Integer[]j){Integer[]h;int a=0;h=j;for(int i=0;i<j.length-1;i++){if(h.length==a){a=0;}a=(a+h[a])%h.length;h[a]=null;h=m(h);}System.out.print(h[0]);}static Integer[] m(Integer[]array){Integer[]x=new Integer[array.length-1];int z=0;for(int i=0;i<array.length;i++){if(array[i]!=null){x[z]=array[i];z++;}}return x;}

Ungolfed:

 interface ArrayLeapFrog {
static void main(String[] z) throws Exception {
    Integer[] j = {6, 2, 3, 4};
    n(j);
}

static void n(Integer[] j) {
    Integer[] h;
    int a = 0;
    h = j;
    for (int i = 0; i < j.length - 1; i++) {
        if (h.length == a) {
            a = 0;
        }
        a = (a + h[a]) % h.length;
        h[a] = null;
        h = m(h);
    }
    System.out.print(h[0]);
}

static Integer[] m(Integer[] array) {
    Integer[] x = new Integer[array.length - 1];
    int z = 0;
    for (int i = 0; i < array.length; i++) {
        if (array[i] != null) {
            x[z] = array[i];
            z++;
        }
    }
    return x;
  }
}
Entwicklungsentwickler
quelle
4
Herzlich willkommen! Ein paar Tipps: Hier müssen die staticKeywords nicht gezählt werden. In der Regel werden Lösungen mit mehreren Methoden als nicht statische Member einer Klasse implementiert und mainerstellen eine Instanz zum Testen. Wenn Sie dies auf diese Weise tun, unterstützen Sie Java 7 und können es einfach als "Java" -Lösung einreichen. Für zukünftige Referenzzwecke ist das Eingabeformat in der Regel recht flexibel. Sie können also beispielsweise die Eingabe als wählen List(was für dieses Problem sehr hilfreich ist).
Jakob
1

APL + WIN, 36 Bytes

¯1↑⍎¨(1⌈¯1+⍴v←,⎕)⍴⊂'v←(1<⍴v)↓v[1]⌽v'

Erläuterung:

Fordert zur Eingabe des Bildschirms auf.

'v←(1<⍴v)↓v[1]⌽v' Loop logic as a string

 (1<⍴v)↓ only drop the first when number of elements n>1

 (1⌈¯1+⍴v←,⎕)⍴⊂ create a nested vector of logic of length 1 max n-1

 ⍎¨ execute each element of the nested vector in turn

¯1↑ take answer from executing final element
Graham
quelle
1

Python 2, 61 Bytes

def f(x):
 while x[1:]:y=x[0]%len(x);x=x[y+1:]+x[:y]
 print x
Rɪᴋᴇʀ
quelle
1
Ich weiß, dass es eine Reihe von Python-Antworten gibt, aber ich dachte, ich könnte genauso gut meine eigenen hinzufügen.
Freitag,
1

JavaScript, 58 56 59 Bytes

let f =

a=>{for(i=0,k=a.length;k>1;)i+=a[i%=k],a.splice(i%=k--,1)}
<h2>Test</h2>
Enter or paste a valid array literal within square brackets and click Run.
<blockquote>
   <input id = "array" type="text" length="20">
   <button type="button" onclick="run()">Run</button>
</blockquote>
Result: <pre id="o"></pre>

<script>
    function run() {
       let a = JSON.parse(array.value);
       f(a);
       o.textContent = a;
    }
</script>

Gibt das Ergebnis als einziges verbleibendes Element im Eingabearray zurück, das an Ort und Stelle aktualisiert wird.

Zwei Bytes, die mit einer durch Kommas getrennten Anweisung anstelle einer Blockanweisung im for-Schleifenkörper gespeichert wurden! Beim Überspringen eines am Ende des Arrays gelöschten Elements sind drei Bytes verloren gegangen (:

Weniger golfen:

a => {
    for(i=0,k=a.length;k>1;) // once less than array length
        i+=a[i%=k],          // the new index
        a.splice(            // delete an element
           i%=k--,           // ensuring index is within array,
                             // and post decrement loop count
           1
        )
}
traktor53
quelle
Dies scheint die falsche Antwort zu geben [3, 5, 7, 9].
Neil
Falsch für [3,5,7,9]. Erwarteter Wert 5
edc65
Die Funktion gibt den Wert nicht zurück, ich bin nicht sicher, ob die Anzahl der Bytes korrekt ist, wenn man das bedenkt, da es nicht von alleine funktioniert ...
Brian H.
@ edc65 und Neil, danke - der Index eines Elements, das am Ende des Arrays gelöscht wurde, wurde nicht an den Anfang des verkürzten Arrays angepasst.
Traktor53
@BrianH. Wenn
edc65 13.12.17
1

Brain-Flak , 104 Bytes

H.PWiz hat eine kürzere Antwort hier , dass ich dazu beigetragen, Sie sollten check it out.

([[]]()){({}()<(({})){({}[()]<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}{}{}>)}{}

Probieren Sie es online!

Erläuterung

([[]]())   #Push 1 minus stackheight
{({}()<    #N times
 (({}))    #Get a copy of the top
 {({}[()]< #N times
  ({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>
           #Roll the top to the bottom (From the wiki)
 >)}{}     #End loop
 {}        #Remove one value
>)}{}      #End loop
Weizen-Assistent
quelle
Ich dachte, ich würde antreten . Dann wurde mir klar, dass meine fast genauso war wie deine , abgesehen von einem anderen "Top Roll"
H.PWiz
Das habe ich gesehen ;). Die Tatsache, dass alles nicht negativ ist, ist ziemlich klug.
Wheat Wizard
1

R 111 117 126 Bytes

Dank @Giuseppe für das Golfspielen von 11 Bytes durch Ändern in eine while-Schleife, weitere 4 durch Entfernen der Funktion und direktes Lesen von Benutzereingaben.

Ich finde es nicht gut, was nötig war, um dorthin zu gelangen - ich bin mir sicher, dass es eine elegantere Lösung gibt.

i=scan();m=1;while((l=sum(i|1))-1){j=i[m];p=`if`(j+m>l,j%%l+!m-1,j+m);p=`if`(!p,m,p);i=i[-p];m=`if`(p-l,p,1)};i

Probieren Sie es online!

Ungolfed Code

i=scan()
m=1
while((l=sum(i|1))-1){
  j=i[m]
  p=`if`(j+m>l,j%%l+!m-1,j+m)
  p=`if`(!p,m,p)
  i=i[-p]
  m=`if`(p-l,p,1)
}
i
Kennzeichen
quelle
117 Bytes - Beachten Sie, dass der Name eingeschlossen werden f=muss , da dies eine rekursive Funktion ist
Giuseppe
1
Ich fand das eine ziemlich schwierige Herausforderung mit einer 1-basierten Indexsprache ohne Array-Rotationen; Das ist möglicherweise 1-3 Bytes kürzer mit einer whileSchleife, denke ich.
Giuseppe
Mein vorheriger 115-Byte-Wert war ungültig, da wir beide den f=Teil der rekursiven Funktion vergessen haben . :(
Giuseppe
Ich habe die alte Punktzahl und die neue Punktzahl aktualisiert, um die Rekursivität wiederzugeben :) Mit der "while" -Schleife habe ich weitere 4 Bytes mit dem Scan abgespielt.
Mark