Cztery spiralne osie

9

Weź liczby 0, 1, 2, 3, 4, ...i ułóż je w spiralę zgodnie z ruchem wskazówek zegara, zaczynając w dół, zapisując każdą cyfrę w osobnym kwadracie.

Następnie, biorąc pod uwagę jeden z czterech wyraźnych i spójnych znaków ASCII (twój wybór) reprezentujących oś i wejściową liczbę całkowitą n, wyślij pierwsze nwyrazy opisanej sekwencji, wybierając kwadraty wzdłuż odpowiedniej osi.

Na przykład poniżej znajduje się ułożona spirala do połowy 29. Załóżmy, że używamy u / d / l / rczterech naszych reprezentujących postaci up / down / left / right. Następnie, podane ujako dane wejściowe, wyprowadzamy 0, 5, 1, 4 ...(dodatnia oś y) do nth. Gdybyśmy zamiast podane ljako dane wejściowe, to byłoby 0, 3, 1, 1 ...aż do nXX perspektywie.

  2---3---2---4---2---5---2
  |                       |
  2   1---3---1---4---1   6
  |   |               |   |
  2   2   4---5---6   5   2
  |   |   |       |   |   |
  1   1   3   0   7   1   7
  |   |   |   |   |   |   |
  2   1   2---1   8   6   2
  |   |           |   |   |
  0   1---0---1---9   1   8
  |                   |   |
  2---9---1---8---1---7   2

Są to sekwencje w OEIS:

Przykłady

d 19
[0, 1, 1, 8, 3, 7, 6, 2, 1, 5, 1, 1, 6, 2, 2, 1, 3, 4, 0]

r 72
[0, 7, 1, 7, 4, 2, 8, 1, 1, 3, 1, 2, 0, 2, 3, 1, 3, 4, 6, 5, 5, 5, 7, 7, 8, 8, 9, 6, 8, 1, 1, 1, 2, 3, 1, 8, 0, 6, 1, 7, 0, 9, 2, 8, 4, 3, 2, 1, 1, 7, 2, 6, 2, 1, 3, 3, 5, 5, 3, 2, 2, 0, 4, 3, 2, 5, 4, 6, 5, 0, 5, 1]

u 1
[0]

Zasady

  • Jeśli dotyczy, możesz założyć, że wejście / wyjście będzie pasować do rodzimego typu Integer w Twoim języku.
  • Jeśli używasz liczb całkowitych do przedstawienia czterech osi, możesz użyć liczb całkowitych ujemnych bez łamania reguł.
  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
Czy możemy wziąć liczby całkowite ujemne dla kilku kierunków?
mbomb007
@ mbomb007 Jasne, że byłoby OK.
AdmBorkBork
Nie wydaje się to zbyt praktyczne, ale czy możemy zwrócić liczbę całkowitą, która ma wymagane cyfry, z wyjątkiem początkowego zera (co i tak byłoby sugerowane)?
Erik the Outgolfer
@AdmBorkBork Zasadniczo nie mam na myśli takiego rozwiązania, chciałem tylko zapytać. :)
Erik the Outgolfer
Wyzwanie jest oceniane na podstawie wyników. Więc jeśli zero nie zostanie uwzględnione, pomyślałbym, że to byłoby złe, ponieważ policzyłbyś je źle, gdyby zero zostało wykluczone dla wyjścia łańcuchowego. Python może wypisywać liczby całkowite z wiodącymi zerami, więc dlaczego nie w innych językach.
mbomb007

Odpowiedzi:

5

Python 2 , 94 89 84 83 74 72 70 bajtów

Użyłem WolframAlpha i stwierdziłem, że górna granica 5 n > 4n 2 + 3n wydaje się wystarczająca. Można go zmienić na 9 n bez żadnych kosztów. Aby wypróbować większe dane wejściowe, użyj 9*n*nzamiast, 5**naby uniknąć braku pamięci.

lambda d,n:["".join(map(str,range(5**n)))[x*(4*x+d)]for x in range(n)]

Wypróbuj online!

Dane wejściowe dla kierunków to:

  • 3: prawda
  • -3: w dół
  • -1 w lewo
  • 1: w górę

Zaoszczędzono 14 bajtów dzięki Rodowi
Zaoszczędzono 2 bajty dzięki Jonathanowi Allanowi

mbomb007
źródło
1

MATL , 32 bajty

tE1YLtn:qVXzw)3Lt3$)iX!w:qyfYm+)

Dane wejściowe to n, agdzie areprezentuje oś w następujący sposób:

  • 0: lewo;
  • 1: w górę;
  • 2: dobrze;
  • 3: na dół.

Dane wyjściowe to ciąg znaków.

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

Luis Mendo
źródło
1

Galaretka ,  19  18 bajtów

Używa sztuczki 5 n z odpowiedzi Python na mbomb007

4,0jḅɗ@€ị5*D€FʋṖ0;

Dyadyczny link przyjmujący npo lewej stronie di liczbę całkowitą z:[-3,-1,1,3]:[v,<,^,>]

Wypróbuj online!

20-bajtowa alternatywa, która jest jednocześnie znacznie szybsza i nie powoduje awarii dla tak małego n, to:

²×5D€ƲFị@4,0jḅɗ@€Ṗ0;

Wypróbuj online!

W jaki sposób?

4,0jḅɗ@€ị5*D€FʋṖ0; - Link: integer, n; integer, d
     ɗ@€           - last three links as a dyad with sw@pped arguments for €ach (of implicit range [1,n])
4,0                -   literal list [4,0]
   j               -   join with d = [4,d,0]
    ḅ              -   convert from base n = 4*n^2+d*n+0
        ị          - index into...
              ʋ    - last four links as a monad:
         5         -   five
          *        -   exponentiate = 5^n
           D€      -   decimal list of each (in implicit range [1,5^n])
            F      -   flatten into a single list of the digits
               Ṗ   - pop (drop the final element)
                0; - prepend a zero
Jonathan Allan
źródło
1

będzie działać przez znaczną liczbę n (jak +1000)

JavaScript (Node.js) , 104 bajty

f=(d,n)=>--n?[...f(d,n),C(n*(4*n+d))]:[0]
C=(n,N=i=0)=>n>N?C(n-N,(p=10**i)*9*++i):+((p+--n/i|0)+"")[n%i]

Wypróbuj online!

Wyjaśnienie

  • 3: prawda
  • -3: w dół (-3 jest legalny zgodnie z komentarzami)
  • -1 w lewo
  • 1: w górę (jak @ mbomb007)

C-ta cyfra stałej Champernowne

________________________________________________________

Metoda mniej wydajna (nie działa dla 1000+)

JavaScript (Node.js) , 81 bajtów

f=(d,n)=>eval(`for(r=[],s=i=I="";I<n;)(s+=i++)[u=I*(4*I+d)]&&r.push(s[I++,u]),r`)

Wypróbuj online!

DanielIndie
źródło
0

Stax , 13 bajtów

â╞ê←τ"(]]⌐┘?N

Uruchom i debuguj

Pobiera dane wejściowe wraz z kierunkiem, a następnie zliczaniem. Prawo, w górę, w lewo iw dół są 1, 3, 5, i 7odpowiednio. Uruchomienie trzech dostarczonych przypadków testowych zajmuje pełną minutę.

rekurencyjny
źródło