Empat Sumbu Spiral


9

Ambil angka-angka 0, 1, 2, 3, 4, ...dan atur dalam spiral searah jarum jam, mulai dari bawah, tulis masing-masing angka di kotaknya sendiri.

Kemudian, mengingat salah satu dari empat karakter ASCII yang berbeda dan konsisten (pilihan Anda) mewakili suatu sumbu, dan bilangan bulat input n, mengeluarkan nistilah pertama dari urutan yang dijelaskan dengan memilih kotak di sepanjang sumbu yang sesuai.

Sebagai contoh, di bawah ini adalah spiral tersusun hingga setengah jalan 29. Misalkan kita menggunakan u / d / l / runtuk empat karakter kita, mewakili up / down / left / right. Kemudian, diberikan usebagai input, kami output 0, 5, 1, 4 ...(sumbu y positif) hingga nistilah th. Jika kita sebaliknya diberi lsebagai masukan, maka akan 0, 3, 1, 1 ...sampai ke njangka th.

  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

Ini adalah urutan pada OEIS:

Contohnya

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]

Aturan

  • Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
  • Jika Anda menggunakan bilangan bulat untuk mewakili keempat sumbu, Anda bisa menggunakan bilangan bulat negatif tanpa melanggar aturan.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Bisakah kita mengambil bilangan bulat negatif untuk beberapa arah?
mbomb007

@ mbomb007 Tentu, itu tidak masalah.
AdmBorkBork

Tampaknya tidak terlalu praktis, tetapi bisakah kita mengembalikan bilangan bulat yang memiliki angka yang diperlukan kecuali nol di depannya (yang akan tetap tersirat)?
Erik the Outgolfer

@ AdmBorkBork Pada dasarnya saya tidak memiliki solusi seperti itu dalam pikiran, hanya berpikir untuk bertanya. :)
Erik the Outgolfer

Sebuah tantangan dinilai dari hasilnya. Jadi jika nol tidak termasuk, saya pikir itu akan salah, karena Anda akan menghitungnya salah jika nol dikecualikan untuk output string. Python dapat menampilkan bilangan bulat dengan angka nol di depan, jadi mengapa tidak menggunakan bahasa lain.
mbomb007

Jawaban:


5

Python 2 , 94 89 84 83 74 72 70 byte

Saya menggunakan WolframAlpha dan menentukan bahwa batas atas 5 n > 4n 2 + 3n tampaknya cukup. Itu dapat diubah menjadi 9 n tanpa biaya. Untuk mencoba input yang lebih besar, gunakan 9*n*nbukannya 5**nmenghindari kehabisan memori.

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

Cobalah online!

Input untuk arah adalah:

  • 3: benar
  • -3: bawah
  • -1: kiri
  • 1: naik

Disimpan 14 byte berkat Rod
Saved 2 byte terima kasih kepada Jonathan Allan



1

Jelly ,  19  18 byte

Menggunakan trik 5 n dari jawaban Python mbomb007

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

Sebuah tautan diad mengambil ndi kiri dan ddan integer dari:[-3,-1,1,3]:[v,<,^,>]

Cobalah online!

Alternatif 20 byte yang jauh lebih cepat dan tidak segfault untuk n sekecil itu adalah:

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

Cobalah online!

Bagaimana?

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

1

akan bekerja untuk n yang cukup (seperti +1000)

JavaScript (Node.js) , 104 byte

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]

Cobalah online!

Penjelasan

  • 3: benar
  • -3: down (-3 sah menurut komentar)
  • -1: kiri
  • 1: naik (seperti @ mbomb007)

Digit ke-konstan konstan Champernowne

________________________________________________________

Metode kurang efisien (tidak akan berfungsi untuk 1000+)

JavaScript (Node.js) , 81 byte

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

Cobalah online!


0

Stax , 13 byte

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

Jalankan dan debug itu

Dibutuhkan input dengan arah, diikuti oleh hitungan. Kanan, atas, kiri, dan ke bawah 1, 3, 5, dan 7masing-masing. Dibutuhkan satu menit penuh untuk menjalankan tiga test case yang disediakan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.