Urutan SUDSI ( su m, d ifference, s wap, i ncrement) adalah deretan integer yang aneh yang nampak menunjukkan perilaku yang agak kacau. Ini dapat dihasilkan sebagai berikut:
Biarkan S menjadi daftar tak terbatas dari alam nomor: 1 2 3 4 5 6 ...
. Biarkan S i menunjukkan satu-diindeks i th elemen S . Jadi pada awalnya, S 1 adalah 1, S 2 adalah 2, dll. (Tidak ada S 0 ).
Dimulai dengan S 1 dan S 2 ...
- Hitung jumlah mereka:
sum = S1 + S2
- Hitung perbedaan absolut mereka (yang lebih besar dikurangi yang lebih kecil):
diff = |S1 - S2|
Tukar kedua nilai dalam S pada indeks jumlah dan perbedaan:
swap(Ssum, Sdiff)
Tambahkan indeks S yang sedang Anda kerjakan. Jadi lain kali Anda akan menghitung jumlah dan selisih S 2 dan S 3 , dan waktu setelah itu akan menjadi S 3 dan S 4 , dll.
- Ulangi proses ini tanpa batas.
Inilah beberapa tahap pertama S saat proses ini diterapkan. Tanda kurung []
mengelilingi dua nilai yang akan dijumlahkan dan dibedakan.
S asli :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Setelah S 3 ( 3 = 1 + 2
) dan S 1 ( 1 = |1 - 2|
) ditukar:
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Setelah S 3 dan S 1 ditukar:
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Setelah S 7 dan S 1 ditukar:
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Setelah S 9 dan S 1 ditukar:
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Setelah S 11 dan S 1 ditukar:
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Setelah S 7 dan S 5 ditukar:
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
dll.
Urutan SUDSI didefinisikan sebagai urutan elemen pertama dalam setiap daftar ini. Jadi beberapa syarat pertama dari urutan SUDSI adalah 1 3 1 7 9 11 11
.
Berikut adalah 200 syarat pertama dari urutan SUDSI (20 per baris):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
Tidak jelas (setidaknya bagi saya) bagaimana seseorang dapat memprediksi masa depan. Hanya merasa aman untuk mengatakan bahwa istilah tersebut selalu aneh, tidak menurun (setelah periode kedua), dan bahwa beberapa angka diulang berkali-kali.
Tantangan
Menulis sebuah program atau fungsi yang mengambil di bilangan bulat positif n dan mencetak atau mengembalikan n th jangka urutan SUDSI. Misalnya, jika n adalah 1, outputnya adalah 1
, jika n adalah 2, outputnya adalah 3
, jika n adalah 200, outputnya adalah 363
.
Ambil input dengan cara biasa (stdin / command line / function arg).
Jawaban terpendek dalam byte menang.
(Situs itu mengkodekan hal-hal dalam UTF-8, tetapi Anda dapat menggunakan pengkodean apa pun yang Anda inginkan.)
Bonus Mathy: (berpotensi memenuhi syarat untuk hadiah)
- Ceritakan lebih banyak tentang urutan SUDSI. Apa pola yang mendasari angka apa yang merupakan bagian dari itu dan berapa banyak dari mereka (dan hal-hal seperti itu)? (Omong -omong, saya tidak dapat menemukan SUDSI di OEIS .)
sumber
Jawaban:
Pyth,
45414038 byteSaya perhatikan (seperti halnya Martin Büttner), bahwa jumlah maksimum yang terpengaruh dari langkah permutasi
k
adalah2k + 1
. Tetapi karena kita hanya memilikin - 1
, langkah-langkah, kita hanya perlu daftar nomor hingga2n - 1
.Cobalah online: Peragaan
sumber
Mathematica, 88 byte
Ini adalah program lengkap, membaca input dari prompt. Ini adalah implementasi definisi yang sangat langsung, di mana saya melacak urutan saat ini
f
(yang nilaif[n]
defaultnya adalahn
).Ini adalah versi yang sedikit lebih mudah dibaca:
Beberapa analisis
Saya telah merencanakan elemen 2000 pertama dari urutan (itu tidak benar-benar menjadi lebih menarik setelah itu):
Jadi urutannya pada dasarnya linier dengan kemiringan 2 dan selalu memiliki beberapa langkah tersebut. Tampaknya langkah-langkahnya tumbuh secara sublinear (jika tidak dibatasi), karena langkah tersebut menjadi hampir tidak terlihat ketika Anda meningkatkan jumlah poin yang Anda plot.
Kita dapat menjustifikasi pertumbuhan linier dengan cukup mudah (ini adalah sedikit handwavy, tapi saya pikir ini akan tahan terhadap bukti yang kuat melalui induksi): pada awalnya, jumlah maksimum yang terpengaruh dari langkah permutasi
n
adalahn + (n+1) = 2n + 1
. Perhatikan juga bahwa angka-angka ini akan selalu dipindahkan ke1
, karena|n - (n+1)| = 1
. Jadi tidak mengherankan bahwa kita mendapatkan angka yang kira-kira2n
berurutan. Namun, kami juga dapat mencatat bahwa untuk langkah hingga n , S n + 1 selalu dibatasi oleh n +1 , yang berarti bahwa tidak ada langkah swapping yang dapat menukar dua angka yang keduanya lebih besar dari n . Oleh karena itu, angka yang masih perlu diproses akan kurang dari atau sama dengan nilai awal mereka. Karenanya,2n + 1
juga terikat untuk urutan itu sendiri.Saya pikir menemukan argumen untuk panjang langkah akan lebih sulit.
sumber
CJam,
45 4039 byteHanya pendekatan yang naif.
Dapat bermain golf lebih lanjut.Fungsi swap array hilang terlalu banyak.Bagaimana itu bekerja:
Cobalah online di sini
sumber
Haskell, 95 byte
Contoh penggunaan:
p 70
->139
Saya tidak menyimpan urutan dalam daftar atau larik. Saya berulang kali memperbarui fungsi identitas ke fungsi dengan dua elemen dari langkah saat ini ditukar. Setelah
n
langkah-langkah saya memanggil fungsi yang dihasilkan dengan parameter1
.sumber
J, 63 byte
Penggunaan dan tes:
Cobalah online di sini.
sumber
Pyth,
555351Mungkin bisa bermain golf lebih lanjut.
Mungkin menjadi sangat lambat untuk besarn
karena saya malas untuk mencari tahu berapa lama array yang saya butuhkan dan hanya menggunakann^n
satu.Terima kasih kepada Volatility dan Martin Büttner karena telah menunjukkan bahwa saya dapat menggunakan maksimum
3n
.Penjelasan
sumber
2*n
untuk besarn
, dengan maksimum3*n
untukn=1
.2n+1
, yang seperti yang Anda katakan memiliki maksimum3
untukn=1
dan (dengan cara) konvergen2n
. Ini tidak terlalu mengejutkan karena itu adalah maksimum untuk urutan yang tidak diijinkan, dan tidak ada langkah dalam proses yang dapat meningkatkan angka yang masih di depan. Saya mungkin menambahkan ini ke jawaban saya..a
ekstensi saya untuk pekerjaan yang baik! Ada banyak lagi barang dalam perjalanan, tetapi isaac sedang tidur sekarang: github.com/isaacg1/pyth/pull/32doc.txt
pada GitHub untuk manual) dan melihat pembaruan. Untungnya, karena saya bisa saja melewatkannya dan menulis implementasi kustom ...Python 2,
117106101Menggunakandict
(peta) untuk menyimpan nilai untuk menggunakan indeks arbitrer.g(n)
adalah fungsi mengembalikann
item th. Kemudian hanya mengulangiinput-1
waktu dan menampilkan item pertama.Ternyata lebih pendek menggunakan metode dari jawaban Pyth saya.
Terima kasih kepada xnor karena telah menghemat 5 byte.
sumber
b,c=a[i:i+2]
. Juga,b+c
cukup singkat sehingga menyimpannya ke variabels
kehilangan karakter hanya dengan menulisnya dua kali.Go 150
Tidak disatukan, tidak ada yang rumit, sebagian besar dicuri dari @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
sumber
Jawa, 162
Penjelasan
sumber
dc,
134132131 byteGunakan
echo $n $code | dc
, di mana$n
adalah n dan$code
adalah ... kode ( terkesiap ). Kutip secukupnya.Sunting: Kecuali jika Anda mengganggu saya untuk penjelasan, saya tidak akan pernah sampai ke sana.
sumber
Perl 5, 131
Solusi naif (yaitu implementasi langsung dari definisi). Subrutin, dibutuhkan input sebagai daftar
1
panjang yang diinginkan.Visualisasikan hasilnya dengan mis
print sub...->(1,1,1,1,1)
.Penjelasan:
map$a[$_]=$_,1..3*@_
membangun array@a
, mengindeks setiap integer dengan sendirinya dari 1 hingga 3 kali ukuran@_
(input).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
ulangi switcheroo berulang kali (satu kali lebih sedikit dari ukuran@_
), beralih$a[$a[$_-1]+$a[$_]]
dengan$a[abs($a[$_-1]-$a[$_])]
sebagai$_
berkisar dari 2 sampai ukuran@_
.Dan kemudian subrutin kembali
$a[1]
.sumber
Perl 5 , 90 + 1 (-p) = 91 byte
Cobalah online!
sumber