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!

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

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)

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.


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


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

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.