Pengaturan Ulang Deranged

14

Tugas Anda adalah menulis program komputer sehingga ketika dipotong menjadi garis-garis (terpecah pada karakter baris baru) setiap pengaturan garis akan menghasilkan angka yang berbeda antara 1 dan n! (di mana n adalah jumlah total baris). Tidak ada angka yang harus dikeluarkan oleh dua pengaturan yang berbeda dan setiap pengaturan harus menampilkan angka pada kisaran ini. Karena ada n! cara untuk mengatur garis-garis program ini berarti setiap angka harus dihasilkan oleh satu pengaturan ulang.

Misalnya program python

print 1;"""
print 2;"""

Memiliki dua pengaturan

print 1;"""
print 2;"""

dan

print 2;"""
print 1;"""

Output pertama 1dan output kedua 2.

Anda dapat menggunakan format output apa pun yang standar dalam bahasa yang Anda gunakan. Anda tidak boleh menggunakan boilerplate apa pun. Saya pikir tantangan ini lebih menarik jika Anda harus mengerjakan format apa pun yang ditekankan oleh bahasa.

Mencetak gol

Skor Anda akan menjadi jumlah baris dalam program Anda dengan skor yang lebih tinggi menjadi lebih baik. Anda dapat memilih untuk menampilkan angka dari 0 hingga n! -1 jika Anda mau.

Posting Rock Garf Hunter
sumber
3
Bagaimana dengan jawaban yang menyajikan konstruksi yang berfungsi untuk semua n? Apakah mereka semua terikat pada skor ∞?
Martin Ender
@ MartinEnder Ya. ∞ adalah skor bagus. Jika Anda menemukan konstruksi seperti itu maka Anda menang.
Post Rock Garf Hunter
@ AdmBorkBork Ya setiap pengaturan harus menampilkan satu nomor. Mungkinkah itu lebih jelas?
Posting Rock Garf Hunter
1
@totallyhuman Aturan output standar untuk bahasa apa pun yang Anda gunakan. Saya akan memperbarui pertanyaan agar sepenuhnya jelas tentang ini.
Post Rock Garf Hunter
1
@EriktheOutgolfer Tanpa pemutus dasi. Martin mungkin telah menemukan cara untuk mencetak angka tak terbatas di CJam tetapi ada banyak bahasa lain untuk dicoba.
Posting Rock Garf Hunter

Jawaban:

7

CJam , skor: ∞

Setiap baris berbentuk

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

di mana xnomor dari 0ke n-1. Hasilnya dalam kisaran 0hingga n!-1.

Cobalah online! (Untuk n=3.)

Kredit ke jimmy23013 untuk kode yang menghitung indeks permutasi aktual. Saya hanya mengganti bit yang membaca input ];Lx+:Lyang membuang hasil dari baris sebelumnya dan kemudian menambahkan indeks dari baris saat ini ke variabel L(yang awalnya merupakan array kosong).

Martin Ender
sumber
Oh, aku memang menulis itu. Tapi tidak terlihat seperti golf ... (misalnya 0+:+) Saya pikir Anda bisa menggunakan versi yang jauh lebih pendek ,m!#.
jimmy23013
4

Perl: ∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

Perpanjang hingga panjang yang Anda suka

Akan cepat kehabisan memori karena penggunaan memori seperti O (n ^ n). Namun akan lebih mudah untuk mengganti pengindeks permutasi dengan kode O (n), lebih lama. Saya hanya menggambarkan cara yang dapat Anda gunakan END{}untuk tugas ini di perl. Semua END{}blok berjalan pada waktu keluar, tetapi hanya yang pertama yang dipanggil (yang terakhir dalam kode) yang akan menghasilkan apa saja karena /A/pengujian yang hanya berlaku sekali

Perhatikan bahwa $mpenghitung harus dihitung sebagai string karena sebagai angka itu akan meluap (lebih lambat dari akhir jagat raya tetapi prinsip yang diperhitungkan). Untuk alasan yang sama saya "menghitung" jumlah baris dengan membangun string As alih-alih menggunakan penghitung nyata meskipun ini melimpah akan terjadi bahkan kemudian.

Cara lain untuk melakukan ini di perl:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

Ini menggunakan fakta bahwa in foo = bar bardijalankan setelah foo. Versi ini omong-omong tidak gila waktu dan ruang tetapi itu membuat kode lebih lama

Namun ide lain adalah menggunakan DESTROYyang memiliki keuntungan bahwa hanya satu dari mereka yang akan dieksekusi. Saya tidak akan mengulangi kode pengindeksan permutasi yang sudah saya berikan dua contoh.

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

Atau menggunakan BEGIN:

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;
Ton Hospel
sumber
3

Jelly , ∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(Contoh dengan n=3.)

Cobalah online!

23 13 11 byte per baris.

Untuk program dengan n garis, garis akan memiliki format

; <i> ÇQŒ¿$⁼Q$?

di mana <i>mewakili angka literal idan setiap baris memiliki nilai berbeda untuki mulai dari 1hingga n. (Nilai untuk itidak benar-benar harus angka-angka spesifik ini, mereka hanya harus memiliki nilai positif yang unik.) Program ini tidak lagi digunakan ndalam struktur garis.

Bagaimana?

  • Tanpa argumen, Jelly akan memulai 0.
  • ;1 menambahkan 1 ke 0atau daftar aktif.
  • ⁼Q$adalah kondisional monad untuk pernyataan if ( ?) yang memeriksa apakah elemen daftar itu unik. Jika ya, tautan di atas disebut ( Ç) dan nomor lain ditambahkan ke daftar. Jika tidak unik, itu berarti kami telah membuka tautan pertama. Elemen yang diulang dihapus dari daftar ( Q) dan indeks permutasi ditemukan ( Œ¿). Perhatikan bahwa ada 0di awal daftar kapanŒ¿ diambil tetapi tidak mempengaruhi output karena nilai untuk isemuanya positif.

Fitur Jelly baru

Dengan Ƒquick yang baru ditambahkan , kita bisa menguranginya ⁼Q$menjadi , menghemat satu byte.

10 byte / baris (untuk satu digit)

;1ÇQŒ¿$QƑ?

Cobalah online!

dylnan
sumber
2

Brain-Flak , 3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

Cobalah online!

Saya memposting ini dalam obrolan sebelumnya, tetapi mudah-mudahan dengan mempostingnya di sini orang dapat membuatnya.

Penjelasan

Kami mulai dengan program dasar

(({}){})
({}())

Ini skor 2 sendiri. Untuk naik ke level berikutnya saya ingin menambahkan baris baru. Dugaan awal saya adalah

(()(){[()()]{}(<()>)}{})

Ini mengatur TOS ke 2jika itu nol dan tidak melakukan apa pun sebaliknya. Ini sebenarnya awal yang baik. Dengan dua baris lainnya kita bisa mendapatkan semua angka dari 1ke 6kecuali 4, karena ada 2cara untuk menghasilkan 2:

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

dan

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

Untuk memperbaiki ini, kami membuat jalur kami juga ditetapkan 2menjadi 4. Ini bisa dilakukan dengan

(()(){([()()]{})()(){[()()](<{}>)}}{})

Untuk kejelasan ini pada dasarnya mengimplementasikan fungsi Haskell

f 0 = 2
f 2 = 4
f x = x

Ini memperbaiki masalah kami karena salah satu program yang sebelumnya menghasilkan 2sekarang menghasilkan 4tanpa perubahan program lain.

Posting Rock Garf Hunter
sumber
2

Java 7, skor: ∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

Cobalah online!

Ini dapat mencetak 0 hingga n! -1 . Baris tambahan adalah format berikut (di mana INDEX adalah angka dari 1 hingga n! -1 ):

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

Metode ini bekerja dengan membaca sumbernya sendiri untuk menentukan urutan kelas yang tercantum di dalamnya. Sayangnya tidak ada metode yang lebih keren yang bisa saya temukan dengan mem-parsing file yang dikompilasi atau membuat ClassLoader kustom berkat bagaimana java melakukan kompilasi JIT. Saya kira saya bisa meminta setiap kelas tambahan hanya mencetak angka yang ditentukan secara statis tetapi ini tampak lebih menyenangkan. Itu juga akan membuatnya sehingga saya bisa menghapus Bantarmuka tetapi penilaian tidak didasarkan pada byte jadi saya akan membiarkan itu untuk bersenang-senang.

Cara kerjanya (tingkat tinggi):

Membaca kode sumbernya sendiri baris demi baris. Karena setiap baris mendeklarasikan kelas baru, kami menggunakan refleksi untuk membuat turunan dari kelas baru dan memanggil ametode yang harus dimiliki karena mengimplementasikan Bantarmuka.

Menyodok
sumber
1

Ruby , skor: ∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

Cobalah online!

Program ini memiliki 61 byte per baris (untuk n <10). Ini memiliki format dasar yang sama dengan solusi dylnan ; angka pertama di setiap baris akan menjadi nilai yang berbeda antara 1dan n, dan angka kedua di setiap baris akan menjadi n.

Saya berharap menemukan cara untuk menghindari termasuk ndalam program, tetapi saya tidak dapat menemukannya.

benj2240
sumber
1

Brain-Flak , 2 (dengan -d)

{}(@ltN)

Cobalah online!

Christopher
sumber
Untuk 2Anda dapat menggunakan ({}())dan (({}){}).
Posting Rock Garf Hunter
@WheatWizard mencoba membuat format yang dapat diperluas
Christopher
0

05AB1E , skor: 1.114.112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

Cobalah online! Diindeks 0. ˆ pada awal setiap baris mendorong karakter yang berbeda ke array global. Sisa kode dieksekusi sia-sia kecuali pada baris terakhir, di mana ia menggabungkan nilai-nilai ke dalam string, kemudian menemukan indeks permutasi. 1.114.112 adalah jumlah karakter Unicode yang mungkin pada saat penulisan (poin kode 48-57 adalah yang paling mudah ditunjukkan dengan tentu saja).

Neil
sumber