Program Anda:
Anda akan menulis dua program (keduanya dalam bahasa yang sama). Program penyimpanan mengambil string dari STDIN dan menyimpannya di suatu tempat yang persisten (lihat di bawah) dan kemudian keluar tanpa kesalahan. Program pengambilan tidak mengambil input, mengambil string yang disimpan, dan mencetaknya ke STDOUT.
Tes objektif Kegigihan:
Anda harus dapat menjalankan program penyimpanan pada mesin lokal Anda, kemudian menghidupkan-daya mesin lokal Anda, kemudian memanggil program pengambilan di mesin lokal Anda. Anda dapat menyimpan string sesuai keinginan Anda (bahkan di web) selama Anda lulus tes reboot ini.
Kasus uji:
Penyimpanan kemudian pengambilan:
echo foo | Store
Retrieve
foo
Toko Berulang harus menimpa (seperti metode set ()):
echo foo | Store
echo bar | Store
Retrieve
bar
Pengambilan Berulang adalah metode yang tidak merusak (seperti get ()):
echo foo | Store
Retrieve
foo
Retrieve
foo
Pengambilan sebelum doa Penyimpanan:
Anda tidak perlu khawatir tentang ini. Program pengambilan Anda dapat mengasumsikan bahwa program penyimpanan telah dijalankan di beberapa titik di masa lalu.
Input / Keluwesan fleksibilitas.
Orang-orang meminta saya untuk memperluas ini dari STDIN / STDOUT yang ketat ke aturan IO standar. Saya tidak bisa karena itu akan menyebabkan terlalu banyak celah. Beberapa opsi IO standar sudah memiliki input yang disimpan secara persisten, misalnya "program dapat mengambil input dari file". Saya ingin menjadi lebih fleksibel daripada STDIN dan STDOUT yang ketat, tetapi tanpa membuka pintu air.
Dari utas aturan IO standar, saya memilih yang tidak melanggar tantangan:
Program dapat mengambil input melalui prompt GUI dan prompt baris perintah jika Anda mau
Program dapat menampilkan dengan menampilkannya di layar Ini termasuk dialog GUI
Program dapat mengambil input melalui argumen baris perintah
Program dapat menghasilkan ke STDERR tetapi masih tidak bisa benar-benar melakukan kesalahan
Jika Anda menggunakan alternatif, itu harus interaktif-pengguna. Pengguna seharusnya tidak perlu melakukan pekerjaan lain selain mem-pipkan input mereka ke program Anda, mengetikkannya ke prompt yang disediakan program Anda, atau mengetik input sebagai baris perintah pada program Anda. Pengguna tidak perlu melakukan apa pun selain menjalankan program pengambilan Anda untuk melihat output yang ditampilkan di layar atau dikirim ke STDOUT atau STDERR.
Asumsi yang diizinkan:
- Dua program Anda akan dijalankan di direktori yang sama
- Program Anda memiliki izin baca-tulis untuk direktori itu
- File yang Anda buat akan selamat dari reboot (tidak dalam temp temp)
- Satu trailing newline yang bukan bagian dari string diizinkan. Tidak ada spasi spasi tambahan lainnya
echo $@>x
dancat x
valid?Store
?Jawaban:
zsh, 4 byte
Store:
>f
(membaca dari STDIN dan menulis ke file bernamaf
)Retrieve:
<f
(menulis kontenf
ke STDOUT)sumber
TI-BASIC (Z80), 1 byte ?
Toko:
(cukup masukkan string)
Ambil:
Ans
(byte 27)Tetapi jika itu tidak valid:
TI-BASIC (Z80),
76 byte-1 berkat Jakob.
Toko:
Prompt Str0
(byte DD AA 09)Ambil:
disp Str0
(byte ED AA 09)sumber
Ans
dan bertahan dalam variabel yang sama? Program toko kosong dan hanyaAns
untuk mengambil harus bekerja: 1 byte!Ans
tetap ada. Faktanya, banyak status tetap ada, termasuk (saya pikir) semua variabel pengguna, persamaan, dan sejarah. Dari perspektif pengguna, dimatikan pada dasarnya adalah kalkulator TI setara dengan kondisi tidur untuk PC, sehingga tidak banyak mengganggu.Browser JS, 44 byte
Toko :
Ambil kembali :
sumber
prompt()
membaca dari STDIN?prompt()
Muncul lansiran yang meminta Anda memasukkan teks, dan mengembalikan hasilnya.POSIX shell sh / bash / ... 8 byte
toko:
mendapatkan:
sumber
cat
...Python 3 , 46 byte
toko, 45 byte:
Program mengambil dibangun oleh perintah toko, file bernama
f
. ( 1 byte untuk nama file )sumber
input()
?input()
hanya menerima hingga baris baru pertama.open(0).read
membaca semua STDINstore
-Program membaca masukan dari STDIN dan kemudian menyimpan program Python yang mencetak masukan ini dif
. Contoh: STORE disebut dengan input dariabc
. Kemudian menulisprint('abc')
untukf
. Jika sekarang Anda memanggilf
(RETRIEVE), ia mencetakabc
ke STDOUT.Batch, 16 byte
sumber
Powershell - 4 Bytes
Penyimpanan:
(alternatif juga
sc
)Pengambilan
Sunting: Saya baru memperhatikan bahwa output tidak diperbolehkan input pengguna apa pun ... sehingga melonjak dari 4 menjadi 6 atau 8 byte
Penyimpanan:
(Alternatif juga
sc f
) untuk versi 8 byte(dan tentukan
f
sebagai path) untuk Versi 6 bytePengambilan
sumber
Rust, 136 byte
Simpan (84 byte)
Retrieve (52 bytes)
Ucapan Terima Kasih
sumber
use std::{io::*,fs::*}
dan kemudian menggunakanwrite
alih-alihstd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
pemicuerror[E0658]: use of unstable library feature 'io'
pada Rust stabil.chars()
sudah usang dalam mendukungString::from_utf8(stdin().bytes())
. (Juga saya menggunakan dokumen malam, tidak yakin apakah itu pelakunya)bytes()
atauchars()
tetapi tidak ada yang sangat pendek karena item iterator dibungkusio::Result
.Pesta,
12 1110 bytetoko,
7 65 byte# tidak perlucat ->f
-
, stdin adalah default# tidak perlu ruang,cat >f
>
pisahkan jugaambil, 5 byte
sumber
-
dalam program toko.>f
. Saya tidak yakin apakah<f
valid untuk membaca.>f
berfungsi sepertiecho '' > f
(mengosongkan file jika ada, membuat jika tidak), sementara<f
tampaknya menjadi no-op.HP 49G RPL, 48 byte
Untuk menyimpan
:2: A DUP PURGE STO
:, 26,5 byteUntuk mengembalikan
:2: A RCL
:, 21,5 byteJika kita dapat meninggalkan baterai cadangan, kita dapat:
HP 49G RPL, 0 byte
Untuk menyimpan
:, 0 byte
Untuk memulihkan
:, 0 byte, karena HP 49G membiarkan tumpukan tidak tersentuh saat reboot.
sumber
APL (APLX) , 5 byte
Toko:
⍞⍈1
Ambil:
⍇1
⍞
dapatkan baris dari stdin⍈1
tulis ke komponen selanjutnya yang tersedia dari file nomor 1⍇1
baca komponenpertama* terakhir dari nomor file 1* Dokumentasi mengatakan pertama tetapi eksperimen menunjukkan yang terakhir .
sumber
bash, 10 byte (tidak bersaing)
Nama file Unix dapat berisi karakter apa pun kecuali
NUL
dan/
, dan nama mereka dapat mencapai panjang hingga 255 byte sehingga ini hanya dapat menyimpan string hingga panjang itu (menganggap bahwa pembatasan media penyimpanan), dan yang tidak mengandung '/ 'di dalam mereka. Itulah salah satu alasan mengapa ini tidak bersaing, alasan lain adalah menganggap direktori yang dijalankannya kosong (atau keluaran asing darils
diizinkan). Saya masih ingin memposting ini karena sepertinya cara yang keren dan tidak jelas untuk menyimpan informasi.Lain pada nada yang sama, yang tidak akan memiliki panjang dan keterbatasan karakter yang sama adalah:
3533 byteIni memungkinkan
/
karakter dalam string, dan mendukung lebih banyak karakter (persis berapa banyak tergantung pada implementasi).(-2 byte untuk ini berkat @Cow quack)
sumber
s/..//
. Tidak$
diperlukan karena semua baris lainnya dihapus sehingga ini hanya dapat diterapkan ke baris terakhir, dan^
dapat dihapus karena substitusi hanya diterapkan pada pertandingan pertama."$@"
, tidak$@
, untuk menghindari dibakar oleh spasi,*
,?
, atau~
karakter.Python 3, 56 byte
Simpan (33 byte)
Ambil (23 byte)
Mencetak dengan baris baru yang tertinggal.
sumber
input()
bukanopen(0).read()
dan omitend=
dariprint
?input
tidak digunakan, tetapi menghilangkanend=
akan menghasilkan baris baru yang ditambahkan ke akhir string (yaitu, bukan string asli) (mungkin)input()
?input
, saya berasumsi bahwa string untuk bertahan dapat berisi baris baru.Japt,
4630 byte-16 byte terima kasih kepada Shaggy .
Salah satu pertama kalinya saya mencoba menggunakan Japt. Eval JS kadang-kadang bisa gelisah. Menggunakan browser
window.localStorage
.Simpan (16 byte)
Retrieve (14 bytes)
sumber
setItem
dangetItem
sepenuhnya denganlocalStorage.key
. Tetapkan nilai , ambil nilaiHaskell, 46 byte
Simpan (26 byte):
Ambil (20 byte):
sumber
Ruby (26 Bytes)
Set (16 Bytes)
Dapatkan (10 Bytes)
sumber
MATLAB (30 Bytes)
Set (22 Bytes)
Dapat memangkas 4 byte dengan mengubah ke
input('')
, tetapi ini akan membutuhkan input dalam tanda kutip tunggal:'input string'
Dapatkan (8 Bytes)
sumber
C (GCC), 98 byte
Simpan (46 byte)
Input melalui argumen baris perintah pertama.
Retrieve (52 bytes)
Unportability
int
.Ucapan Terima Kasih
sumber
int
dapat menyimpan pointer, agar deklarasi implisitint fopen()
untuk berfungsi. (mis. kebanyakan sistem 32-bit, atau gunakangcc -m32
jika Anda menggunakan x86-64 untuk membuat 32-bit dapat dieksekusi.) Dan BTW, saya mencoba menggunakan Linuxsendfile
dancopy_file_range(2)
panggilan sistem, tetapi mereka tidak bekerja ke / dari TTY.fputs(fopen())
, danread(open(),buf,-1)
. (Pertanyaannya sekarang memungkinkan arg baris perintah sebagai input.)APL (Dyalog Unicode) , 18 byte
Toko:
⍞⎕NPUT⎕A 1
Coba online!Ambil:
⊃⎕NGET⎕A
Coba online!⍞
dapatkan baris dari stdin,⎕NPUT
letakkan di file asli yang disebut⎕A
alfabet huruf besar1
dan timpa jika file ada⊃
bagian pertama (data, bagian selanjutnya adalah penyandian dan tipe akhir baris) untuk⎕NGET
mendapatkan file asli⎕A
alfabet huruf besarsumber
R (27 byte)
toko (21 byte)
memuat (6 byte)
Agar ini berfungsi, skrip pertama perlu dipanggil dengan opsi baris perintah
--save
, dan skrip kedua dengan--restore
(meskipun dalam mode interaktif ini tidak diperlukan: opsi ini adalah default).Ini dapat dipersingkat oleh 7 byte jika bukan karena fakta bahwa bug dalam R mencegah argumen default
readLine
dari bekerja dalam mode non-interaktif. Dalam mode interaktif, itu tidak perlu, dan karena itu solusinya hanya menggunakan 20 byte .sumber
q
secara langsung, dengan program pertama sedangx=scan(); q("y")
dan yang kedua baikx
ataucat(x)
tergantung pada seberapa ketat kita ingin tentang bagaimana string dicetak. Dengan aturan golf kode biasa Anda juga harus menghitung argumen baris perintah, jadi tambahkan byte untuk--save
dan--restore
(yang formulasi saya tidak perlu)scan
tidak berfungsi untuk konten yang sewenang-wenang, danscan(w='character')
lebih lama darireadLines()
.q
tidak perlu (tetapiq('y')
tidak akan berhasil, Anda harus mengejanyayes
). Saya berpikir tentang hanya menggunakanx
dalam program kedua tetapi ini akan melanggar persyaratan, sejauh yang saya mengerti.scan(w="")
, Anda tidak perlu mengeja jenis,scan
akan menyimpulkannya dari jenis argumen yang ditentukan. Bagi saya, q ("y") berfungsi sebagai penghenti yang menyebabkan save tapi mungkin itu tergantung pada versi R Anda, dan mungkin apakah Anda menggunakan Rstudio atau tidak.scan
: Oh, rapi, dokumentasi tidak menyebutkan ini! Sayangnyascan
akan tetap melakukan parsing sehingga ini tidak akan bekerja dengan semua input. Bagaimanapun,scan('stdin',w='')
kebetulan sama panjangnya denganreadLines('stdin')
.q
: R 3.4.4 mengatakan “Kesalahan dalam q (" y "): nilai 'save'" yang tidak dikenal.Java (JDK 10) , 204 Bytes
Peringatan: Timpa preferensi yang disimpan oleh program java untuk nama pengguna Anda!
Simpan, 94 Bytes:
Cobalah online!
Ambil 110 Bytes:
Cobalah online!
Ini berfungsi dengan mengambil input sebagai argumen dan menyimpannya di backing-store preferensi pengguna yang disediakan oleh java.util.prefs . Ini menimpa simpul root pengguna untuk menghemat satu byte pada penamaan node. Jika Anda ingin mengujinya secara non-destruktif, jalankan dari nama pengguna yang ada atau ubah kunci dari "" menjadi nama simpul.
sumber
z
Anda harus menghapusnya dari program dan TIO. Pertimbangkan untuk menempatkan peringatan di bagian atas kiriman untuk memperingatkan orang. Yang pasti TIO harus memiliki solusi 94- dan 110-byte Anda.C #, 157 Bytes
Set, 74 Bytes:
Dapatkan, 83 Bytes:
-1 Bytes berkat VisualMelon
-2 Bytes terima kasih kepada LiefdeWen
sumber
"a",
, dan saya ragu ini akan dikalahkan :)WriteAllLines
dan parameter keduaa
Perl 5,
482623 byteTulis, 20 + 1 (-n) byte
-3 byte terima kasih kepada mob
Saya sebenarnya tidak yakin tentang hal ini, tetapi memenuhi kriteria. Untuk entri sebelumnya, hanya opsi cli yang dihitung, jadi itulah yang saya lakukan.
Baca, 0 + 2 byte
sumber
-ne
dengan 1 (harus memilikie
terlalu), tetapi-pe
dengan 2? Anda bisa menggunakan-E
dansay
bukannyaprint
.-E
, saya tidak terbiasa dengan itu. Adapun mengapa saya tidak pergi dengan-ne
, itu karena untuk yang itu, saya sebenarnya lari dari file. Jadi, akan terlihat sepertiperl -n w.pl
Jika ini bertentangan dengan standar komunitas PCG, saya dapat mengedit jawaban saya.">>","f"
->">>f"
menyimpan 3 charAttache , 23 + 16 = 39 byte
Cukup menulis STDIN ke file
A
, lalu membaca fileA
.store.@
:retrieve.@
:Pengujian
sumber
Lua,
575351 byteSimpan, 27 byte
Retrieve, 24 byte
sumber
RUBI
Simpan (24 byte)
Ambil (16 byte)
sumber
File.write'a',gets
danp File.read'a'
sedikit lebih pendek;)C (Unix / GNU), 23 + 23 = 46 byte
Simpan,
2723 byteAmbil,
2723 byteIni pada dasarnya membungkus jawaban jofel ke dalam program C.
Catatan:
dd
Perintah menampilkan beberapa statistikstderr
, sehingga Anda akan melihat beberapa output tambahan saat Anda menjalankannya secara naif di shell. Namun, karena tantangannya hanya mengatakan bahwa string yang disimpan harus disajikan padastdout
, tidakstderr
, saya bawa bahwa itu diperbolehkan untuk memiliki output tambahan padastderr
... Pokoknya, menekanstderr
output semudah menggantidd
dengancat
, meningkatkan jumlah byte dari dua program per satu, masing-masing.sumber
int
jenis pengembalian darimain
. Dalam gaya ANSI C lamaint
adalah tipe pengembalian default.system()
dan lupa tentang itumain()
- aduh. Terima kasih telah menunjukkan :-)PHP, 26 + 1 + 21 = 48 byte
Store.php:
Jalankan dengan
echo <input> | php -nF Store.php
.Retrieve.php:
Jalankan dengan
php -n Retrieve.php
.sumber
C (gcc) ,
7767 + 25 = 92 byteKompilasi dengan hanya beberapa peringatan di gcc saya.
store.c
Mungkin bisa bermain golf termasuk, tapi saya tidak tahu caranya. Segfault jika Anda tidak memberikan apa pun, tetapi apa pun itu.
Peter Cordes: -1
baca.c
sumber
int*f=fopen
harus bekerja, yaitu berbohong kepada kompiler Anda tentang jenis pointer. Tetapi hanya jika Anda mengkompilasi untuk sistem 32-bit (yaitu satu di manaint
dapat menyimpan pointer, sepertigcc -m32
, atau hanyagcc
pada sistem 32-bit sepenuhnya). Anda juga dapat mendeklarasikan main sebagaimain(int c,char**v)
, atau mungkinint**v
karena Anda tidak melakukan dereferensi.main(int c,char**v)
karya. Saya juga sadar saya bisa melakukannyafputs(v[1],fopen("f","w")
, walaupun masih perlu stdio untuk beberapa alasan.int
kembali menjadi 32 bit, kemudian memperpanjang tanda itu sebagai pointer. Jika yang dikembalikanFILE*
adalah dalam 32 bit yang rendah, itu akan berhasil, tetapi itu tidak terjadi pada x86-64 Linux.fopen
secara manual. Pergi sekolah tua dengan argumen menyimpan beberapa byte juga:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Gelombang - 11 Bytes
Input diterima sebagai argumen baris perintah dan tetap ada (dengan pesan kesalahan dibuat pada upaya eksekusi, karena CMD mencoba untuk mengeksekusi parameter) di
f
.Batch - 7 Bytes (tidak kompetitif)
Ada sejumlah besar karakter yang tidak valid dalam nama file, jadi ini tidak akan bekerja untuk beberapa string, tetapi ini pada dasarnya menyimpan karakter sewenang-wenang ke nama file yang diberikan oleh parameter. Untuk membacanya, itu hanya mencantumkan semua file dalam direktori, termasuk string kami.
sumber