Biasanya, dikatakan bahwa "Melakukan X tanpa Y" dapat menjadi jebakan bagi pemula yang menulis tantangan ( sumber ). Namun, saya sombong dan berpikir bahwa saya pasti bisa membuat X tanpa Ys. Secara acak. Oh ya, ini akan baik.
Tantangan: Diberikan bilangan bulat ganjil yang n
lebih besar dari atau sama dengan 1, menampilkan mantan sisi panjang yang n
terbuat dari karakter ascii yang dapat dicetak secara acak tanpa huruf "y" dan "Y", dan spasi. Semua karakter yang diizinkan harus memiliki peluang yang bukan nol untuk terjadi, tetapi tidak harus seragam. Ini adalah kode-golf sehingga kode terpendek dalam byte menang. Anda harus, bagaimanapun, mengacak masing-masing karakter - yaitu, struts dari mantan tidak boleh sama, kecuali jika secara kebetulan.
Karakter muncul
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Membangun mantan
Panjang sisi 1:
x
Panjang sisi 3:
x x
x
x x
Panjang sisi 5:
x x
x x
x
x x
x x
dll.
Keluaran contoh
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Contoh implementasi
Anda tidak perlu menangani input yang tidak valid.
!
ke~
sansy
danY
y
dan然
.Jawaban:
Pyth,
28272625 byteSuite uji.
sumber
~
karakter, karena rentang tidak menyertakannya. Anda dapat memperbaikinya dengan mengubah~
kode ke karakter DEL literal.Ruby, 102 byte
Array#sample
tidak melakukan pengulangan untuk pengambilan sampel dari set karakter, tapi tidak apa-apa karena distribusi karakter tidak harus seragam sempurna! Fungsi rekursif, mengembalikan array garis.Cobalah online!
sumber
Sebenarnya, 62 byte
Ini adalah salah satu program Sebenarnya terpanjang yang pernah saya tulis.
Cobalah online!
Penjelasan:
Bagian 1 : mengatur daftar karakter
Cobalah online!
Bagian 2 : membangun array boolean untuk X
Cobalah online!
Bagian 3 : memilih karakter acak
Cobalah online!
sumber
Mathematica, 146 byte
Fungsi anonim. Mengambil angka sebagai input, dan mengembalikan string sebagai output.
sumber
Python 2, 171 byte
Dijamin untuk memilih karakter acak dengan probabilitas seragam.
Cobalah di sini: tautan ideone
EDIT: Terima kasih kepada Morgan Thrapp untuk koreksi.
sumber
from random import*
menghemat 2 byte. Anda juga dapat bergabung dengan dua baris pertamaj
loop dengan titik koma untuk menyimpan beberapa byte. (Juga saya percayaZ
dan{
memiliki peluang lebih tinggi untuk muncul daripada beberapa surat lainnya, bukan karena itu penting untuk pertanyaan itu)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 byteIni adalah implementasi lurus ke depan buat karakter persegi dengan karakter. Jika karakter berada pada diagonal : gunakan karakter acak, yang lain : gunakan spasi. Ini juga menggunakan substitusi regex dan int acak untuk menghasilkan non- Ykarakter:
Penjelasan [Tua]
Memperbarui
import*
- Terima kasih kepada @KevinLausumber
randint
mungkin lebih pendek untuk keperluan Anda, plusfrom random import*
. Juga, hapus beberapa ruang putih yang tidak perlu.[i,33][i in(89,121)]
berfungsi sebagai gantinya membutuhkan terner bertele-tele dalamf
fungsi Anda ! Lihat juga apakah Anda dapat menghapus ruang yang tepat setelahprint
pernyataan Andare.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
menghemat 6 byte dari... if ... else ...
konstruk.Dyalog APL , 35 byte
⎕
meminta nomor⍳
1 melalui∘.=⍨
tabel persamaan angka (yaitu diagonal memiliki 1s)(⊢∨⌽)
itu sendiri ATAU gambar cerminnya (memberikan kedua diagonal)95×
dikalikan dengan 95?
rand int antara 1 dan 95 untuk diagonal, rand mengambang antara 0 dan 1 untuk⌊
lantai sisanya untuk singkirkan float,(⊢+∊∘57 89)
tambahkan satu ke elemen yang merupakan anggota dari {57,89} (Yy - 32)32+
tambahkan 32 untuk menjadikan 0s menjadi spasi, dan angka lainnya ke dalam rentang yang tepat⎕UCS
dikonversi ke teksTryAPL !
sumber
Python 2.7, 205 byte:
Cobalah secara Online! (Ideone)
sumber
MATL , 28 byte
Cobalah online!
Semua karakter yang diizinkan memiliki probabilitas yang sama untuk muncul. Berfungsi untuk input genap juga.
sumber
C, 154 byte (atau 119 tanpa pelat ketel)
Atau 119 byte sebagai fungsi
X(h)
dengansrand(time(0))
dijaga di tempat lain:Kerusakan:
sumber
kode mesin x86, 70 byte
Kode yang dapat dieksekusi saya, dibongkar:
Ini adalah fungsi yang menerima ukuran X di ecx, dan penunjuk ke buffer output di edx.
Ini mengisi buffer output secara berurutan dengan byte. Ada
2 * n - 1
iterasi (sama dengan jumlah karakter non-spasi untuk output). Pada setiap iterasi, ia melakukan hal berikut:Konversi dari angka acak ke karakter acak tidak luar biasa:
Bagian yang menarik adalah perhitungan jumlah spasi. Itu harus menghasilkan angka-angka berikut (contoh untuk N = 9):
Angka-angka diambil secara bergantian dari dua perkembangan aritmatika. Yang pertama turun dengan langkah -2, dan yang kedua naik dengan langkah 1. Ketika perkembangan pertama tiba di -1 (di tengah-tengah X), ada kesalahan (-1 dihapus), dan kemudian perkembangannya berubah arah.
Kemajuan disimpan dalam register
ebx
danedx
- bagian tinggibh
dandh
menyimpan nomor saat ini, dan bagian rendahbl
dandl
menyimpan langkah. Untuk bergantian di antara progres, kode bertukar register denganxchg
.Ketika progres tiba di -1 (di sekitar
mylab
label), ia meningkatkan kedua register, mengalihkan langkah dari-2, 1
ke-1, 2
. Ini juga mengubah peran register, sehingga kemudian bertukar bagian register yang tinggi.Di akhir fungsi, ini menyimpan nol byte untuk menunjukkan akhir dari string.
sumber
Lua, 277 Bytes
Yah ... Lua sangat pandai memanipulasi string: D. Pertama kali saya harus menggunakan
local
pernyataan! Saya bisa menyimpan beberapa byte dengan menggunakan Lua 5.1 bukan 5.3 karena mereka memindahkan fungsi globalunpack
ke objektable
di Lua 5.2. Tapi saya lebih suka tetap dengan versi terbaru yang saya miliki :).Menentukan fungsi yang harus dipanggil dengan parameter tunggal (yang kedua digunakan untuk tujuan rekursi) dan mengembalikan string.
Tidak disatukan
sumber
JavaScript (ES6),
137131125 byteDimana
\n
mewakili karakter baris baru literal. Sunting: Disimpan 1 byte dengan memindahkan bagian' '
dalamString.fromCharCode
ekspresi. Disimpan 5 byte dengan membuat generasi karakter acak saya tidak seragam; ekspresir+72&95
adalah nol untuk nilai yang dipetakan keY
dany
dan!
dihasilkan di tempat mereka. Disimpan 4 byte ketika saya menyadari bahwa penyebaranString.fromCharCode
menghindari harusjoin
. Disimpan 2 byte dengan mencuri trik dari @ edc65.sumber
PowerShell v2 +, 112 byte
Membaca input dari baris perintah.
Untuk setiap baris, array spasi dibuat, indeks yang benar diisi dengan karakter yang ditarik dari fungsi
f
, kemudian array char digabungkan ke output sebagai satu baris.sumber
[char]
gips ke luarRandom
, dan dengan membalik-join
operator menjadi unary ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
dengan PowerShell yang setara dengan lambda dan menggunakan operator&
panggilan untuk memanggilnya. Berikut ini adalah 103 byte -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, menggerakkan[char]
pemain untuk menjadi[char[]]
pemain$a
(bertukar' '
untuk32
dalam proses), dan memindahkan$z
definisi ke dalam parens saat pertama kali disebut. Turun ke 99 (woo! Sub-100!) -Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
definisi ke parens saat pertama kali digunakan. Turun ke 98 sekarang -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
saya pikir saya akan berhenti di sini ;-) heheMATLAB, 86 byte
Beberapa contoh:
sumber
changem
! Nama yang bagus!Pip , 33 byte
32 byte kode, +1 untuk
-l
bendera. Anehnya, kode dimulai denganY
dan diakhiri dengany
...Mengambil input sebagai argumen baris perintah. Cobalah online!
Penjelasan
Membangun kisi dengan ukuran yang sesuai; menggantikan elemen pada diagonal dengan karakter non-y acak, dan semua elemen lainnya dengan spasi.
sumber
php, 135 byte
Pendekatan yang cukup mudah menggunakan str_pad untuk membuat string spasi dengan panjang yang dibutuhkan, mengganti karakter yang diperlukan dengan yang acak lalu mengganti Ys (case case) dengan Xs dan menggema garis.
Menghasilkan pemberitahuan 2n + 3 tetapi, seperti biasa, itu tidak masalah.
sumber
Emacs Lisp, 269 bytes
Tidak disatukan dan sedikit diubah:
sumber
JavaScript (ES6), 128
131Edit 3 byte yang disimpan thx @Neil
Sangat besar, mungkin bukan pendekatan terbaik. Bonus - ini bekerja dengan input ganjil atau genap.
sumber
r+7&31
memberikan hasil yang sama dengan(r&31)-25
.C, 268 byte
Panggil
f()
dengan ukuranx
untuk menggambar.sumber
srand
dalam fungsi Anda, mereka tidak dapat mengandalkan negara global. Anda dapat, bagaimanapun, mencapai program yang jauh lebih pendek dengan dua loop bersarang dan menggunakan karakter backspace. Sebuah solusi umum mungkin terlihat seperti ini , tapi saya pikir menggunakan varian windows tertentuclock
akan valid.gcc version 4.8.1
untuk Windows dangcc version 5.3.0
untuk Cygwin tidak berfungsi ... (pada IdeOne Works)Matricks , 79 byte (tidak bersaing)
Matricks unggul sebagai awal pembuatan x dan semua nilai acak, tetapi gagal ketika datang ke kondisional ...
Saya menandai ini sebagai tidak bersaing karena saya harus memperbaiki beberapa bug dan mendapatkan semua fitur baru berfungsi setelah tantangan ini diposting.
Jalankan dengan
python matricks.py x.txt [[]] <input> --asciiprint
Penjelasan:
Ini juga mendukung angka genap.
sumber
Python 2,
204191183 byteOke, kompetisi Python di sini semakin sengit. Inilah upaya saya mencukur sebanyak mungkin byte.
Sekarang saya macet(Ok, macet lagi).Kredit ke @NonlinearFruit untuk cara karakter acak dipilih.
Versi 183 byte:
Cobalah secara Online! (Ideone)
Perubahan utama adalah menulis ulang persyaratan
sebagai
yang menghemat 7 byte.
Versi 191 byte:
Cobalah secara Online! (Ideone)
Perubahan utama adalah cara karakter acak dipilih dan beberapa penataan ulang kode seperti
s=input();i=s;
menjadis=i=input();
, menghapusr=range
tugas karena tidak lagi diperlukan dan memanggilabs
langsung karena menghasilkan lebih sedikit byte kode.Mengalahkan jawaban terpendek sebelumnya dengan Python 1 byte!@R. Pendekatan Kap digunakan untuk menghasilkan karakter acak. Setiap iterasi dari while loop satu baris ex dicetak.Versi 204 byte :
Cobalah secara Online! (Ideone)
Versi ungolfed untuk mendapatkan ide tentang cara kerjanya:
Sulit untuk menangani case 1-karakter!
sumber
SmileBASIC, 97 byte
Daripada harus menghitung jumlah spasi antara setiap karakter atau sesuatu, saya memutuskan untuk hanya mencetak di semua lokasi di mana
X==Y
atauX+Y==Size+1
.Generator karakter acak hanya menambahkan 1 jika menghasilkan
y
atauY
, jadiz
danZ
sedikit lebih umum dari biasanya.sumber
PHP, 100 byte
mengambil input dari argumen baris perintah; jalankan bersama
-nr
.loop gabungan mencetak karakter tergantung pada posisi
kerusakan
sumber