Kaczka, Kaczka, Józef Flawiusz

49

Biorąc pod uwagę tablicę liczb całkowitych:

  1. Zacznij od pierwszego numeru
  2. Przeskocz do przodu n pozycji, gdzie n jest wartością bieżącej pozycji
  3. Usuń bieżącą pozycję, czyniąc następną pozycję bieżącą pozycją.
  4. Idź do kroku 2, aż pozostanie jedna liczba
  5. Wydrukuj ten numer

Zasady

Tablica się zawija (następna liczba po ostatniej liczbie w tablicy jest pierwszą liczbą).

Zero usuwa się (oczywiście).

Liczby ujemne nie są dozwolone jako dane wejściowe.

Przypadki testowe

[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

Przykład krok po kroku

[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

Przykład nr 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

To jest , wygrywa najkrótsza odpowiedź w bajtach!

przepływ pracy
źródło
14
Ładne pierwsze wyzwanie!
Luis Mendo,
2
@LuisMendo Tak .. wyzwania „pomiń jak ...”
J42161217,
2
@Jenny_mathy Nie sądziłem, że będzie podobny, ale jak powiedział Luis, owijanie się tablicy stanowi ciekawe wyzwanie dla golfa. Myślę: /
przepływ pracy
3
@EriktheOutgolfer Niezupełnie dupek. Elementy są nierozróżnialne, a wielkość kroku jest ustalona. Luisa jest znacznie bliżej, ale myślę, że wciąż wystarczająco inny.
Martin Ender,
3
Czy rzeczywiście musi wydrukować ostateczny numer, czy może po prostu go zwrócić? Czy musi faktycznie zwracać liczbę, czy może po prostu działać na tablicy w miejscu, więc po uruchomieniu funkcji tablica zawiera tylko liczbę?
iamnotmaynard,

Odpowiedzi:

9

Łuska , 7 bajtów

Zwraca wynik jako listę singletonów

ΩεSotṙ←

Wypróbuj online!

Wyjaśnienie

Ω               Until
 ε              the result is a singleton list
     ṙ          Rotate left by
  S   ←         the first element
   ot           Then remove the first element  
H.PWiz
źródło
7

Haskell , 54 50 48 bajtów

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

Wypróbuj online!

Wyjaśnienie:

  • f[x]=x: Jeśli podana lista jest listą pojedynczą, zwróć jej element.
  • f(x:r)=f$ ...: W przeciwnym razie rekurencyjnie stosuje fsię do następującej listy:
    • Elementy bieżącej listy były odtwarzane bez końca ( cycle$x:r),
    • z x+1usuniętymi pierwszymi elementami ( drop(x+1)$),
    • i obcięty do długości r. ( snd<$>zip rjest krótszą alternatywą dla take(length r)).

Poprzednia 54 bajtowa wersja:

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

Wypróbuj online!

Laikoni
źródło
7

Rubinowy , 37 bajtów

->r{r.rotate!(r[0]).shift while r[1]}

Zmienia tablicę w miejscu, która wydaje się być akceptowalna jako wynik. Wypróbuj online!

iamnotmaynard
źródło
6

MATL , 21 bajtów

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
źródło
1
Uwaga: użycie rotacji listy zamiast utrzymywania wskaźnika prawdopodobnie spowoduje, że będzie to znacznie krótsze.
Erik the Outgolfer,
1
@Erik Thanks. Ale teraz, gdy dodałem wyjaśnienie, myślę, że tak to zostawię
Luis Mendo,
Cóż, zawsze możesz usunąć wyjaśnienie, zostanie ono zapisane w historii :)
Erik the Outgolfer
6

Python 3 , 54 51 bajtów

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

Dane wyjściowe to lista singletonów.

Wypróbuj online!

Dennis
źródło
Całkowicie niezwiązany, ale podoba mi się twój jednorożec, Dennis. xD (I oczywiście fajna odpowiedź, jak zawsze!)
Kevin Cruijssen
5

CJam , 15 bajtów

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

Wypróbuj online!

Wyjaśnienie

Zamiast śledzić wskaźnik, po prostu zmieniam tablicę cyklicznie, aby bieżący element był zawsze z przodu.

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.

Zabawna alternatywa, która niestety nie oszczędza żadnych bajtów:

l~_{;m<1>_0=}*;
Martin Ender
źródło
5

Brain-Flak , 88 bajtów

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

Wypróbuj online!

Wyjaśnienie

([[]]())                      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
źródło
1
Bardzo dziwny golf, ale tutaj jest w 88 bajtach .
Wheat Wizard,
1
@WheatWizard Nice, zaskakująco próbowałem wcześniej czegoś takiego.
H.PWiz 12.12.17
Nigdy nie wiem, jak ludzie mogą tak kodować! czy istnieje tłumacz pseudokodu lub coś takiego?
przepływ pracy
1
@workoverflow nie, to jest naprawdę łatwiejsze niż się wydaje. To było bardzo trudne, zanim zacząłem, ale kiedy polecenia są tak proste, łatwo się ich nauczyć.
H.PWiz
5

Python 2 , 55 bajtów

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

Wypróbuj online!

Wypisuje jako listę singletonów, domyślnie dozwoloną . Zaoszczędziłem kilka bajtów dzięki Dennisowi , przypominając mi, że modyfikowanie argumentu funkcji jest dozwolone.

Jak to działa

  • def f(a)- Definiuje funkcję z parametrem a.

  • while a[1:]:- Podczas agdy pierwszy usunięty element jest prawdą, uruchom blok kodu, aby śledzić. Lista zawierająca co najmniej jeden element jest zgodna z prawdą, a puste listy są w Pythonie fałszywe, dlatego przestanie być wyświetlane, gdy aosiągnie długość 1.

  • l=a[0]%len(a)- Weź pierwszy element i uzyskaj pozostałą część jego podziału o długości a. Przypisz wynik do l.

  • a[:]=a[-~l:]+a[:l]- Obróć elementy aw lewo li usuń pierwszy, przypisując go ana miejscu.


Python 2 , 63 bajty

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

Wypróbuj online!

Chociaż dłużej wydaje się to bardziej eleganckie. Również dzięki ovs za pomoc w czacie.

Pan Xcoder
źródło
1
Nie możesz zrobić czegoś takiego jak a,*b=input()(python3) i zaoszczędzić kilka bajtów? Nie jestem jednak pewien, jak to by wpłynęło li kawałek
Rod
1
@Rod Nie sądzę, musiałbym też ocenić dane wejściowe w Pythonie 3
Pan Xcoder,
4

Galaretka , 7 bajtów

ṙḷ/ḊµḊ¿

Wypróbuj online!

Pełny program

Erik the Outgolfer
źródło
3
To ḷ/cholernie sprytne.
Pan Xcoder,
Czy mógłbyś dodać wyjaśnienie? Patrzyłem teraz na Quicks i Atomy na połączonych stronach GIT i na tej podstawie daje +1, ale mogę sobie wyobrazić, że nie wszyscy mają pacjentów, którzy robią to samo. ;)
Kevin Cruijssen
4

Galaretka , 9 bajtów

ṙḷ/ḊµL’$¡

Wypróbuj online!

-2 bajty dzięki user202729

Wyjaśnienie

ṙḷ/Ḋµ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
źródło
3

Mathematica, 36 bajtów

używa algorytmu Martina

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

-5 bajtów od Miszy Ławrow && Martin Ender

Wypróbuj online!

J42161217
źródło
1
Możesz zapisać dwa bajty, używając wzorca do wybrania pierwszego elementu #//.{x_,y__}:>Rest@RotateLeft[{x,y},x]&. (To się kończy, gdy jest tylko jeden element, ponieważ {a}nie pasuje już do wzoru {x_,y__}.)
Misha Lavrov,
1
@MishaLavrov nie może teraz przetestować, ale prawdopodobnie możesz to jeszcze bardziej skrócić, upuszczając y, wywołując całą listę, la następnie używając lzamiast {x,y}.
Martin Ender,
1
@MartinEnder Masz na myśli tak - #//.l:{x_,__}:>Rest@RotateLeft[l,x]&?
Misza Ławrow,
1
@MishaLavrov tak.
Martin Ender,
3

J , 21 17 bajtów

-4 bajty dzięki FrownyFrog

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

Wypróbuj online!

Oryginał:

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

Jak to działa:

^:_ powtarzaj, aż wynik przestanie się zmieniać

^:(1<#) jeśli długość listy jest większa niż 1

{.|.] obróć listę w lewo o jej pierwszą pozycję razy

[:}. upuść pierwszy element i zakryj widelec

Wypróbuj online!

Galen Iwanow
źródło
@ FrownyFrog Dzięki, nie próbowałem tego - jest o wiele lepszy!
Galen Iwanow
3

JavaScript (ES6), 54 60 bajtów

Zapisano 1 bajt dzięki wersji @Shaggy
Naprawiono (+6 bajtów)

Modyfikuje tablicę wejściową , która jest zredukowana do singletonu.

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

Przypadki testowe

W jaki sposób?

Rekurencyjnie stosujemy algorytm opisany w wyzwaniu. Tylko warunek zatrzymania 1/amoże wydawać się nieco dziwny. Podczas stosowania operatora arytmetycznego:

  • Tablice więcej niż jednego elementu są przymuszane NaNi 1/NaNrównież NaN(fałsz).
  • Tablice dokładnie jednej liczby całkowitej są przymuszane do tej liczby całkowitej, prowadząc do jednego 1/0 = +Infinitylub 1/N = positive floatdla N> 0 (obie prawdy).
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
źródło
Widząc, jak splicemodyfikuje oryginalną tablicę, możesz zrobić f=(a,p=0)=>1/a||f(a,p=p+a[p]%a.length,a.splice(p,1))dla 52 bajtów
Shaggy
wygląda na to, że nie daje właściwego wyniku dla drugiego przykładu krok po kroku, f=(a,p=0)=>1/a?a:f(a,p=(p%a.length+a[p%a.length])%a.length,a.splice(p,1))jest w porządku, ale można go zoptymalizować
Nahuel Fouilleul,
@NahuelFouilleul Oops. W pewnym momencie pomyślałem, że nawiasy wokół p+a[p]można usunąć. Co - oczywiście - nie jest prawdą. Dziękujemy za zgłoszenie tego!
Arnauld,
Zobacz ten konsensus , który @Neil zwrócił mi tutaj uwagę .
Kudłaty
@Shaggy Oh, rozumiem. Dziękuję Ci! (Brakowało mi twojego linku TIO za pierwszym razem ...)
Arnauld,
3

Julia 0,6 , 46 42 bajtów

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

Wypróbuj online!

Prosta rekurencyjna wersja Julii. x[]uzyskuje dostęp do pierwszego elementu x.

Łukasza
źródło
3

Java 8, 79 bajtów

Ta lambda akceptuje a Stack<Integer>i zwraca an intlub Integer.

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

Wypróbuj online

Bez golfa

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

Podziękowanie

  • -2 bajty dzięki Nahuelowi Fouilleulowi
Jakob
źródło
1
i%=smoże zostać usunięty, jeśli zostanie l.get(i)zmieniony przezl.get(i%s)
Nahuel Fouilleul,
2

Pyth , 9 bajtów

.WtHt.<Zh

Wypróbuj tutaj!

Powoduje to wyświetlenie wyniku jako listy singletonów, co jest domyślnie dozwolone .

Jak to działa

.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.

Uwaga: jeśli nie chcesz widzieć tych nawiasów, po prostu dodaj hlub eprzed całym kodem.

Pan Xcoder
źródło
2

Szybki , 87 bajtów

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)}}

Zwraca jako listę singletonów , modyfikując dane wejściowe . Wypróbuj online!

Wyjaśnienie

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.
źródło
2

Perl 6 , 46 45 bajtów

(-1 bajt dzięki Brad Gilbert)

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

Wypróbuj online!

($_, { ... } ... 1)generuje sekwencję list, zaczynając od listy wejściowej $_, przy czym każdy kolejny element jest generowany przez wyrażenie nawiasu klamrowego i kończąc się, gdy lista inteligentnych dopasowań 1--ie, ma długość 1. [* - 1]Końcowy element otrzymuje ostatni element, a ostatni [0]usuwa jedyny element z tej listy singletonów.

(|$_ xx *)generuje płaską, nieskończenie replikowaną kopię bieżącego elementu. Ta lista jest indeksowana zakresem, .[0] + (1 ..^ $_)aby wyodrębnić następną skończoną listę w serii.

Sean
źródło
1
przeszkadza dmuchane oO
Adrian
[*-1][0]można połączyć w [*-1;0]zapisanie bajtu. Również 1..$_-1lepiej jest napisać, ponieważ 1..^$_ponownie zapisuje bajt.
Brad Gilbert b2gills,
@ BradGilbertb2gills Próbowałem [*-1;0], ale wydaje się, że nie jest to jakoś równoważne. Następnie funkcja zwraca listę zamiast liczby.
Sean,
To nie kończy 1..^$_optymalizacji
Brad Gilbert b2gills,
1

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

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

Wypróbuj online!

Pobiera dane wejściowe jako liczby oddzielone spacjami.

Xcali
źródło
wygląda na to, że nie jest dokładnie taki sam, jak poniższy przykład krok po kroku, ale jest dłuższy$x%=@F,splice@F,$x=($x+$F[$x])%@F,1while$#F;$_="@F"
Nahuel Fouilleul,
1
wow oO Muszę podnieść moją grę.
Adrian,
1

Java 8 , 325 bajtów

Gra w golfa:

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;}

Nie golfowany:

 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;
  }
}
DevelopingDeveloper
źródło
4
Witamy! Kilka wskazówek: nie musisz statictutaj liczyć słów kluczowych. Zazwyczaj rozwiązania oparte na wielu metodach są implementowane jako niestatyczne elementy klasy i maintworzą instancję do testowania. Ponadto, jeśli robisz to w ten sposób, wspierasz Javę 7 i możesz ją przesłać jako rozwiązanie „Java”. W celu przyszłego wykorzystania format wejściowy jest tutaj dość elastyczny, więc możesz na przykład wybrać wejście jako List(co jest dość pomocne w przypadku tego problemu).
Jakob
1

APL + WIN, 36 bajtów

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

Wyjaśnienie:

Monity o wprowadzenie ekranu.

'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
źródło
1

Python 2, 61 bajtów

def f(x):
 while x[1:]:y=x[0]%len(x);x=x[y+1:]+x[:y]
 print x
Rɪᴋᴇʀ
źródło
1
Wiem, że istnieje wiele odpowiedzi na pytania w języku Python, ale pomyślałem, że równie dobrze mogę dodać własne.
Rɪᴋᴇʀ
1

JavaScript, 58 56 59 bajtów

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>

Zwraca wynik jako jedyny element pozostający w tablicy wejściowej, która jest aktualizowana na miejscu.

Dwa bajty zapisane przy użyciu instrukcji rozdzielanej przecinkami zamiast instrukcji blokowej w treści pętli for! Utracono trzy bajty, aby pominąć element usunięty na końcu tablicy (:

Mniej golfa:

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
źródło
Wydaje się, że daje to złą odpowiedź na pytanie [3, 5, 7, 9].
Neil,
Źle dla [3,5,7,9]. Oczekiwana wartość 5
edc65
Funkcja nie zwraca wartości, nie jestem pewien, czy liczba bajtów jest poprawna, biorąc pod uwagę to, ponieważ nie może sama działać ...
Brian H.
@ edc65 i Neil, dzięki - indeks elementu usuwanego na końcu tablicy nie był dostosowywany do początku skróconej tablicy.
traktor53
@BrianH. funkcja modyfikuje swój parametr, istnieje zgodność co do tego codegolf.meta.stackexchange.com/a/4942/21348
edc65
1

Brain-Flak , 104 bajty

H.PWiz ma krótszą odpowiedź tutaj , że pomogłem zrobić, należy to sprawdzić.

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

Wypróbuj online!

Wyjaśnienie

([[]]())   #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
Kreator pszenicy
źródło
Myślałem, że będę konkurował . Potem zdałem sobie sprawę, że mój był prawie dokładnie taki sam jak twój , poza innym „top rollem”
H.PWiz
Widziałem to ;). Wykorzystanie faktu, że wszystko jest nieujemne, jest dość sprytne.
Wheat Wizard
1

R , 111 117 126 bajtów

Dzięki @Giuseppe za grę w golfa poza 11 bajtami, przechodząc do pętli while, otrzymałem kolejne 4, usuwając funkcję i bezpośrednio czytając dane wejściowe użytkownika.

Nie czuję się dobrze z tym, co trzeba, aby tam dotrzeć - jestem pewien, że istnieje bardziej eleganckie rozwiązanie.

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

Wypróbuj online!

Nieskluczony kod

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
znak
źródło
117 bajtów - należy pamiętać, że ponieważ jest to funkcja rekurencyjna, f=należy podać nazwę
Giuseppe
1
Znalazłem to dość trudne wyzwanie z językiem indeksu opartym na 1 bez rotacji tablicy; whilemyślę, że jest to potencjalnie 1-3 bajty krótsze z pętlą.
Giuseppe,
mój poprzedni 115 bajt był nieprawidłowy, ponieważ oboje zapomnieliśmy o f=części funkcji rekurencyjnej. :(
Giuseppe
Zaktualizowałem stary wynik i nowy, aby odzwierciedlić rekurencyjność :) Dzięki pętli „while” grałem w golfa kolejne 4 bajty za pomocą skanowania.
Mark