Menurut beberapa kisah kontroversial , bau tak sedap dalam satu wrod deos tidak terlalu berpengaruh pada raednig, sama besarnya dengan para penganut dan pengajar yang macth dengan orignial wrod.
Jadi, untuk bersenang-senang, apa fungsi terpendek untuk mengacak urutan huruf dalam sebuah kata sambil mempertahankan huruf pertama dan terakhir?
Inilah tikaman saya dengan JavaScript. Semua spasi dihapus pada 124 130 karakter.
function r(w) {
var l=w.length-1;
return l<3?w:w[0]+w.slice(1,l).split("").sort(function(){return Math.random()-.5}).join("")+w[l];
}
JavaScript lebih pendek selalu diterima.
- Edit: pemeriksaan panjang ditambahkan. Fungsi tidak boleh gagal untuk kata-kata pendek.
r=id
.id
adalah fungsi identitas. Saya masih ingin melihat solusi Haskell untuk masalah ini dalam waktu kurang dari 100 karakter.Jawaban:
Haskell, 4 karakter
Fungsi trinithis yang diusulkan sebenarnya sesuai dengan spesifikasi:
Ini mengembalikan string tidak berubah, sehingga menjaga karakter pertama dan terakhir tetap di tempatnya dan melakukan permutasi semua karakter lainnya.
Jika seseorang tidak puas dengan distribusi probabilitas permutasi, berikut adalah solusi yang menghasilkan distribusi yang lebih baik. Ini jelas jauh lebih kompleks:
Haskell,
110120107 karakterContoh program yang menggunakan fungsi ini:
sumber
fmap((a:t!!i:).tail)
J,
262423 karaktersumber
#?#
adalah satu char lebih pendek dari?~@#
Ruby, 44 karakter
Juga berfungsi untuk kata-kata pendek, yaitu kata-kata dengan satu, dua atau tiga karakter dikembalikan tidak berubah.
Sunting: Menggunakan ide array-splat Ventero menyimpan char lain.
sumber
Ruby 1.9, 46 karakter
sumber
Naskah Golf
Sebagai "fungsi" (bernama kode kunci): 20 karakter
Saat beroperasi pada elemen paling atas di tumpukan: 16 karakter
sumber
9
dengan9.?
.C ++, 79 karakter ( dengan rentang periksa )
C ++,
8165 karakter ( tanpa rentang periksa )Menggunakan referensi lewat alih-alih mengembalikan hasilnya mengurangi 10 karakter dari solusi mana pun.
Program lengkap, membaca serangkaian kata dan mengacaknya:
Semangat: jangan membangun apa yang sudah ada di sana.
Oh, dan cek melimpah adalah untuk wusses.sumber
std::random_shuffle
baru bagi saya. btw saya pikir Anda lupa#include<string>
kode lengkap Anda.Python, 86 karakter
Dan inilah contoh menggunakannya:
Ini adalah latihan golf kode pertama saya. Setelah menyelesaikan masalah saya memutuskan untuk melihat jawabannya dan tidak heran jawaban saya tidak unik. Ini menyenangkan: o)
Saya memang membuat satu perubahan setelah melihat tanggapan lain dan itu mengubah pernyataan impor saya untuk menggunakan alias. Ide yang hebat. ;Hai)
sumber
from random import*\nf=lambda w:w[0]+''.join(sample(w[1:-1]),len(w)-2)+w[-1]
).C (K&R) - 88
8687karakterTidak ada fungsi built-in swap atau shuffle di C, jadi saya harus melakukannya secara manual :(
Contoh Program dengan Ungolfed r ():
Sunting : perbaiki bug ketika s terdiri dari kurang dari 3 karakter (terima kasih kepada pengguna karena memperhatikannya!)
sumber
strfry
.char s[] = "na"; // not anticipated
python,
8779759392 karakter (menangani string dengan panjang 0,1)EDIT: Awalnya pikir itu seharusnya membagi kata string (yang dilakukan pada 128 karakter; sekarang pada 87 karakter diperlukan). Argh, buruknya kemampuan membaca saya.
EDIT 2: Ubah dari fungsi def ke fungsi lambda dari def untuk menyimpan 6 karakter. Mengasumsikan sampel sudah diimpor ke namespace (
from random import sample
) dapat membawa ini ke ~ 60).EDIT 3: "len (w [1: -1])" (12 chars) menjadi "len (w) -2" (8 chars) per saran bagus gnibbler.
EDIT 4: JBernando menyelamatkan satu char (telah mempertimbangkan
from random import *
dan melihat itu setara - tidak menyadari ruangimport *
tidak diperlukan); pengguna tidak dikenal menambahkan 19 karakterw if len(w)<4 else
untuk menangani 0 dan 1 string char dengan benar.EDIT 5: Menyelamatkan trik golf kode char lain per booth.
if len(w)<4 else
untukif 4>len(w)else
.sumber
len(w)-2
bukanlen(w[1:-1])
?C ++,
11197 karakterIni adalah program lengkap untuk mereka yang ingin mengujinya:
Sunting
Sadar tidak perlu acak kedua indeks swap, menyimpan variabel dan beberapa karakter lagi.
sumber
php (68 karakter)
lebih pendek (60 karakter)
sumber
.
bukan\w
.use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join('',shuffle split//,$2).$3;}
Itu 87 karakter . Tanpa garis penggunaan, itu 62 karakter .Perl -
96 (atau 71) karakter84 (atau 59) karakterInilah yang saya temukan di Perl. Pergi melalui beberapa cara berbeda untuk melakukannya tetapi ini tampaknya terpendek dari apa yang dapat saya pikirkan sejauh ini, yaitu 97 karakter.
Padahal, jika Anda memotong baris 'use' (yang saya kira valid, karena orang lain mengecualikan #include baris dalam program C mereka) saya dapat memotongnya lebih jauh menjadi 71 karakter :
EDIT Disarankan agar saya mencoba melakukan ini dengan menerapkan metode @tobius. Dengan cara ini saya menurunkannya menjadi 84 karakter , atau dengan menghapus baris penggunaan , 59 karakter :
sumber
use List::Util 'shuffle';sub r{($b,@w)=split//,$_[0];$e=pop@w;join'',$b,(shuffle@w),$e}
use List::Util 'shuffle';sub r{$_[0]=~m/(.)(.+)(.)/;$1.join'',shuffle split//,$2.$3}
Ruby,
7775 karakterSolusi Scala saya dalam bahasa yang sedikit kurang verbose. Saya bukan ahli Ruby, jadi mungkin ada ruang untuk perbaikan.
sumber
Ruby 1.9,
77484644 karakterPenafian: Saya menyetel ini berdasarkan jawaban peringkat tertinggi - perhatikan jawaban yang sama persis di kemudian hari. Anda dapat memeriksa sejarah bahwa saya telah mempertahankan ide asli saya tetapi berubah dari ruby 1.8 ke ruby 1.9 untuk lambda pendek dan
shuffle
.Jika kata-kata kosong diizinkan maka
5654 karaktersumber
Python 3,
949391 karakterMenggunakan teknik yang berbeda. Mungkin juga bekerja di Python 2.
The
... if x[0:-1] else x
memberix
jika panjangnya adalah 1 (jika tidak akan diduplikasi). Fungsi dengan demikian bekerja untuk string dengan panjang 0 dan 1.Ini
sample()
dari https://stackoverflow.com/questions/2668312/shuffle-string-in-python/2668366#2668366 .Karena itu salah satu ekspresi, kita bisa menggunakan
lambda
(menghilangkanreturn
,def
dan sepasang kurung).Edit:
from random import*
untuk menyimpan 1 karakter, setelah pengiriman Python lainnya.sumber
x[0:-1]
menjadix[:-1]
?JavaScript -
118122 karakterJavaScript lebih pendek - 118 karakter tanpa spasi. Menggunakan algoritma yang kira-kira sama dengan OP, tetapi dengan sedikit rantai. Saya mencoba banyak rekursi, dan saya mencoba beberapa iterasi, tetapi mereka semua cenderung macet dalam beberapa cara.
sumber
return z?a+...+z:w;
sebagai pemeriksaan panjang implisit akan berurutan. Asumsi diam adalah bahwa fungsi tersebut hanya akan menerima kata-kata "valid".a
dielse
ternary. Diedit, dan hingga 122 karakter.a
akan salah untuk input dua huruf. : - Sialan lain kali aku akan memenuhi persyaratan dengan lebih hati-hati.z
hanya akan ditentukan jika kata itu satu huruf (atau kurang).D, 62 karakter
oke saya curang dengan array char normal alih-alih string nyata (yang tidak berubah char [] jadi tidak ada pengocokan di tempat)
sunting dengan panjang periksa itu membutuhkan 14 lebih
sumber
return s;
dan char [] mengembalikan tipe 11 karakter lainnyaimport std.random;
, dan bukan hanya fungsinya.char[] s
(untuk membuatnyachar[]s
), tapi saya belum pernah menggunakan D selama bertahun-tahun.php 5.3 (60 karakter)
Ditingkatkan menjadi 56 karakter dan tidak lagi membutuhkan versi 5.3:
sumber
true
untuk string pendek.Perl - 111 karakter (tanpa menggunakan fungsi pustaka)
Penggunaan :
sumber
Python
Ini
9089112 karakter python!Sunting 1: sebagai fungsi kali ini!
(terima kasih gnibbler)Sunting 2: sekarang menangani kata-kata pendek
(terima kasih pengguna tidak diketahui)sumber
Scala, 135
139142156karakter-7: dihapus ': String' (tipe pengembalian dapat disimpulkan)
-7: dihapus 'kembali' (ekspresi terakhir adalah nilai balik)
-3: factored
s.size-2
out-4:
toCharArray
->toArray
sumber
Python, 86 karakter
Slnicig aman, jadi tidak ada ckhnceig yang dapat dilakukan. Wkros di semua leghtn.
sumber
C ++ 11: -
6866 karakterprogram lengkap:
sumber
string s; cin >> s;
Ruby 1.9, 43 karakter
r = w [0] + [* w [1 ..- 2] .chars] .shuffle.join + w [-1]
Belum berfungsi untuk 1 string panjang karakter (menduplikasi karakter itu), dan gagal untuk String kosong.
sumber
Python - 76 karakter
sumber
R, 104 (126)
Pemakaian:
fungsi di bawah ini berfungsi dengan kata-kata dengan panjang kurang dari 3:
sumber
Python, 102 karakter
Tidak ada impor! Berfungsi untuk kata-kata 1 karakter ke atas. Ini adalah entri golf pertama saya dan saya terinspirasi oleh entri BlueEyedBeast dari kode terpendek untuk menghasilkan output non-deterministik untuk ide menggunakan id (Object) .
Penjelasan: Itu membuat daftar huruf dari input mengecualikan yang pertama dan terakhir, dan berulang kali muncul dari daftar ini dan menambahkan yang baru sampai kosong. Indeks tempat ia muncul adalah id (7)% len (daftar kami muncul dari). Karena id (7) adalah alamat memori objek 7, itu pada dasarnya acak. Jadi sekarang kami memiliki daftar surat acak yang diacak dari pusat input asli. Yang kita lakukan sekarang adalah menambahkan huruf pertama dan terakhir dari output asli yang sesuai dan kita mendapatkan output yang kita inginkan: (huruf pertama) + (tengah acak) + (huruf terakhir).
sumber
R,
959291 karakterManfaatkan evaluasi malas R untuk menghitung a dan b sebagai parameter fungsi, menghemat ruang dengan digunakan kembali nanti. Juga tidak seperti jawaban R lainnya ini bekerja untuk semua kata> 1 karakter. Contoh di bawah ini:
Sunting:
DigantiDigantikan [[1]] dengan el ()unlist()
dengan[[]]
sumber
D: 55 karakter
program lengkap:
sumber
else s
bagian itu hilang?randomShuffle()
ada di tempat.randomShuffle(s[1..$-1])
bisas[1..$-1].randomShuffle
IIRC (kecuali itu dalam versi D lebih tua dari posting ini)Erlang,
188172132 karakterSaya masih belajar Erlang sehingga tips untuk membuat ini lebih pendek dihargai.
kode lengkap (modul string_shuffle):
Sunting
Mengambil bagian acak sebagai fungsi terpisah yang tidak lagi membutuhkan kepala dan ekor daftar untuk diedarkan.
Edit 2
Direstrukturisasi untuk menghapus salah satu
f
pola fungsi, mengubah fungsi acak untuk hanya menerima dua parameter, diubahlists:delete
untuk--[]
, bertukarlists:reverse
panggilan untuklists:last
sumber