Untuk "memfungsikan sarang" suatu string, Anda harus:
Perlakukan karakter pertama sebagai fungsi, dan karakter berikut sebagai argumen untuk fungsi itu. Misalnya, jika string input adalah
Hello
, maka langkah pertama adalah:H(ello)
Kemudian, ulangi langkah yang sama ini untuk setiap substring. Jadi kita dapatkan:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Tugas Anda adalah menulis sebuah program atau fungsi yang "berfungsi membuat" string. Misalnya, jika string input adalah Hello world!
, maka Anda harus menampilkan:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
Input hanya akan berisi ASCII yang dapat dicetak , dan Anda dapat mengambil input dan output dalam format yang masuk akal. Misalnya, STDIN / STDOUT, argumen fungsi dan nilai kembali, membaca dan menulis ke file, dll.
Demi kesederhanaan, Anda juga dapat berasumsi bahwa input tidak akan mengandung tanda kurung, dan tidak akan kosong.
Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
Input:
foobar
Output:
f(o(o(b(a(r)))))
Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))
Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))
Input:
a
Output:
a
Input:
42
Output:
4(2)
Seperti biasa, semua aturan dan celah default kami berlaku, dan jawaban terpendek yang dicetak dalam byte menang!
sumber
You may take the input and the output in any reasonable format.
Daftar karakter tampaknya masuk akal bagi saya.Jawaban:
Python,
413934 byteIde itu
Cukup jelas.
Ini menempatkan tanda kurung antara setiap karakter lain kemudian menambahkan satu kurang dari tanda kurung panjang sampai akhir.
sumber
-
membuat angka negatif dan~
sedikit membaliknya. Anda dapat membaca sedikit lebih banyak tentang itu di halaman tips .File MS-DOS .com, 30 byte
String dilewatkan ke executable menggunakan baris perintah. (Satu karakter spasi antara nama file .COM dan string).
Hasilnya ditulis ke output standar.
Pembongkaran ada di sini:
Catatan: Anda dapat keluar dari file DOS .COM (tidak seperti file dengan header EXE) menggunakan instruksi "RET".
sumber
call 0xfoff
? Program ini dimuat ke dalam memori di alamat0
sejauh yang saya tahu (atau0x100
pada CP / M-DOS tetapi ini tampaknya instruksi x86), mengaparecursiveFunction
tiba - tiba terletak di0xffof
? Tampaknya mulai 9 byte setelah awal program, dan tidak ada virtualisasi atau metadata di executable.0x100
namun program ini bahkan akan berjalan pada alamat APAPUN:e8 f0 ff
adalah instruksi panggilan relatif : Ini melompat ke alamat instruksi mengikuticall
instruksi minus 0x10.JavaScript (ES6),
403433 byteDisimpan 6 byte, berkat produk ETH
Fungsi rekursif.
Cobalah online!
sumber
1/s
.([c,...s])
Anda harus menulis tipBrainfuck,
4240 byteCobalah online!
Tidak Terkumpul:
sumber
05AB1E , 11 byte
Cobalah online!
Penjelasan:
sumber
Brainfuck, 44 byte
Membaca byte pada satu waktu, menempatkan paren terbuka sebelum masing-masing kecuali yang pertama, menempatkan jumlah parens yang sama di akhir.
sumber
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
sedikit lebih pendek.Haskell, 30 byte
Contoh penggunaan:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Ambil char berikutnya, diikuti oleh
(
, diikuti oleh panggilan rekursif dengan semua kecuali char pertama, diikuti oleh a)
.sumber
f=Data.List.intersperse '$'
! Itu memberi kitaf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
sebagai kasus dasar yang dipasang pada Andaf[x]=[x]
. Saya tidak akrab dengan Haskell jadi saya tidak tahu apakah itu sah atau tidak, saya akan membiarkan Anda menilai.()
belakang huruf terakhir, misalnyaf "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
membutuhkanimport Data.List
17 byte lagi.Jelly ,
98 byte-1 byte terima kasih kepada @Dennis (gunakan cetakan
ṁ
,, sebagai pengganti panjangL
,, dan ulangi,x
)TryItOnline
Bagaimana?
sumber
³
sebenarnya menyebabkan Jelly untuk mencetak nilai pengembalian saat ini, sehingga Anda tidak pernah memiliki dua daftar karakter.Retina ,
2217 byteCobalah online!
Kalau tidak:
Penjelasan
Saya selalu lupa bahwa mungkin saja mencetak hal-hal di sepanjang jalan alih-alih mengubah segalanya menjadi hasil akhir dan menghasilkannya dalam sekali jalan ...
Di sini
\
memberi tahu Retina untuk mencetak hasil tahap ini tanpa linefeed tambahan. Ini1>
adalah batas yang berarti bahwa pertandingan pertama regex harus diabaikan. Adapun panggung itu sendiri, itu hanya menggantikan masing-masing karakter (.
) kecuali yang pertama(
diikuti oleh karakter itu. Dengan kata lain, itu menyisipkan(
di antara setiap pasangan karakter. Untuk inputabc
, ini mengubahnya menjadi (dan mencetak)Yang tersisa adalah mencetak tanda kurung penutup:
Hal ini dilakukan dengan transliterasi yang menggantikan
(
dengan)
dan menghapus semua karakter ASCII printable lainnya dari string.sumber
> <> ,
1918 byteCobalah online!
Penjelasan
Baris pertama adalah loop input yang mencetak semuanya hingga karakter terakhir dari input (termasuk semua
(
) dan meninggalkan jumlah yang tepat)
pada stack:Setelah kita menekan EOF, penunjuk instruksi berakhir di baris kedua dan kita hanya akan mengeksekusi
o
dalam satu lingkaran, mencetak semua)
, sampai tumpukan kosong dan program keluar.sumber
J, 13 byte
J dieksekusi dari kanan ke kiri sehingga menggunakan adverbia insert
/
, kata kerja dapat digunakan untuk mengurangi huruf-huruf dari string input.Pemakaian
Anda dapat mengamati output parsial antara setiap pengurangan.
Penjelasan
sumber
C #, 32 byte
Lambda ini harus menjadi metode statis, apakah saya perlu menghitung byte tambahan untuk persyaratan itu? Biasanya saya tidak akan menggunakan lambda untuk rekursi dalam C #, tapi kemudian saya pikir akan lebih pendek untuk tidak menggunakan rekursi.
sumber
R, 61 byte
Regex menemukan dan mengganti spasi antara karakter dengan "(". Kemudian
cat
danrep
menambahkan ")" n-1 kali di akhir.sumber
Java 7,
8179 byteDisimpan
1
byte. Terima kasih kevin.sumber
l!=a.length
l<a.length
b=b+'('+a[l],++l)+')'
b+="("+a[l],++l)+")"
b+="("+a[l],++l)+")"
memberi Anda 144141148))), dan BTWb+"("+a[l],++l)+")"
benar. dan ini adalah kesalahan konyol saya (!=
).b+='('+a[l],++l)+')'
memberi144141148
, tetapib+="("+a[l],++l)+")"
tidak. Tanda kurung dikelilingi oleh String-quotes bukan char-quotes.PowerShell v2 +, 46 byte
Mengambil string input,
char
-array itu saja,-join
s array bersama-sama dengan parens terbuka(
, kemudian menggabungkan pada jumlah yang sesuai dari paren tertutup)
.sumber
APL, 19 byte
Penjelasan:
Solusi alternatif, juga 19 byte:
Penjelasan:
sumber
MATL , 16 byte
Cobalah online!
Penjelasan
sumber
Acc !! , 129 byte
Tidak buruk untuk Turing turing ...
(Ya, semua spasi putih itu wajib.)
Catatan: karena keterbatasan input Acc !! , tidak mungkin untuk membaca serangkaian karakter acak tanpa pembatas akhir. Oleh karena itu, program ini mengharapkan input (pada stdin) sebagai string yang diikuti oleh karakter tab.
Acc !! ?
Ini adalah bahasa yang saya buat yang sepertinya tidak bisa digunakan . Satu-satunya tipe data adalah bilangan bulat, satu-satunya konstruksi aliran kontrol adalah
Count x while y
loop, dan satu-satunya cara untuk menyimpan data adalah akumulator tunggal_
. Input dan output dilakukan satu karakter pada satu waktu, menggunakan nilai khususN
danWrite
pernyataan. Terlepas dari keterbatasan ini, saya cukup yakin bahwa Acc !! adalah Turing-complete.Penjelasan
Strategi dasar dalam Acc !! pemrograman adalah dengan menggunakan mod
%
dan integer division/
untuk secara konseptual mempartisi akumulator, memungkinkannya untuk menyimpan beberapa nilai sekaligus. Dalam program ini, kami menggunakan tiga bagian seperti itu: tujuh bit urutan terendah (_%128
) menyimpan kode ASCII dari input; bit berikutnya (_/128%2
) menyimpan nilai flag; dan bit yang tersisa (_/256
) menghitung jumlah parens dekat yang akan kita butuhkan.Masukkan Acc !! berasal dari nilai khusus
N
, yang membaca satu karakter dan mengevaluasi kode ASCII-nya. Pernyataan apa pun yang hanya terdiri dari ekspresi memberikan hasil ekspresi itu ke akumulator. Jadi kita mulai dengan menyimpan kode karakter pertama di akumulator._%128
akan menyimpan karakter yang terakhir dibaca. Jadi loop pertama berjalan sementara_%128-9
adalah bukan nol - yaitu, sampai karakter saat ini adalah tab.Di dalam loop, kami ingin mencetak
(
kecuali kami berada di iterasi pertama. Sejak Acc !! tidak memiliki pernyataan if, kita harus menggunakan loop untuk conditional. Kami menggunakan bit 128 dari akumulator_/128%2
,, sebagai nilai bendera. Pada pass pertama, satu-satunya hal dalam akumulator adalah nilai ASCII <128, jadi flagnya adalah 0 dan loop dilewati. Pada setiap operan berikutnya, kami akan memastikan bahwa benderanya 1.Di dalam
Count x
loop (setiap kali flag adalah 1), kami menulis paren terbuka (ASCII40
) dan menambahkan 128 ke akumulator, dengan demikian mengatur flag ke 0 dan keluar dari loop. Ini juga terjadi untuk meningkatkan nilai_/256
, yang akan kita gunakan sebagai penghitungan dari orang tua kita untuk menjadi output.Terlepas dari nilai flag, kami menulis char input terbaru, yang sederhana
_%128
.Tugas berikutnya (
_+128-_%128+N
) melakukan dua hal. Pertama, dengan menambahkan 128, itu menetapkan bendera untuk waktu berikutnya melalui loop. Kedua, itu nol_%128
slot, membaca karakter lain, dan menyimpannya di sana. Lalu kita mengulang.Ketika
Count i
loop keluar, kami baru saja membaca karakter tab, dan nilai akumulator terurai seperti ini:_%128
:9
(karakter tab)_/128%2
:1
(bendera)_/256
: jumlah karakter yang dibaca, minus 1(Yang minus 1 adalah karena kita hanya menambahkan 128 ke akumulator sekali selama melewati pertama melalui loop utama.) Yang kita butuhkan sekarang adalah parens-dekat.
Count j while _/256-j
loop_/256
kali, menulis close-paren (ASCII41
) setiap kali. Voila!sumber
Perl, 25 byte
Terima kasih kepada @Ton Hospel untuk bermain golf 4 byte.
24 byte kode +
-F
.Kebutuhan
-F
dan-E
bendera:Perhatikan bahwa jika Anda mencoba ini pada versi perl yang lama, Anda mungkin perlu menambahkan
-a
flag.Cara lain yang menarik (sedikit lebih lama: 28 byte):
Terima kasih kepada Ton Hospel sekali lagi karena membantu saya memperbaiki yang ini.
(Untuk menggunakannya, masukkan kode di dalam file dan panggil dengan
echo -n "Hello" | perl nest.pl
)sumber
""
setelahnya-F
. Anda juga tidak perlu-l
jika Anda meminta string input dimasukkan tanpa baris baru final:echo -n Hello | program
-F
, terima kasih. (Saya bertanya-tanya bagaimana cara mendapatkan input tanpa baris terakhir, terima kasih juga untuk itu)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, tetapi tentu saja tidak mendukung string yang mengandung\Q
untuk mendukung metacharacters regex) :-)Ruby, 27 byte
Penjelasan
sumber
Perl,
2423 byteTermasuk +1 untuk
-p
Berikan string pada STDIN tanpa baris baru (atau tambahkan
-l
opsi ke program)nest.pl
:sumber
PHP, 63 Bytes
Versi sebelumnya 64 Bytes
sumber
<?=
alih-alihecho
dan satu lagi jika Anda menyetel $ s ke hasilstr_split
panggilan alih-alih$argv[1]
, dan kemudian menggunakancount($s)
sebagai gantinyastrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
akan mengalahkan kombinasi split / join, tetapi sayangnya gagal jika input berisi spasi.GNU sed,
373531 bytes (30 +1 untuk-r
argumen)Solusi sed linux murni
:
; kemudian menyebutnya secara rekursif dengant
\1 ( \2 )
Sunting : Terima kasih kepada @manatwork karena membantu menghapus 4 karakter!
Penguji online
sumber
-e
untuk meneruskan kode ke penerjemah adalah gratis. (Oke,sed
senang juga tanpanya.) Jadi untuksed -re '…'
Anda hitung +1.Ubur-ubur ,
1918 byteKarakter
␁
adalah karakter kontrol yang tidak dapat dicetak dengan nilai byte0x1
. Cobalah online!Penjelasan
Ini adalah program Ubur-ubur yang cukup rumit, karena banyak nilai digunakan di banyak tempat.
I
adalah input mentah, baca dari STDIN sebagai string.'(
adalah karakter literal(
.{
(kiri identitas) mengambil'(
danI
sebagai masukan, dan kembali'(
. Nilai pengembalian tidak pernah benar-benar digunakan.`
adalah utas. Ini memodifikasi{
untuk mengembalikan karakter(
untuk setiap karakterI
, menghasilkan string(
s dengan panjang yang sama denganI
.>
adalah ekor; dibutuhkan string(
s sebagai input dan memotong karakter pertama.+
mengambil argumen argumen(
s dan byte yang tidak dapat dicetak, dan menambahkan nilai byte (1) ke setiap karakter. Ini memberikan string sama panjang)
s. Menggunakan karakter␁
menjamin bahwa nilai kembali adalah string, dan bukan daftar bilangan bulat./
ambil byte yang tidak dapat dicetak, dan mengembalikan fungsi yang membutuhkan dua argumen, dan bergabung dengan argumen kedua dengan argumen pertama sekali (karena nilai byte adalah 1)._
mengambil fungsi ini, meraih argumen yang lebih rendah{
(yang dulu'(
danI
), dan memanggil funtion dengan mereka. Ini menyisipkan karakter(
antara setiap pasangan karakter diI
.,
menyatukan string ini dengan string)
s, danP
mencetak hasilnya.sumber
05AB1E ,
22211918 byteCobalah online!
Penjelasan:
sumber
Vim, 17 byte
$qqha(<Esc>A)<Esc>%h@qq@q
Beranjak dari ujung ke awal, karena kalau tidak Anda tersandung
)
huruf yang sudah Anda tulis. Penggunaanha
bukannyai
gagal ketika mencapai awal.Biasanya, Anda tidak akan melakukan dua sisipan terpisah seperti ini; Anda akan melakukan sesuatu seperti
C()<Esc>P
menyimpan stroke. Tetapi positioning tidak berfungsi dengan baik saat ini.sumber
<End>
kunci dalam mode sisipkan alih-alih meninggalkan mode sisipkan dan melakukanA
Cembung , 10 byte
Cobalah online!
sumber
> <> , 37 byte
Baris demi baris
Cobalah online!
sumber
Brain-Flak
10397 BytesTermasuk +3 untuk -c
Cobalah secara Online!
Penjelasan:
sumber
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
adalah dua byte lebih lama ...-a
di Brain-Flak?+3
byte adalah standar untuk bendera baris perintah khusus . Sangat disayangkan, tapi saya bisa tahan. Sebenarnya saya sudah memikirkan cara untuk mempersingkat ini, tapi saya belum yakin bagaimana.-
dan satu untuk bendera? Anda bisa memiliki flag untuk eksekusi normal seperti Perl-e
. Dengan begitu hanya 1 byte tambahan.Faktor, 81 byte
sumber