Mã ngắn nhất trong ngôn ngữ của bạn để duy trì một chuỗi trong quá trình khởi động lại


48

Chương trình của bạn:

Bạn sẽ viết hai chương trình (cả hai cùng một ngôn ngữ). Chương trình lưu trữ lấy một chuỗi từ STDIN và lưu nó ở đâu đó liên tục (xem bên dưới) và sau đó thoát mà không có lỗi. Chương trình truy xuất không có đầu vào, lấy chuỗi được lưu trữ và in nó thành STDOUT.

Thử nghiệm khách quan về tính bền bỉ:

Bạn sẽ có thể chạy chương trình lưu trữ trên máy cục bộ của mình, sau đó cấp nguồn cho máy cục bộ của bạn, sau đó gọi chương trình truy xuất trên máy cục bộ của bạn. Bạn có thể bỏ chuỗi theo cách bạn muốn (ngay cả trên web) miễn là bạn vượt qua bài kiểm tra khởi động lại này.

Các trường hợp thử nghiệm:

Lưu trữ sau đó truy xuất:

echo foo | Store
Retrieve
foo

Cửa hàng lặp lại sẽ ghi đè (như phương thức set ()):

echo foo | Store
echo bar | Store
Retrieve
bar

Lặp lại truy xuất là không phá hủy (như phương thức get ()):

echo foo | Store
Retrieve
foo
Retrieve
foo

Truy xuất trước bất kỳ yêu cầu lưu trữ nào:

Bạn không cần phải lo lắng về điều này. Chương trình truy xuất của bạn có thể cho rằng chương trình lưu trữ đã được chạy tại một số điểm trong quá khứ.

Linh hoạt đầu vào / đầu ra.

Mọi người đã yêu cầu tôi mở rộng điều này từ STDIN / STDOUT nghiêm ngặt sang các quy tắc IO tiêu chuẩn. Tôi không thể bởi vì nó sẽ giới thiệu quá nhiều sơ hở. Một số tùy chọn IO tiêu chuẩn đã có đầu vào được lưu trữ một cách liên tục, ví dụ: "các chương trình có thể lấy đầu vào từ một tệp". Tôi muốn linh hoạt hơn là chỉ STDIN và STDOUT nghiêm ngặt, nhưng không mở lũ.

Từ chuỗi quy tắc IO tiêu chuẩn, tôi chọn những thứ không phá vỡ thử thách:

Nếu bạn sử dụng thay thế, nó phải tương tác với người dùng. Người dùng không cần phải thực hiện bất kỳ công việc nào khác ngoài việc đưa đầu vào của họ vào chương trình của bạn, nhập nó vào một dấu nhắc mà chương trình của bạn cung cấp hoặc nhập dữ liệu dưới dạng một dòng lệnh của chương trình của bạn. Người dùng không cần phải làm gì khác hơn là chạy chương trình truy xuất của bạn để xem đầu ra được hiển thị trên màn hình hoặc được gửi đến STDOUT hoặc STDERR.

Giả định được phép:

  • Hai chương trình của bạn sẽ được chạy trong cùng một thư mục
  • Các chương trình của bạn có quyền đọc-ghi cho thư mục đó
  • Các tệp bạn tạo sẽ tồn tại khi khởi động lại (không phải trong thư mục tạm thời)
  • Một dòng mới không phải là một phần của chuỗi được cho phép. Không có khoảng trắng khác

Đây là môn đánh gôn và điểm của bạn là tổng số byte của cả hai chương trình.


9
vậy chỉ echo $@>xcat xcó hợp lệ không?
Adám

1
Thông số kỹ thuật của bạn không đề cập đến khả năng lưu trữ nhiều lần, nhưng bạn có một trường hợp ví dụ như vậy. Chúng ta có thể giả định một môi trường sạch cho mỗi lần gọi Store?
Adám

4
@EriktheOutgolfer Tại sao nó không hợp lệ? Ngay cả khi có một lỗ hổng được thảo luận về meta mà không ngăn cản một thách thức cụ thể cho phép nó.
dylnan

6
Các hạn chế về web thường là về việc lấy nội dung từ trang web như một lỗ hổng để thoát khỏi công việc tạo ra nội dung đó. Trong trường hợp này, nếu nó trên web thì đó là vì bạn đã làm công việc đưa nó lên đó.
Jared K

3
Ai đó cần viết câu trả lời cho máy tính có bộ nhớ lõi từ.
Đánh dấu

Câu trả lời:


88

zsh, 4 byte

Lưu trữ: >f(đọc từ STDIN và ghi vào một tệp có tên f)
Lấy: <f(ghi nội dung của fSTDOUT)


8
Tôi nghĩ rằng chúng tôi có một người chiến thắng.
Adám

@ Adám trừ khi có mã thông báo để ghi đầu vào vào tệp trong 1 byte: P
FreezePhoenix

1
@FreezePhoenix Có lẽ không có gì trừ khi bạn viết một ngôn ngữ mới hiện không được phép ...
Chromium

4
@Chromium kiểm tra câu trả lời Z80: một số ngôn ngữ hiện có có thể viết từ chương trình 0 byte.
Cœur

55

TI-BASIC (Z80), 1 byte ?

Lưu trữ:  (chỉ cần nhập chuỗi)
Lấy: Ans(byte 27)

Nhưng nếu điều đó không hợp lệ:

TI-BASIC (Z80), 7 6 byte

-1 cảm ơn Jakob.

Lưu trữ: Prompt Str0(byte DD AA 09)
Truy xuất: disp Str0(byte ED AA 09)


1
Bạn có chắc là 5 byte không?
FreezePhoenix

6
@FreezePhoenix TI-Basic sử dụng mã thông báo.
Adám

3
Hmm ... Tại sao không đưa đầu vào qua Ansvà duy trì nó trong cùng một biến? Một chương trình lưu trữ trống và chỉ Ansđể lấy nên hoạt động: 1 byte!
Jakob

9
@Arthur Yep, Ansvẫn tồn tại. Trong thực tế, rất nhiều trạng thái vẫn tồn tại, bao gồm (tôi nghĩ) tất cả các biến, phương trình và lịch sử của người dùng. Từ quan điểm của người dùng, tắt nguồn về cơ bản là máy tính TI tương đương với trạng thái ngủ cho PC, vì vậy nó không phá vỡ nhiều.
Jakob

2
@JaredK Tôi chắc chắn đồng ý rằng giải pháp 1 byte có mùi lạm dụng quy tắc (mặc dù tôi là người đề xuất nó). Tuy nhiên, tôi sẽ nói rằng chương trình cửa hàng thoát, vì các chương trình khác có thể được chạy sau nó (mặc dù chúng can thiệp vào hoạt động của giải pháp). Giải thích của tôi về "thử nghiệm khách quan về sự kiên trì" của bạn là các chương trình sẽ được chạy trực tiếp trước và sau chu kỳ nguồn. Nếu điều đó không chính xác, có lẽ bạn có thể yêu cầu giải pháp 1 byte được đánh dấu là không lọc?
Jakob

23

Trình duyệt JS, 44 byte

Cửa hàng :

localStorage.a=prompt()

Lấy :

alert(localStorage.a)

Sẽ prompt()đọc từ STDIN?
đường ống

9
Trình duyệt web đồ họa có STDIN không? Số prompt()bật lên một cảnh báo yêu cầu bạn nhập văn bản và trả về kết quả.
Dev

5
@Dev Tất nhiên một trình duyệt web đồ họa có STDIN, giống như mọi quy trình khác. Nếu bạn không thể sử dụng nó từ một ngôn ngữ cụ thể là một câu hỏi khác và nếu câu trả lời là "Không", thì tôi có thể sử dụng nó trong thử thách này.
đường ống

5
@Dev Các phương thức I / O mặc định bao gồm đầu vào qua dấu nhắc GUIđầu ra qua màn hình GUI . Trừ khi OP có nghĩa là ghi đè tiêu chuẩn, điều này sẽ hợp lệ. Tôi sẽ làm rõ.
Trái cây Esolanging

2
Tôi đã chỉnh sửa thử thách để cho phép nhiều IO hơn, nhưng tôi chỉ mở rộng nó thành một tập hợp con giới hạn của các phương thức IO mặc định. Câu trả lời này là trong tập hợp con của tôi mặc dù. Tôi thích nó.
Jared K

19

Vỏ POSIX sh / bash / ... 8 byte

cửa hàng:

dd>f

được:

dd<f

2
Đẹp một, nhịp thậm chí cat...
cmaster

12

Python 3 , 46 byte

lưu trữ, 45 byte:

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

Chương trình truy xuất được xây dựng bởi lệnh store, một tệp có tên f. ( 1 byte cho tên tệp )


2
Chắc chắn bạn có thể sử dụng input()?
Artemis Fowl

@ArtemisFowl input()chỉ nhận được tối đa dòng mới đầu tiên. open(0).readđọc tất cả STDIN
Jo King

Bạn có thể đăng khi mọi thứ vẫn còn mơ hồ, nhưng câu trả lời này không đáp ứng được thông số hiện tại. Ban đầu tôi dự định yêu cầu STDIN / STDOUT là nghiêm ngặt, với mặc định không được phép. Tôi đã mở rộng nó, nhưng chỉ thành một tập hợp con mặc định. Chương trình truy xuất của bạn, nếu nó không sử dụng STDOUT, vẫn cần hiển thị đầu ra trên màn hình. Nếu tôi cho phép mặc định đầy đủ, giải pháp cho mọi ngôn ngữ sẽ là 'lấy đầu vào trong một tệp', 'cung cấp đầu ra trong một tệp', không có byte.
Jared K

@JaredK Tôi không nghĩ bạn khá hiểu cách thức hoạt động của nó. Chương storetrình-đọc các đầu vào từ STDIN và sau đó lưu trữ một chương trình Python in đầu vào này f. Ví dụ: STORE được gọi với đầu vào là abc. Sau đó nó viết thư print('abc')cho f. Nếu bây giờ bạn gọi f(RETRIEVE), nó sẽ in abcthành STDOUT.
trứng

@JaredK Tôi đã hỏi bạn trong một bình luận rằng nó có được phép cho STORE sửa đổi RETRIEVE không.
trứng


8

Powershell - 4 byte

Lưu trữ:

ac

(cũng thay thế sc)

Lấy lại

gc

Chỉnh sửa: Tôi chỉ nhận thấy đầu ra không cho phép bất kỳ đầu vào của người dùng nào ... vì vậy nó nhảy từ 4 đến 6 hoặc 8 byte

Lưu trữ:

ac f

(cũng thay thế sc f) cho phiên bản 8 byte

ac

(và chỉ định flà đường dẫn) cho Phiên bản 6 byte

Lấy lại

gc f

8

Rust, 136 byte

Lưu trữ (84 byte)

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

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

Truy xuất (52 byte)

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

Sự nhìn nhận


1
Bạn có thể lưu một byte bằng cách thay đổi nhập vào use std::{io::*,fs::*}và sau đó sử dụng writethay vì std::fs::write.
Trái cây Esolanging

Thế còn write("a",String::from_iter(stdin().chars()))?
Bergi

@Bergi Đẹp. Nhưng charskích hoạt error[E0658]: use of unstable library feature 'io'trong Rust ổn định.
Jakob

Hừm, có vẻ như chars()không được ủng hộ String::from_utf8(stdin().bytes()). (Ngoài ra tôi đã sử dụng các tài liệu hàng đêm, không chắc đó có phải là thủ phạm hay không)
Bergi

@Bergi Tôi đã thử một vài biến thể với bytes()hoặc chars()không có biến thể nào trong số chúng rất ngắn vì mục lặp được gói io::Result.
Esolanging Fruit

8

Bash, 12 11 10 byte

cửa hàng, 7 6 5 byte

cat ->f# không cần -, stdin là mặc định

cat >f# không cần không gian, cũng >tách biệt

cat>f

lấy, 5 byte

cat f

1
Không cần -trong chương trình cửa hàng.
Konrad Rudolph

2
Không cần khoảng trống giữa "mèo" và ">"!
psmears

Bạn sẽ có thể làm tương tự như trong bài zsh để viết và sử dụng >f. Tôi không chắc chắn nếu <fcó giá trị để đọc, mặc dù.
allo

@allo Ít nhất là trên Cygwin, >fhoạt động như echo '' > f(làm trống tệp nếu nó tồn tại, tạo nếu không), trong khi <fdường như là không có.
Sundar

7

HP 49G RPL, 48 byte

Để lưu : :2: A DUP PURGE STO, 26,5 byte

Để khôi phục : :2: A RCL, 21,5 byte

Nếu chúng ta có thể để lại pin dự phòng, chúng ta sẽ nhận được:

HP 49G RPL, 0 byte

Để lưu : , 0 byte

Để khôi phục : , 0 byte, vì HP 49G khiến cho ngăn xếp không bị ảnh hưởng trong quá trình khởi động lại.


Giải pháp không byte nên hoạt động cho nhiều loại hạt nhân. Tôi sẽ bán hết 42 tuổi khi về đến nhà.
SIGSTACKFAULT

Tôi nghĩ rằng giải pháp không byte của bạn và các giải pháp khác đang chạy trên máy tính khởi động lại không phá hủy, không đáp ứng được hai phần của câu hỏi: "Bạn sẽ tạo hai chương trình." Những gì bạn đã có là một chương trình duy nhất sống sót sau khi khởi động lại. Và "Cửa hàng đọc từ STDIN và sau đó thoát mà không có lỗi." Chương trình của bạn vẫn đang chờ người dùng nhấn phím. Ngăn xếp và trạng thái thực thi của chương trình của bạn vẫn có thể thay đổi. Tôi nghĩ điều đó có nghĩa là nó vẫn đang chạy và chưa thoát.
Jared K

@JaredK Câu hỏi không bao giờ quy định rằng hai chương trình không thể giống nhau. Đối với phần thoát: theo truyền thống trong đầu vào RPL cho các chương trình được đưa ra trên ngăn xếp. Đó đầu vào tiêu chuẩn.
Jason

1
Ngăn xếp sẽ tồn tại một chu kỳ năng lượng? Có thể tắt nguồn thông qua các nút của máy tính, nhưng tôi đoán là không tháo pin. Vì vậy, có thể nó phụ thuộc vào một chu kỳ năng lượng là gì.
người dùng

1
@user Không, stack không tồn tại mềm (ON + C) hoặc thiết lập lại cứng (ON + A + F) (khác với tắt nguồn mềm, Shift phải + ON), không giống như lưu trữ trong cổng 2, là bộ nhớ flash ( và tồn tại thiết lập lại mềm và cứng). Vì câu trả lời TI-BASIC dường như sử dụng định nghĩa đó, tôi đã bao gồm câu trả lời ngăn xếp cho đầy đủ.
Jason

6

APL (APLX) , 5 byte

Cửa hàng: ⍞⍈1
Lấy:⍇1

 lấy dòng từ stdin
⍈1 ghi vào thành phần có sẵn tiếp theo của tệp số 1

⍇1 đọc thành phần đầu tiên * cuối cùng của tập tin số 1

Phiên APLXPhiên truy xuất APLX

* Tài liệu nói đầu tiên nhưng thử nghiệm cho thấy cuối cùng .


6

bash, 10 byte (không cạnh tranh)

touch $@
ls

Tên tệp Unix có thể chứa bất kỳ ký tự nào ngoại trừ NUL/, và tên của chúng có thể dài tới 255 byte, do đó, điều này sẽ chỉ có thể lưu trữ các chuỗi có độ dài đến mức đó (xem xét rằng giới hạn của phương tiện lưu trữ) và không chứa '/ ' trong chúng. Đó là một lý do khiến điều này không cạnh tranh, một lý do khác là giả định thư mục mà nó chạy trên đó trống (hoặc lscho phép đầu ra không liên quan từ đó được cho phép). Tôi vẫn muốn đăng bài này vì nó có vẻ là một cách hay và không rõ ràng để lưu trữ thông tin.

Một cái khác trên một tĩnh mạch tương tự, sẽ không có cùng độ dài và giới hạn ký tự sẽ là:

35 33 byte

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

Điều này cho phép /ký tự trong chuỗi và hỗ trợ nhiều ký tự hơn (chính xác có bao nhiêu phụ thuộc vào việc thực hiện).

(-2 byte về điều này nhờ vào quẻ @Cows)


1
IIRC, tôi tin rằng một nhóm tại Berkeley đã từng tạo ra một hệ thống cơ sở dữ liệu vào những năm 1990 lưu trữ dữ liệu cột của bảng dưới dạng tên tệp (tối đa 255 ký tự). Tôi nghĩ rằng các hàng và bảng là thư mục cha.
David R Tribble

Trong câu trả lời 35 byte của bạn, bạn có thể thay đổi câu lệnh thứ hai thành s/..//. Các $không cần thiết bởi vì tất cả các dòng khác đang bị xóa vì vậy đây chỉ có thể áp dụng đối với dòng cuối cùng, và ^có thể được giảm bởi vì việc thay thế chỉ áp dụng vào trận đấu đầu tiên.
Kritixi Lithos

@Cowsquack Xong. Cảm ơn đã giải thích lý do tại sao thay đổi hoạt động, quá.
Sundar

Bạn cần sử dụng "$@", không $@, để tránh bị đốt cháy bởi khoảng trắng, *, ?, hoặc ~ký tự.
Anders Kaseorg

5

Python 3, 56 byte

Lưu trữ (33 byte)

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

Truy xuất (23 byte)

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

In với một dòng mới.


tại sao không input()thay vì open(0).read()và bỏ qua end=từ print?
MoxieBall

@MoxieBall Không chắc chắn về lý do tại sao inputkhông được sử dụng, nhưng việc bỏ qua end=sẽ dẫn đến một dòng mới được thêm vào cuối chuỗi (nghĩa là không phải chuỗi gốc) (có thể)
NickA

@NickA Dường như một dòng mới được in trong câu hỏi, dù sao đi nữa, vì vậy tôi không nghĩ rằng điều đó quan trọng ...
MoxieBall

Tôi đã phát điên hay 23 + 33 = 56 (không phải 54)? Ngoài ra tại sao không sử dụng input()?
Artemis Fowl

1
@ArtemisFowl Bắt tốt. Đối với input, tôi giả định rằng chuỗi để tồn tại có thể chứa dòng mới.
Jakob

4

Japt, 46 30 byte

-16 byte nhờ Shaggy .

Một trong những lần đầu tiên tôi thử sử dụng Japt. Đôi khi, eval JS có thể bồn chồn. Sử dụng trình duyệt window.localStorage.

Lưu trữ (16 byte)

Ox`lo¯lSÈSge.P=U

Lấy (14 byte)

Ox`lo¯lSÈSge.P

+1 vì là người đầu tiên sử dụng thứ gì đó ngoài tệp chuẩn IO Tôi thích nó.
Jared K

1
Chào mừng đến với Japt! :)
Xù xì

1
Nhân tiện, bạn có thể bỏ qua setItemgetItemhoàn toàn với localStorage.key. Đặt giá trị , truy xuất giá trị
Shaggy

@Shaggy Cảm ơn! Bạn cũng tránh các nhân vật điều khiển weirder.
LegionMammal978

4

Haskell, 46 byte

Lưu trữ (26 byte):

getContents>>=writeFile"t"

Lấy (20 byte):

readFile"t">>=putStr


3

MATLAB (30 byte)

Đặt (22 byte)

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

Có thể tắt 4 byte bằng cách thay đổi thành input(''), nhưng điều này sẽ yêu cầu đầu vào phải ở trong dấu ngoặc đơn:'input string'

Nhận (8 byte)

load a;a

3

C (GCC), 98 byte

Lưu trữ (46 byte)

Đầu vào là thông qua đối số dòng lệnh đầu tiên.

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

Truy xuất (52 byte)

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

Không có khả năng

  • Yêu cầu một số loại con trỏ phù hợp int.

Sự nhìn nhận


1
Điều này đòi hỏi phải thực hiện C trong đó intcó thể giữ một con trỏ, để khai báo ngầm int fopen()để làm việc. (ví dụ: hầu hết các hệ thống 32 bit hoặc sử dụng gcc -m32nếu bạn sử dụng x86-64 để tạo tệp thực thi 32 bit.) Và BTW, tôi đã thử sử dụng các cuộc gọi hệ thống sendfilevà Linux copy_file_range(2), nhưng chúng không hoạt động đến / từ TTY.
Peter Cordes

1
Vì bạn đang viết các hàm, không phải các chương trình, có lẽ bạn có thể biện minh cho việc lấy chuỗi đầu vào làm hàm cho phép fputs(fopen())read(open(),buf,-1). (Câu hỏi bây giờ cho phép một đối số dòng lệnh làm đầu vào.)
Peter Cordes

Hàm 'splice' của Linux sao chép từ một đường ống vào một tệp (và ngược lại). Nếu stdin / out là các đường ống, thì nó sẽ lưu một lệnh gọi hàm, với chi phí nhiều tham số hơn.
CSM

2

APL (Dyalog Unicode) , 18 byte

Cửa hàng: ⍞⎕NPUT⎕A 1 Hãy thử trực tuyến!
Lấy: ⊃⎕NGET⎕A Hãy thử trực tuyến!

 lấy dòng từ stdin
⎕NPUT đặt nó vào một tệp gốc gọi là
⎕A bảng chữ cái in hoa 1 và ghi đè nếu tệp tồn tại

 phần đầu tiên (dữ liệu, các phần tiếp theo là mã hóa và loại kết thúc dòng) của
⎕NGET tệp gốc
⎕A bảng chữ cái viết hoa


2

R (27 byte)

lưu trữ (21 byte)

x=readLines('stdin')

tải (6 byte)

cat(x)

Để làm việc này, tập lệnh đầu tiên cần được gọi với tùy chọn dòng lệnh --savevà tập lệnh thứ hai với --restore(mặc dù trong chế độ tương tác, điều này không cần thiết: các tùy chọn này là mặc định).

Điều này có thể rút ngắn 7 byte vì thực tế là lỗi trong R ngăn không cho đối số mặc định hoạt readLineđộng ở chế độ không tương tác. Trong chế độ tương tác, không cần thiết và do đó, giải pháp chỉ sử dụng 20 byte .


1
Tôi nghĩ rằng việc sử dụng qtrực tiếp sẽ hiệu quả hơn nhiều , với chương trình đầu tiên và chương trình x=scan(); q("y")thứ hai xhoặc cat(x)tùy thuộc vào mức độ nghiêm ngặt của chúng tôi muốn về cách các chuỗi được in. Theo các quy tắc golf mã thông thường, bạn cũng phải đếm các đối số dòng lệnh, vì vậy hãy thêm byte cho --save--restore(công thức của tôi không cần)
JDL

@JDL scankhông hoạt động đối với nội dung tùy ý và scan(w='character')dài hơn readLines(). qlà không cần thiết (nhưng q('y')sẽ không hoạt động, bạn phải đánh vần nó yes). Tôi đã nghĩ về việc chỉ sử dụng xtrong chương trình thứ hai nhưng điều này sẽ vi phạm các yêu cầu, theo như tôi hiểu chúng.
Konrad Rudolph

1
bạn có thể sử dụng scan(w=""), bạn không cần phải đánh vần loại, scansẽ suy ra từ loại đối số được chỉ định. Đối với tôi, q ("y") hoạt động như một lối thoát tiết kiệm nhưng có lẽ điều đó phụ thuộc vào phiên bản R của bạn và có thể bạn có đang sử dụng Rstudio hay không.
JDL

@JDL scan: Ồ, gọn gàng, tài liệu không đề cập đến điều này! Thật không may, scanvẫn sẽ thực hiện một số phân tích cú pháp vì vậy điều này sẽ không hoạt động với tất cả đầu vào. Dù sao, scan('stdin',w='')xảy ra là chính xác cùng chiều dài readLines('stdin'). q: R 3.4.4 cho biết Lỗi Lỗi trong q ("y"): giá trị không được nhận dạng của 'lưu'.
Konrad Rudolph

À, đó là một thứ Rstudio - Tôi đã thử nó trong Rstudio và riêng ở thiết bị đầu cuối và nó chỉ hoạt động trong Rstudio.
JDL

2

Java (JDK 10) , 204 byte

Cảnh báo: Ghi đè mọi tùy chọn mà bất kỳ chương trình java nào đã lưu trữ cho tên người dùng của bạn!

Cửa hàng, 94 byte:

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

Hãy thử trực tuyến!

Lấy 110 byte:

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

Hãy thử trực tuyến!

java S foo
java R
foo

Điều này hoạt động bằng cách lấy đầu vào làm đối số và lưu trữ nó trong kho lưu trữ tùy chọn người dùng được cung cấp bởi java.util.prefs . Nó ghi đè nút gốc của người dùng để lưu một byte khi đặt tên nút. Nếu bạn muốn kiểm tra nó không hủy cấu trúc, hãy chạy nó từ tên người dùng bị vứt bỏ hoặc thay đổi khóa từ "" thành tên nút.


Ý tưởng tốt! Vì bạn đang sử dụng Java 10, bạn có thể rút ngắn những điều này bằng cách biến chúng thành biểu thức lambda. Ngoài ra, nếu số byte của bạn không bao gồm, zbạn nên xóa nó khỏi chương trình và TIO. Thay vào đó, hãy xem xét đưa ra cảnh báo ở đầu bài nộp để cảnh báo mọi người. Để chắc chắn TIO nên có các giải pháp 94 và 110 byte của bạn.
Jakob

Cảm ơn! Tôi đã thực hiện các chỉnh sửa được đề xuất của bạn. Tôi không chắc chắn nhưng tôi không nghĩ các biểu thức lambda có thể đáp ứng các quy tắc IO tùy chỉnh cho câu hỏi này.
Jared K

Cô ơi. Bạn nói đúng, tôi quên mất điều đó.
Jakob

2

C #, 157 byte

Đặt, 74 byte:

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

Nhận, 83 byte:

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

-1 Byte nhờ VisualMelon
-2 Byte nhờ LiefdeWen


Xóa khoảng trống đó sau "a",và tôi nghi ngờ điều này sẽ bị đánh bại :)
VisualMelon

Bạn có thể lưu một byte khác bằng cách sử dụng WriteAllLinesvà thông số thứ haia
LiefdeWen

2

Perl 5, 48 26 23 byte

Viết, 20 + 1 (-n) byte

-3 byte nhờ mob

open f,">>f";print f

Tôi thực sự không chắc chắn về điều này một cách khôn ngoan, nhưng nó đáp ứng các tiêu chí. Đối với các mục trong quá khứ, chỉ có các tùy chọn cli được tính, vì vậy đó là những gì tôi sẽ làm.

Đọc, 0 + 2 byte

perl -pe "" f

1
Tại sao bạn lại ghi điểm -nevới 1 (nó cũng nên có e), nhưng -pevới 2? Bạn có thể sử dụng -Esaythay vì print.
simbabque

Cảm ơn bạn đã cho tôi biết -E, tôi không quen với điều đó. Về lý do tại sao tôi không đi cùng -ne, đó là vì tôi đã thực sự chạy từ một tập tin. Vì vậy, nó sẽ giống như perl -n w.plnếu điều này đi ngược lại các tiêu chuẩn cộng đồng PCG, tôi có thể chỉnh sửa câu trả lời của mình cho phù hợp.
Geoffrey H.

Không, nó ổn. Chúng tôi thêm một malus cho các đối số dòng lệnh bổ sung, vì vậy nó ổn.
simbabque

2
">>","f"-> ">>f"lưu 3 char
mob

1

Tùy viên , 23 + 16 = 39 byte

Đơn giản chỉ cần viết STDIN vào tệp A, sau đó đọc tệp A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Kiểm tra

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

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

1

Lua, 57 53 51 byte

Lưu trữ, 27 byte

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

Truy xuất, 24 byte

print(io.open"x":read())

1

RUBY

Lưu trữ (24 byte)

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

Lấy (16 byte)

p File.read('a')

4
Câu hỏi yêu cầu lưu trữ dữ liệu đầu vào từ STDIN, chứ không phải các đối số
Ferrybig

Kể từ khi tôi chỉnh sửa để cho phép thay thế IO bao gồm cả đối số.
Jared K

1
File.write'a',getsp File.read'a'ngắn hơn một chút;)
DarkWiiPlayer 7/07/18

1

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

Lưu trữ, 27 23 byte

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

Truy xuất, 27 23 byte

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

Điều này về cơ bản kết thúc câu trả lời của jofel vào một chương trình C.

Lưu ý: Các ddlệnh xuất ra một số thống kê stderr, vì vậy bạn sẽ thấy một số đầu ra bổ sung khi bạn ngây thơ chạy nó trong trình bao. Tuy nhiên, kể từ khi thách thức chỉ nói rằng chuỗi lưu trữ phải được trình bày trên stdout, không stderr, tôi mang nó rằng nó được phép có công suất tăng thêm trên stderr... Dù sao, đàn áp stderrđầu ra dễ dàng như thay thế ddvới cat, làm tăng số lượng byte của hai chương trình một, mỗi.


Tùy thuộc vào trình biên dịch của bạn, bạn cũng có thể loại bỏ intkiểu trả về main. Trong kiểu ANSI C cũ intlà kiểu trả về mặc định.
Jakob

@Jakob À, vâng, tất nhiên rồi. Tôi đã tin tưởng vào lời tuyên bố ngầm system()và quên mất rằng main()- ouch. Cảm ơn bạn đã chỉ ra rằng :-)
cmaster

1

PHP, 26 + 1 + 21 = 48 byte

Cửa hàng.php:

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

Chạy với echo <input> | php -nF Store.php.

Lấy.php:

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

Chạy với php -n Retrieve.php.


1

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

Biên dịch chỉ với một vài cảnh báo trên gcc của tôi.

cửa hàng

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

Có thể chơi golf bao gồm, nhưng tôi không thể tìm ra cách. Segfaults nếu bạn không vượt qua nó bất cứ điều gì, nhưng bất cứ điều gì.

Peter Cordes: -1

đọc

main(){system("cat f");}

int*f=fopennên hoạt động, tức là nói dối với trình biên dịch của bạn về loại con trỏ. Nhưng chỉ khi bạn biên dịch cho hệ thống 32 bit (tức là nơi intcó thể giữ một con trỏ, giống như gcc -m32hoặc chỉ gcctrên một hệ thống 32 bit hoàn toàn). Bạn cũng có thể khai báo chính là main(int c,char**v), hoặc có thể int**vvì bạn không tham gia hội thảo.
Peter Cordes

Các main(int c,char**v)công trình. Tôi cũng nhận ra mình có thể làm được fputs(v[1],fopen("f","w"), mặc dù nó vẫn cần stdio vì một số lý do.
SIGSTACKFAULT

Nó sẽ hoạt động nếu bạn biên dịch một tệp thực thi 32 bit. Đối với x86-64, trình biên dịch sẽ cắt ngắn intgiá trị trả về thành 32 bit, sau đó đăng nhập mở rộng dưới dạng con trỏ. Nếu trả về FILE*là 32 bit thấp, nó sẽ hoạt động, nhưng đó không phải là trường hợp trên x86-64 Linux.
Peter Cordes

Nếu bạn đang ở trên một hệ thống mà tất cả các con trỏ có kích thước bằng nhau (khá có thể), bạn có thể tránh việc bao gồm bằng cách khai báo fopenthủ công. Đi học cũ với các đối số cũng tiết kiệm một số byte : *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
dạ dày

1

Mẻ - 11 byte

%12>f
type f

Đầu vào được nhận dưới dạng đối số dòng lệnh và vẫn tồn tại (với thông báo lỗi được tạo khi thử thực thi, do CMD cố gắng thực hiện tham số) trong f.


Batch - 7 byte (không cạnh tranh)

'>%1
dir

Có rất nhiều ký tự không hợp lệ trong tên tệp, do đó, điều này sẽ không hoạt động đối với một số chuỗi, nhưng về cơ bản, nó lưu một ký tự tùy ý vào tên tệp được cung cấp bởi tham số. Để đọc nó, nó chỉ liệt kê tất cả các tệp trong thư mục, bao gồm cả chuỗi của chúng tôi.


1
Giải pháp của bạn xuất hiện để xuất ra trên STDOUT, hợp lệ. STDERR chỉ là một lựa chọn khác, không bắt buộc. Các trích dẫn xung quanh đầu vào không ngăn nó cạnh tranh. Câu hỏi duy nhất là liệu chúng có nên được tính trong số byte của bạn không. Tôi nghĩ là không, vì họ không cụ thể cho câu hỏi. Chúng có vẻ giống như bản soạn sẵn tiêu chuẩn cho Batch để lấy một dòng lệnh arg, không khác lắm so với các ngôn ngữ cần cờ dòng lệnh tiêu chuẩn. Có thể một người nào khác có kiến ​​thức về Batch sẽ kêu vang. Bây giờ hãy để họ ra khỏi số byte. Chào mừng bạn đến với Code Golf! :)
Jared K
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.