Mengepang algoritmik - untuk hari ibu

11

Tugas:

Tugas Anda adalah membuat program yang, ketika diberi sejumlah helai dan jumlah iterasi dari jalinan, akan memberi tahu kemana setiap untai pergi. Aturannya adalah sebagai berikut:

  • Jumlah helai akan selalu ganjil, dan antara 3 dan 6000 (termasuk)
  • Ketika Anda mulai, untaian akan dibagi menjadi 2 (hampir) tandan yang sama, leftdan right. The leftakan memiliki satu helai lebih ketika Anda mulai.

Untuk input 7:

/ / / / \ \ \
1 2 3 4 5 6 7
  • Setiap iterasi, untaian sisi terluar dengan lebih banyak untaian akan diletakkan di tengah menghadap ke arah yang berlawanan. Pusat didefinisikan sebagai antara helai menghadapi berlawanan: ////middle\\\.

1 iterasi input 7 (untai 1 dipindahkan ke tengah):

/ / / \ \ \ \
2 3 4 1 5 6 7

Contoh:

Memasukkan:

3 4

Perhitungan:

1 2 3
 \
2 1 3
   /
2 3 1
 \
3 2 1
   /
3 1 2

Keluaran:

3 1 2

Aturan:

  • Anda tidak perlu menampilkan garis miring untuk arah untai, hanya angka.
  • Anda hanya perlu menampilkan angka setelah iterasi terakhir.
  • Output Anda akan menjadi id yang dibatasi ruang dari untaian
  • Masukan akan dalam bentuk: strands [space] iterations
  • Jumlah untai selalu ganjil, dan 3 <= x <= 6000
  • Ini , jadi kode terpendek menang!
Dokter
sumber
3
Bukankah 3 sampai 5999 karena 6000 tidak aneh sehingga Anda tidak akan memiliki 'hingga 6000'?
kitcar2000
jadi output untuk 11 2apa 2345611178910?
Martin Ender
1
@Howard Kiriman Anda melanggar perubahan saya
TheDoctor
1
@TheDoctor Jawaban saya ada di sana sebelum perubahan Anda.
Howard
1
Saya pikir contoh Anda harus dibaca 123 -> 213 -> 231 -> 321 -> 312.
Howard

Jawaban:

6

GolfScript, 33 karakter

~\),(@{:^1$[=]:y-.,2//y*^~}*;' '*

Masukan harus diberikan di stdin.

Contoh (Anda dapat menguji secara online ):

> 7 1
2 3 4 1 5 6 7

> 3 4
3 1 2

> 11 2
2 3 4 5 6 11 1 7 8 9 10
Howard
sumber
6

Python: 179 240 , 152 karakter

Pertama, 179

Untuk Nuntaian dan iiterasi, jawaban ini menggunakan O(1)ruang dan O(N)waktu. Saya hanya menghitung posisi akhir setiap untai, tidak pernah mengulangi posisi menengah!

suntingan besar: mengubah jawaban ini dengan mengubah persyaratan menjadi aljabar boolean. Saya juga menulis penjelasan panjang lebar tentang cara kerjanya. TL; DR: pola rumus, pembagian modulo.

from sys import *
N,i=map(int,stdin.readline().split())
h,t=N/2,3*N
f=lambda p:(p>N)*(t/2-(p&-2))+p/2+1
for s in xrange(N):print f((2*s+1+(s>h)*(t-4*s-2)+i*(N+1-N*(s!=h)))%(2*N)),

Sekarang 152

Ini lebih python golf. (sunting: terima kasih kepada Alex Thornton untuk mengedit dari 165 hingga 152)

from sys import*;l=map;r=range;n,m=l(int,stdin.readline().split());b=r(1,n+1)
for k in r(m):v=b.pop((0,n-1)[k%2]);b.insert(n/2,v)
print' '.join(l(str,b)
salah
sumber
Sudah golf lebih jauh lagi ke 151 jika Anda tertarik: pastebin.com/1pbwax6s
Alex Thornton
perubahan sederhana, tetapi sangat efektif. Terima kasih!
salah
Saya pikir Anda bisa memotongnya lebih jauh dengan menghapus ldan vvariabel dan mengubah insertke tugas slice.
user2357112 mendukung Monica
Saya yakin golf bisa lebih pendek. Jujur saya hanya mengharapkan komentar pada yang pertama jika ada!
Salah
Saya tetap menulis penjelasan dan memperbarui posting :)
wrongu
2

Python 2 (109) / Python 3 (121)

Python 2

s,n=map(int,raw_input().split())
b=range(s)
for i in range(n):b[s/2:s/2]=[b.pop(0-i%2)]
for x in b:print x+1,

Python 3

s,n=map(int,input().split())
b=list(range(s))
for i in range(n):b[s//2:s//2]=[b.pop(0-i%2)]
for x in b:print(x+1,end=' ')

Kode tersebut harus disuap oleh Python 2 untuk menampilkan keunggulan golfnya di atas Python 3: rentang menjadi daftar, pembagian membulatkan ke int, mencetak tidak memulai baris baru. Yang aneh 0-i%2adalah karena -i%2dinilai sebagai (-i)%2.

Mungkin ada pendekatan yang lebih efisien daripada iterasi, yaitu menghitung setiap hasil akhir secara langsung. Operasi menjalin memiliki periode 2 * s, sehingga tidak bisa rumit.

Tidak
sumber
2

Ruby, 105

Hanya banyak mengatur manipulasi. Dorong, letuskan, balikkan dan geser! Saya mencoba tidak mengubah input ke integer, tetapi menambahkan sekitar 20 karakter.

n,i=$*.map(&:to_i)
f=l=(1..n).to_a
t=r=l.pop(n/2).reverse
i.times{f,t=t<<f.shift,f}
$><<(l+r.reverse)*' '

ldan r( leftdan right) adalah antrian "utas". rightterbalik sehingga kami mulai menarik dari luar.

tdan f( todan from) memulai sebagai rightdan left, masing-masing, tetapi seiring berjalannya waktu kita terus menukar mereka sehingga kita selalu dapat menggeser "utas" terakhir dari fromdan mendorongnya ke to( f,t=t<<f.shift,f). Ini menghemat banyak ruang.

Kemudian kita kembali lagi rightpada bagian akhir.

Changelog:

2.2 105 oh yeah, peta bisa mengambil proc

2.1 108 Dan sebenarnya, balikkan saja sebagai bagian dari manipulasi.

2.0 116 tidak menggunakan array sementara itu. Alih-alih menggunakan dua variabel pointer kita dapat memanipulasi dan terus menunjuk kembali. Maka hanya menampilkan akhirnya

1.0 123 ide awal

Bukan itu Charles
sumber
0

Jawa, 270 karakter

golf:

import java.util.*;class B{public static void main(String[] a){int n=Integer.valueOf(a[0]),t=Integer.valueOf(a[1]),i=0;List<Integer> r=new ArrayList<Integer>();for(;i<n;i++){r.add(i+1);}for(i=0;i<t;i++){int k=i%2==0?0:n-1;r.add(n/2,r.remove(k));}System.out.println(r);}}

tidak golf:

import java.util.*;
public class Braid {
    public static void main(String[] args) {
        int num = Integer.valueOf(args[0]);
        int iterations = Integer.valueOf(args[1]);

        //populate array
        List<Integer> arr = new ArrayList<Integer>();
        for (int i=0; i < num; i++) {
            arr.add(i+1);
        }
        for (int i=0; i < iterations; i++) {
            int index = i%2==0?0:num-1; 
            arr.add(num/2, arr.remove(index));
        }
        System.out.println(arr);
    }
}

Jalankan online

Hopper Hunter
sumber