Kode terpendek dalam bahasa Anda untuk mempertahankan string saat reboot

48

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:

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

Ini adalah kode-golf, dan skor Anda adalah jumlah byte dari kedua program.

Jared K
sumber
9
jadi adil echo $@>xdan cat xvalid?
Adám
1
Spek Anda tidak menyebutkan kemampuan untuk menyimpan beberapa kali, tetapi Anda memiliki contoh kasus yang melakukannya. Bisakah kita menganggap lingkungan yang bersih untuk setiap doa Store?
Adám
4
@EriktheOutgolfer Mengapa itu tidak valid? Bahkan jika ada celah yang dibahas tentang meta yang tidak mencegah tantangan untuk secara khusus mengizinkannya.
dylnan
6
Pembatasan web biasanya tentang menarik hal-hal dari web sebagai celah untuk keluar dari melakukan pekerjaan menciptakan hal-hal itu. Dalam hal ini, jika itu ada di web itu karena Anda melakukan pekerjaan meletakkannya di sana.
Jared K
3
Seseorang perlu menulis jawaban untuk komputer dengan memori inti-magnetik.
Markus

Jawaban:

88

zsh, 4 byte

Store: >f(membaca dari STDIN dan menulis ke file bernama f)
Retrieve: <f(menulis konten fke STDOUT)

Gagang pintu
sumber
8
Saya pikir kita punya pemenang.
Adám
@ Adám, kecuali ada token untuk menulis input ke file dalam 1 byte: P
FreezePhoenix
1
@FreezePhoenix Mungkin tidak ada kecuali Anda menulis bahasa baru sekarang yang tidak diizinkan ...
Chromium
4
@Chromium check Z80 jawaban: beberapa bahasa yang ada dapat menulis dari program 0 byte
Cœur
55

TI-BASIC (Z80), 1 byte ?

Toko:  (cukup masukkan string)
Ambil: Ans(byte 27)

Tetapi jika itu tidak valid:

TI-BASIC (Z80), 7 6 byte

-1 berkat Jakob.

Toko: Prompt Str0(byte DD AA 09)
Ambil: disp Str0(byte ED AA 09)

Adm
sumber
1
Apakah Anda yakin itu 5 byte?
FreezePhoenix
6
@FreezePhoenix TI-Basic menggunakan token.
Adám
3
Hmm ... Mengapa tidak mengambil input melalui Ansdan bertahan dalam variabel yang sama? Program toko kosong dan hanya Ansuntuk mengambil harus bekerja: 1 byte!
Jakob
9
@Arthur Yap, Anstetap 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.
Jakob
2
@ JaredK Saya pasti setuju bahwa solusi 1-byte berbau penyalahgunaan aturan (meskipun saya adalah orang yang menyarankannya). Namun, saya akan mengatakan program store keluar, karena program lain dapat dijalankan setelah itu (meskipun mereka mengganggu pengoperasian solusi). Interpretasi saya tentang "tes kegigihan obyektif" Anda adalah bahwa program akan dijalankan langsung sebelum dan setelah siklus daya. Jika itu salah, mungkin Anda bisa meminta solusi 1-byte ditandai tidak bersaing?
Jakob
23

Browser JS, 44 byte

Toko :

localStorage.a=prompt()

Ambil kembali :

alert(localStorage.a)
Buah Esolanging
sumber
Akan prompt()membaca dari STDIN?
pipa
9
Apakah peramban web grafis memiliki STDIN? Tidak. prompt()Muncul lansiran yang meminta Anda memasukkan teks, dan mengembalikan hasilnya.
Dev
5
@ Dev Tentu saja browser web grafis memiliki STDIN, sama seperti setiap proses lainnya. Jika Anda tidak dapat menggunakannya dari bahasa tertentu adalah pertanyaan lain dan jika jawabannya "Tidak", maka saya mungkin bisa digunakan dalam tantangan ini.
pipa
5
@ Dev Metode I / O standar mencakup input melalui prompt GUI dan output melalui tampilan GUI . Kecuali OP dimaksudkan untuk mengesampingkan standar, ini harus valid. Saya akan mengklarifikasi.
Buah Esolanging
2
Saya telah mengedit tantangan untuk memungkinkan lebih banyak IO, tetapi saya hanya mengembangkannya ke subset terbatas dari metode IO default. Jawaban ini masih dalam himpunan bagian saya. Saya suka itu.
Jared K
19

POSIX shell sh / bash / ... 8 byte

toko:

dd>f

mendapatkan:

dd<f
Jofel
sumber
2
Nice one, beat even cat...
cmaster
12

Python 3 , 46 byte

toko, 45 byte:

open(*'fw').write('print(%r)'%open(0).read())

Program mengambil dibangun oleh perintah toko, file bernama f. ( 1 byte untuk nama file )

ovs
sumber
2
Tentunya Anda bisa menggunakan input()?
Artemis Fowl
@ArtemisFowl input()hanya menerima hingga baris baru pertama. open(0).readmembaca semua STDIN
Jo King
Anda mungkin memposting ketika semuanya masih ambigu, tetapi apa adanya jawaban ini tidak memenuhi spesifikasi saat ini. Saya awalnya bermaksud persyaratan STDIN / STDOUT ketat, dengan standarnya tidak diperbolehkan. Saya telah mengembangkannya, tetapi hanya untuk sebagian dari standar. Program pengambilan Anda, jika tidak menggunakan STDOUT, masih perlu menampilkan output di layar. Jika saya mengizinkan default penuh, solusi untuk setiap bahasa adalah 'mengambil input dalam file', 'memberikan output dalam file', nol byte.
Jared K
@ JaredK Saya tidak berpikir Anda cukup mengerti cara kerjanya. The store-Program membaca masukan dari STDIN dan kemudian menyimpan program Python yang mencetak masukan ini di f. Contoh: STORE disebut dengan input dari abc. Kemudian menulis print('abc')untuk f. Jika sekarang Anda memanggil f(RETRIEVE), ia mencetak abcke STDOUT.
Ovs
@ JaredK, saya bertanya dalam komentar apakah diizinkan untuk STORE untuk memodifikasi RETRIEVE.
Ov
10

Batch, 16 byte

COPY CON A
TYPE A
l4m2
sumber
8

Powershell - 4 Bytes

Penyimpanan:

ac

(alternatif juga sc)

Pengambilan

gc

Sunting: Saya baru memperhatikan bahwa output tidak diperbolehkan input pengguna apa pun ... sehingga melonjak dari 4 menjadi 6 atau 8 byte

Penyimpanan:

ac f

(Alternatif juga sc f) untuk versi 8 byte

ac

(dan tentukan fsebagai path) untuk Versi 6 byte

Pengambilan

gc f
Heiko Hatzfeld
sumber
8

Rust, 136 byte

Simpan (84 byte)

use std::{fs::*,io::*};

||{let mut v=vec![];stdin().read_to_end(&mut v);write("a",v)}

Retrieve (52 bytes)

||print!("{}",std::fs::read_to_string("a").unwrap())

Ucapan Terima Kasih

Jakob
sumber
1
Anda dapat menyimpan byte dengan mengubah impor ke use std::{io::*,fs::*}dan kemudian menggunakan writealih-alih std::fs::write.
Buah Esolanging
Bagaimana dengan write("a",String::from_iter(stdin().chars()))?
Bergi
@Bergi Bagus. Namun charspemicu error[E0658]: use of unstable library feature 'io'pada Rust stabil.
Jakob
Hm, tampaknya chars()sudah usang dalam mendukung String::from_utf8(stdin().bytes()). (Juga saya menggunakan dokumen malam, tidak yakin apakah itu pelakunya)
Bergi
@Bergi Saya mencoba beberapa variasi dengan bytes()atau chars()tetapi tidak ada yang sangat pendek karena item iterator dibungkus io::Result.
Buah Esolanging
8

Pesta, 12 11 10 byte

toko, 7 6 5 byte

cat ->f# tidak perlu -, stdin adalah default

cat >f# tidak perlu ruang, >pisahkan juga

cat>f

ambil, 5 byte

cat f
Pelle
sumber
1
Tidak perlu -dalam program toko.
Konrad Rudolph
2
Tidak perlu ruang antara "kucing" dan ">", baik!
psmears
Anda harus dapat melakukan hal yang sama seperti pada pos zsh untuk menulis dan menggunakan >f. Saya tidak yakin apakah <fvalid untuk membaca.
allo
@allo Setidaknya di Cygwin, >fberfungsi seperti echo '' > f(mengosongkan file jika ada, membuat jika tidak), sementara <ftampaknya menjadi no-op.
sundar
7

HP 49G RPL, 48 byte

Untuk menyimpan :2: A DUP PURGE STO:, 26,5 byte

Untuk mengembalikan :2: A RCL:, 21,5 byte

Jika 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.

Jason
sumber
Solusi nol-byte harus bekerja untuk berbagai macam kalibrasi. Saya akan menerobos 42 saya ketika saya pulang.
SIGSTACKFAULT
Saya pikir solusi nol-byte Anda, dan yang lainnya dijalankan pada kalkulator yang reboot non-destruktif, gagal memenuhi dua bagian dari pertanyaan: "Anda akan membuat dua program." Apa yang Anda dapatkan adalah satu program yang selamat dari reboot. Dan "Store membaca dari STDIN dan kemudian keluar tanpa kesalahan." Program Anda masih menunggu pengguna untuk menekan tombol. Tumpukan dan kondisi eksekusi program Anda masih bisa berubah. Saya pikir itu berarti masih berjalan, dan belum keluar.
Jared K
@ JaredK Pertanyaan itu tidak pernah menetapkan bahwa kedua program tidak bisa identik. Adapun bagian yang keluar: secara tradisional dalam input RPL untuk program diberikan pada stack. Itu adalah input standar.
Jason
1
Apakah tumpukan akan bertahan dalam siklus daya? Mungkin soft power-off melalui tombol kalkulator, tapi saya rasa tidak melepas baterai. Jadi mungkin itu tergantung apa itu siklus daya.
pengguna
1
@ pengguna Tidak, tumpukan tidak tahan lunak (ON + C) atau hard reset (ON + A + F) (berbeda dari soft-power off, Right Shift + ON), tidak seperti menyimpan di port 2, yang merupakan memori flash ( dan selamat dari reset lunak dan sulit). Karena jawaban TI-BASIC tampaknya menggunakan definisi itu, saya memasukkan jawaban tumpukan untuk kelengkapan.
Jason
6

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 komponen pertama * terakhir dari nomor file 1

Sesi Toko APLXAPLX Retrieve session

* Dokumentasi mengatakan pertama tetapi eksperimen menunjukkan yang terakhir .

Adm
sumber
6

bash, 10 byte (tidak bersaing)

touch $@
ls

Nama file Unix dapat berisi karakter apa pun kecuali NULdan /, 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 dari lsdiizinkan). 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:

35 33 byte

mkdir -p $@
find|sed '$!d;s/..//'

Ini memungkinkan /karakter dalam string, dan mendukung lebih banyak karakter (persis berapa banyak tergantung pada implementasi).

(-2 byte untuk ini berkat @Cow quack)

sundar
sumber
1
IIRC, saya percaya bahwa suatu kelompok di Berkeley pernah menciptakan sistem database pada 1990-an yang menyimpan data kolom tabel sebagai nama file (hingga 255 karakter). Saya pikir baris dan tabel adalah direktori induk.
David R Tribble
Dalam jawaban 35 byte Anda, Anda dapat mengubah pernyataan kedua menjadi 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.
Kritixi Lithos
@Cowsquack Selesai. Terima kasih telah menjelaskan mengapa perubahan itu berhasil juga.
sundar
Anda perlu menggunakan "$@", tidak $@, untuk menghindari dibakar oleh spasi, *, ?, atau ~karakter.
Anders Kaseorg
5

Python 3, 56 byte

Simpan (33 byte)

open(*'aw').write(open(0).read())

Ambil (23 byte)

print(open('a').read())

Mencetak dengan baris baru yang tertinggal.

Jakob
sumber
mengapa tidak input()bukan open(0).read()dan omit end=dari print?
MoxieBall
@MoxieBall Tidak yakin mengapa inputtidak digunakan, tetapi menghilangkan end=akan menghasilkan baris baru yang ditambahkan ke akhir string (yaitu, bukan string asli) (mungkin)
@NickA Sepertinya baris baru akan dicetak dalam pertanyaan, jadi saya tidak berpikir itu penting ...
MoxieBall
Apakah saya sudah gila atau apakah 23 + 33 = 56 (bukan 54)? Juga mengapa tidak digunakan input()?
Artemis Fowl
1
@ArtemisFowl Tangkapan bagus. Adapun input, saya berasumsi bahwa string untuk bertahan dapat berisi baris baru.
Jakob
4

Japt, 46 30 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)

Ox`lo¯lSÈSge.P=U

Retrieve (14 bytes)

Ox`lo¯lSÈSge.P
LegionMammal978
sumber
+1 karena menjadi orang pertama yang menggunakan sesuatu selain file standar IO, saya menyukainya.
Jared K
1
Selamat Datang di Japt! :)
Shaggy
1
Omong-omong, Anda dapat memotong setItemdan getItemsepenuhnya dengan localStorage.key. Tetapkan nilai , ambil nilai
Shaggy
@Shaggy Terima kasih! Anda juga menghindari karakter kontrol yang lebih aneh.
LegionMammal978
4

Haskell, 46 byte

Simpan (26 byte):

getContents>>=writeFile"t"

Ambil (20 byte):

readFile"t">>=putStr
nimi
sumber
3

Ruby (26 Bytes)

Set (16 Bytes)

IO.write'a',gets

Dapatkan (10 Bytes)

IO.read'a'
DarkWiiPlayer
sumber
3

MATLAB (30 Bytes)

Set (22 Bytes)

a=input('','s');save a

Dapat memangkas 4 byte dengan mengubah ke input(''), tetapi ini akan membutuhkan input dalam tanda kutip tunggal:'input string'

Dapatkan (8 Bytes)

load a;a
Oct18 adalah hari hening di SE
sumber
3

C (GCC), 98 byte

Simpan (46 byte)

Input melalui argumen baris perintah pertama.

main(c,v)char**v;{fputs(v[1],fopen("a","w"));}

Retrieve (52 bytes)

c,d;r(){for(d=open("a",0);read(d,&c,1);)putchar(c);}

Unportability

  • Mengharuskan beberapa jenis pointer cocok int.

Ucapan Terima Kasih

Jakob
sumber
1
Ini membutuhkan implementasi C di mana intdapat menyimpan pointer, agar deklarasi implisit int fopen()untuk berfungsi. (mis. kebanyakan sistem 32-bit, atau gunakan gcc -m32jika Anda menggunakan x86-64 untuk membuat 32-bit dapat dieksekusi.) Dan BTW, saya mencoba menggunakan Linux sendfiledan copy_file_range(2)panggilan sistem, tetapi mereka tidak bekerja ke / dari TTY.
Peter Cordes
1
Karena Anda sedang menulis fungsi, bukan program, mungkin Anda bisa membenarkan mengambil string input sebagai fungsi yang memungkinkan fputs(fopen()), dan read(open(),buf,-1). (Pertanyaannya sekarang memungkinkan arg baris perintah sebagai input.)
Peter Cordes
Fungsi 'splice' Linux menyalin dari sebuah pipa ke file (dan sebaliknya). Jika stdin / out adalah pipa, maka itu akan menghemat panggilan fungsi, dengan mengorbankan lebih banyak parameter.
CSM
2

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 besar 1 dan timpa jika file ada

 bagian pertama (data, bagian selanjutnya adalah penyandian dan tipe akhir baris) untuk
⎕NGET mendapatkan file asli
⎕A alfabet huruf besar

Adm
sumber
2

R (27 byte)

toko (21 byte)

x=readLines('stdin')

memuat (6 byte)

cat(x)

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 readLinedari bekerja dalam mode non-interaktif. Dalam mode interaktif, itu tidak perlu, dan karena itu solusinya hanya menggunakan 20 byte .

Konrad Rudolph
sumber
1
Saya pikir itu akan jauh lebih efisien untuk digunakan qsecara langsung, dengan program pertama sedang x=scan(); q("y")dan yang kedua baik xatau cat(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 --savedan --restore(yang formulasi saya tidak perlu)
JDL
@JDL scantidak berfungsi untuk konten yang sewenang-wenang, dan scan(w='character')lebih lama dari readLines(). qtidak perlu (tetapi q('y')tidak akan berhasil, Anda harus mengejanya yes). Saya berpikir tentang hanya menggunakan xdalam program kedua tetapi ini akan melanggar persyaratan, sejauh yang saya mengerti.
Konrad Rudolph
1
Anda dapat menggunakan scan(w=""), Anda tidak perlu mengeja jenis, scanakan 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.
JDL
@JDL scan: Oh, rapi, dokumentasi tidak menyebutkan ini! Sayangnya scanakan tetap melakukan parsing sehingga ini tidak akan bekerja dengan semua input. Bagaimanapun, scan('stdin',w='')kebetulan sama panjangnya dengan readLines('stdin'). q: R 3.4.4 mengatakan “Kesalahan dalam q (" y "): nilai 'save'" yang tidak dikenal.
Konrad Rudolph
Ah, ini adalah hal Rstudio - Saya mencobanya di Rstudio dan secara terpisah di terminal dan itu hanya bekerja di Rstudio.
JDL
2

Java (JDK 10) , 204 Bytes

Peringatan: Timpa preferensi yang disimpan oleh program java untuk nama pengguna Anda!

Simpan, 94 Bytes:

interface S{static void main(String[]a){java.util.prefs.Preferences.userRoot().put("",a[0]);}}

Cobalah online!

Ambil 110 Bytes:

interface R{static void main(String[]a){System.out.print(java.util.prefs.Preferences.userRoot().get("",""));}}

Cobalah online!

java S foo
java R
foo

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.

Jared K
sumber
Ide bagus! Karena Anda menggunakan Java 10, Anda dapat mempersingkat ini dengan membuatnya ekspresi lambda. Juga jika jumlah byte Anda tidak termasuk, zAnda 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.
Jakob
Terima kasih! Saya membuat suntingan yang Anda sarankan. Saya tidak yakin tetapi saya tidak berpikir ekspresi lambda dapat memenuhi aturan IO khusus untuk pertanyaan ini.
Jared K
Doh. Anda benar, saya lupa tentang itu.
Jakob
2

C #, 157 Bytes

Set, 74 Bytes:

class P{static void Main(string[]a){System.IO.File.WriteAllLines("a",a);}}

Dapatkan, 83 Bytes:

class P{static void Main(){System.Console.Write(System.IO.File.ReadAllText("a"));}}

-1 Bytes berkat VisualMelon
-2 Bytes terima kasih kepada LiefdeWen

raznagul
sumber
Hapus ruang itu setelah "a",, dan saya ragu ini akan dikalahkan :)
VisualMelon
Anda dapat menyimpan byte lain dengan menggunakan WriteAllLinesdan parameter keduaa
LiefdeWen
2

Perl 5, 48 26 23 byte

Tulis, 20 + 1 (-n) byte

-3 byte terima kasih kepada mob

open f,">>f";print f

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

perl -pe "" f
Geoffrey H.
sumber
1
Mengapa Anda skor -nedengan 1 (harus memiliki eterlalu), tetapi -pedengan 2? Anda bisa menggunakan -Edan saybukannya print.
simbabque
Terima kasih telah memberi tahu saya -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 seperti perl -n w.plJika ini bertentangan dengan standar komunitas PCG, saya dapat mengedit jawaban saya.
Geoffrey H.
Tidak apa-apa. Kami menambahkan malus untuk argumen baris perintah tambahan, jadi tidak masalah.
simbabque
2
">>","f"-> ">>f"menyimpan 3 char
mob
1

Attache , 23 + 16 = 39 byte

Cukup menulis STDIN ke file A, lalu membaca file A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Pengujian

C:\Users\conorob\Programming\attache (master -> origin)
λ echo testing | attache store.@

C:\Users\conorob\Programming\attache (master -> origin)
λ attache retrieve.@
testing
Conor O'Brien
sumber
1

Lua, 57 53 51 byte

Simpan, 27 byte

io.open("x","w"):write(...)

Retrieve, 24 byte

print(io.open"x":read())
Lycea
sumber
1

RUBI

Simpan (24 byte)

File.write('a', ARGV[0])

Ambil (16 byte)

p File.read('a')
Gregory
sumber
4
Pertanyaannya meminta untuk menyimpan input dari STDIN, bukan argumen
Ferrybig
Sejak itu saya telah diedit untuk memungkinkan IO alternatif termasuk argumen.
Jared K
1
File.write'a',getsdan p File.read'a'sedikit lebih pendek;)
DarkWiiPlayer
1

C (Unix / GNU), 23 + 23 = 46 byte

Simpan, 27 23 byte

main(){system("dd>f");}

Ambil, 27 23 byte

main(){system("dd<f");}

Ini pada dasarnya membungkus jawaban jofel ke dalam program C.

Catatan: ddPerintah menampilkan beberapa statistik stderr, 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 pada stdout, tidak stderr, saya bawa bahwa itu diperbolehkan untuk memiliki output tambahan pada stderr... Pokoknya, menekan stderroutput semudah mengganti dddengan cat, meningkatkan jumlah byte dari dua program per satu, masing-masing.

cmaster
sumber
Bergantung pada kompiler Anda, Anda mungkin juga dapat menghapus intjenis pengembalian dari main. Dalam gaya ANSI C lama intadalah tipe pengembalian default.
Jakob
@ Jakob Ah, ya, tentu saja. Saya bersandar pada deklarasi implisit system()dan lupa tentang itu main()- aduh. Terima kasih telah menunjukkan :-)
cmaster
1

PHP, 26 + 1 + 21 = 48 byte

Store.php:

<?fputs(fopen(s,w),$argn);

Jalankan dengan echo <input> | php -nF Store.php.

Retrieve.php:

<?=fgets(fopen(s,r));

Jalankan dengan php -n Retrieve.php.

Titus
sumber
1

C (gcc) , 77 67 + 25 = 92 byte

Kompilasi dengan hanya beberapa peringatan di gcc saya.

store.c

#include<stdio.h>
main(int c,char**v){fputs(v[1],fopen("f","w"));}

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

main(){system("cat f");}
SIGSTACKFAULT
sumber
int*f=fopenharus bekerja, yaitu berbohong kepada kompiler Anda tentang jenis pointer. Tetapi hanya jika Anda mengkompilasi untuk sistem 32-bit (yaitu satu di mana intdapat menyimpan pointer, seperti gcc -m32, atau hanya gccpada sistem 32-bit sepenuhnya). Anda juga dapat mendeklarasikan main sebagai main(int c,char**v), atau mungkin int**vkarena Anda tidak melakukan dereferensi.
Peter Cordes
The main(int c,char**v)karya. Saya juga sadar saya bisa melakukannya fputs(v[1],fopen("f","w"), walaupun masih perlu stdio untuk beberapa alasan.
SIGSTACKFAULT
Ini harus bekerja jika Anda mengkompilasi executable 32-bit. Untuk x86-64, kompiler akan memotong nilai intkembali menjadi 32 bit, kemudian memperpanjang tanda itu sebagai pointer. Jika yang dikembalikan FILE*adalah dalam 32 bit yang rendah, itu akan berhasil, tetapi itu tidak terjadi pada x86-64 Linux.
Peter Cordes
Jika Anda berada di sistem di mana semua pointer memiliki ukuran yang sama (agak mungkin), Anda dapat menghindari menyertakan dengan mendeklarasikan fopensecara manual. Pergi sekolah tua dengan argumen menyimpan beberapa byte juga: *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
gastropner
1

Gelombang - 11 Bytes

%12>f
type f

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)

'>%1
dir

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.

GetHacked
sumber
1
Solusi Anda tampaknya menghasilkan pada STDOUT, yang valid. STDERR hanyalah pilihan lain, tidak wajib. Kutipan di sekitar input tidak menghentikannya untuk bersaing. Satu-satunya pertanyaan adalah apakah mereka harus dihitung dalam jumlah byte Anda. Saya kira tidak, karena mereka tidak spesifik untuk pertanyaan itu. Mereka tampak seperti boilerplate standar untuk Batch untuk mengambil argumen baris perintah, yang tidak begitu berbeda dari bahasa yang membutuhkan bendera baris perintah standar. Mungkin orang lain dengan pengetahuan Batch akan berpadu. Untuk saat ini tinggalkan mereka di luar hitungan byte. Selamat datang di Golf Code! :)
Jared K