The nomor Shotgun adalah urutan dengan definisi agak sederhana tapi beberapa struktur menarik. Mulai dengan bilangan asli:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Sekarang ambil semua angka pada indeks yang dapat dibagi 2 , kelompokkan menjadi pasangan, dan tukar angka dalam setiap pasangan:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Sekarang lakukan hal yang sama dengan indeks yang dapat dibagi 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
Dan kemudian untuk 4 , 5 , 6 , dan seterusnya:
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Setelah k langkah tersebut, angka k +1 pertama akan diperbaiki. Jadi kita dapat mendefinisikan urutan tak terhingga dari angka-angka Shotgun sebagai batas membiarkan k pergi hingga tak terbatas. 66 angka pertama adalah:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Fakta menyenangkan: Meskipun diperoleh dengan hanya mengubah bilangan asli, urutan ini tidak mengandung bilangan prima.
Tantangan
Diberikan bilangan bulat n > 0
, cari n
nomor Shotgun. Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengembalikan output atau mencetaknya ke STDOUT (atau alternatif terdekat).
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.
Papan peringkat
Ini mendapatkan lebih banyak jawaban daripada yang saya kira, juga beberapa orang bersaing dalam bahasa yang sama. Jadi di sini adalah Cuplikan Stack untuk menghasilkan leaderboard reguler dan tinjauan pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=47338;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
10
,21
,25
dan30
tidak muncul baik, misalnya.k
iterasi th,k
elemen th dalam array akan dipindahkan ke2k
posisi th, dan tidak akan disentuh lagi sampai2k
iterasi th, di mana saat itu akan dipindahkan ke4k
posisi th, ad infinitum. Perdana tidak dialihkan sampai gilirannya tiba, sehingga untuk berbicara, sehingga semua bilangan prima bisa dikocok ke depan. Tetapi kita dapat dengan mudah membuat daftar korban yang tidak bersalah hanya dengan mencetak elemen pertama yang akan ditransfer pada iterasi 2 dan setiap iterasi aneh. Daftarnya berbunyi: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 54, 41, 43, 65, ...Jawaban:
Pyth, 19
22Implementasi jawaban golfscript @ PeterTaylor yang cukup naif .
Cobalah online di sini
Ini menggunakan trik yang sama untuk mengubah loop sementara menjadi lipatan seperti program Pyth lainnya di bawah ini.
Salinan naif dari algoritma @ Sp3000 yang diterjemahkan ke Pyth.
Anda dapat mencobanya online di sini
Kurangi (nama python untuk lipatan) untuk meniru loop sementara. Ini menyebutkan tentang
range(input, 2)
yang di Pyth berhasilrange(2, input)[::-1]
. Golf yang berhubungan dengan Pyth lainnya melibatkan penggunaannot
alih-alih<2
dan menggunakany
mode tersembunyi untuk menggandakan nilai argumen numerik.sumber
> <>,
5245 byteHalaman Esolang untuk> <>
Ada banyak elemen penyalinan dan pemindahan, berkat beberapa modulo dan multiplikasi yang dibutuhkan. Logikanya persis sama dengan solusi Python saya .
Mengambil input melalui titik kode dari STDIN, mis
"!" = 33 -> 75
.sumber
-v
diperhitungkan sebagai tiga: /Python 2, 58 byte
Seperti sebagian besar jawaban lainnya, idenya adalah untuk bekerja mundur.
Mari kita panggil langkah
k+1
langkahi
, sehingga pada langkahi
semua kelipatani
ditukar. Kami membutuhkan dua pengamatan sederhana:n
dalam array hanya ditukar pada langkahi
jikan
dapat dibagi dengani
,n/i mod 2
. Jika ini adalah 1 Anda adalah angka yang lebih rendah (dan akan bertukar), jika tidak, Anda adalah angka yang lebih tinggi (dan akan bertukar ke bawah).Ini memberi kita algoritma untuk bekerja mundur. Mari kita coba dengan 6, mulai dari langkah terakhir (langkah
i = 6
):Jadi sekarang kita tahu nomornya berasal dari posisi 12. Lalu:
Jadi sekarang kita tahu itu berasal dari 16 sebelum itu. Akhirnya:
Karena ini adalah langkah pertama (ingat,
k+1
), kita selesai dan angka yang berakhir di posisi 6 berasal dari posisi 14, yaitu angka senapan ke-6 adalah 14.Jadi sekarang untuk penjelasan Python:
sumber
i-1
sebagai~-i
while
. Kerja bagus, Sp3000.u+G**H!%GHty%/GH2rhQ2Q
Haskell, 68 byte
Mungkin golf lebih jauh, terutama baris pertama. Ini mendefinisikan fungsi
s
yang mengambiln
dan mengembalikann
nomor senapan.Penjelasan
Fungsi helper
#
mengambil dalam dua angkan
dank
, dan mengembalikank
nomor ke dalam daftar yang ditentukan dengan menerapkan operasi pertukaran pasangan ke setiapn
nomor ke. Misalnya, menerapkannya ke 20 angka pertama dengann = 4
hasil ini:Hasil
s n
diperoleh dengan mengurangi ("melipat") daftar[2..n]
dengan fungsi urutan kedua(.).(#)
, yang mengambil angkam
dan fungsif
(awalnya fungsi identitasid
), dan mengembalikan fungsi yang mengambilk
dan mengembalikanf (m # k)
. Misalnya, dalam kasus inin = 4
daftar[2,3,4]
direduksi menjadi fungsi yang mengambilk
dan mengembalikanid (4 # (3 # (2 # k)))
. Theid
hanya diperlukan untuk kasus dasarn = 1
, di mana daftar kosong. Akhirnya, kami memberikan fungsi ini inputk = n
, memperolehn
nomor senapan.sumber
CJam, 32 byte
Cukup mengikuti spek to the point. Menjalankan instruksi pada perangkat yang lebih besar sehingga tidak mempengaruhi angka ke- n .
Cobalah online di sini
sumber
Ruby, 92 byte
Upaya golf kode pertama saya. Tidak berdasarkan jawaban lain.
Sekarang saya telah melihat beberapa yang lain, saya perhatikan bahwa kebanyakan hanya mendefinisikan fungsi, bukan program lengkap yang menerima input dan menghasilkan output. OP meminta program lengkap dengan input dan output. Apakah biasa mengabaikan persyaratan seperti itu?
84 Bytes
Setelah melihat jawaban lain dan menyadari bahwa solusi berulang mungkin dilakukan.
sumber
ARGV
ke dunia$*
ajaib. 2. Tidakto_s
perlu. 3. Alih-alih menugaskand
untukn
pada baris terpisah, hanya melakukand=n=...
mencukur karakter. Kerja bagus untuk golf pertama Anda! :)n+=
baris tidak diperlukan, dan kedua kemunculan==0
dapat dengan aman diubah<1
.Python 2,
9779 karakterIni menentukan untuk setiap indeks nilai yang benar dengan secara rekursif mengejar angka mundur. Algoritma itu ditemukan secara independen.
sunting: Sekarang hanya mencetak
n
nomor ke-empat dan bukann
nomor pertama . Tentu saja pendekatan berulang akan lebih pendek, tetapi saya tidak ingin menyalin kode Sp3000.sumber
g(i,i)
bagian yang sangat mengganggu ...print
pernyataan itu.Haskell, 79 byte
Penggunaan:
p 66
output mana145
Tidak banyak menjelaskan: Fungsi
#
secara rekursif menghitung jumlah senapan di posisii
langkahs
.p n
mengembalikan angka pada posisin
langkahn
.sumber
k, 41 byte
{{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]}
{...}
lambda, x dan y adalah argumen 1 dan 2 implisit$[b;t;f]
operator ternary, mengevaluasi b diikuti oleh t / f masing-masingb!a
a modulo b_
lantai, melemparkan hasil pembagian ke int%
divisi{...}/[x;y]
prime {...} dengan x dan terapkan pada daftar y, sama dengan f [f [.. f [f [x; y0]; y1]; .. yn-1]; yn]|
membalikkan!
fungsi iota, menghasilkan daftar 0 hingga n-1sumber
Common Lisp,
11391(berulang: 91)
(asli, rekursif: 113)
Contoh
Dengan versi rekursif:
Tes
Cek dan langkah-langkah untuk versi berulang:
sumber
Mathematica,
5349 byteSaya memutuskan untuk menerapkan implementasi referensi saya. Ini
∣
adalah simbol Unicode untuk "membagi", dan menghitung selama 3 byte. Kalau tidak, ini menggunakan algoritma yang sama seperti orang lain.Ini mendefinisikan fungsi yang tidak disebutkan namanya yang mengambil
n
sebagai parameter tunggal dan mengembalikann
nomor senapan.sumber
GolfScript, 27 karakter
Penjelasan
Jika
f(i, n)
nilai pada posisin
setelahi-1
transformasi, kita milikidi mana
^
menunjukkan bitor xor; diberi inputn
, kami ingin menghitungf(n, n)
.Konversi dari fungsi rekursif ke loop tidak menarik; yang menarik adalah caranya
dapat ditulis ulang. Pendekatan yang lebih jelas adalah mengatakan bahwa itu harus
untuk beberapa orang
g
. Jelasg
bergantian antara1
dan-1
, karena posisi bertukar secara bergantian naik dan turun; sejakg(1) = 1
(karena1
swap hingga2
), kita milikidi mana
**
menunjukkan eksponensial. Penghematan akhir berasal dari penulisan ulang ini sebagaiPembedahan
sumber
u-G*H^_!%GH/GHrhQ2Q
Jika Anda tidak ingin memposting ini sendiri, beri tahu saya / tambahkan ke jawaban CW.CJam, 24 byte
Demo online
Ini adalah port jawaban GolfScript saya , meminjam loop dari jawaban CJam Martin dan mengeksploitasi
divmod
operator CJam . ( Saya bilang itu akan berguna!).sumber
Julia,
6157 byteIni menciptakan fungsi tanpa nama yang mengambil argumen tunggal
n
dan mengembalikann
nomor senapan. Untuk menyebutnya, berikan nama, misf=n->(...)
.Contoh:
Saat ini didasarkan pada jawaban Python @ Sp3000 yang mengagumkan . Saya akan meninjau kembali ini segera karena harus ada cara yang lebih pendek untuk melakukan ini di Julia daripada apa yang saya lakukan di sini. Masukan apa pun diterima, seperti biasa.
sumber
GML, 76 byte
Informasi tentang GML
sumber
CJam,
2827 byteJadi ini sedikit memalukan ... sebelum memposting ini, saya mencoba bermain golf ini sendiri dan mendapatkan 30 byte di CJam. Belum ada jawaban yang ada yang mengalahkan itu. Sementara itu saya juga berhasil mencukur tiga byte lagi. Ada adalah solusi Pyth pendek di komentar, tapi tidak ada yang lebih pendek telah diposting di sebuah jawaban, jadi di sini adalah. Mungkin itu mengilhami orang APL / J untuk mencoba sedikit lebih keras (atau seseorang benar-benar memposting solusi Pyth), sebelum saya harus menerima jawaban saya sendiri. ;)
Uji di sini.
Penjelasan
sumber
J,
3432 byteAkan mencoba golf sedikit lebih dan menambahkan penjelasan nanti.
Cobalah online di sini.
sumber
TI-Basic 83/84, 40 byte
Informasi tentang TI-Basic
sumber
Ruby,
5747 byteIni pada dasarnya adalah solusi Python Sp3000 (dengan saran xnor ) yang diterjemahkan ke Ruby. Saya mungkin bisa bermain golf di beberapa tempat.
sumber