รหัสที่สั้นที่สุดในภาษาของคุณเพื่อคงสตริงไว้ในการรีบูต


48

โปรแกรมของคุณ:

คุณจะเขียนสองโปรแกรม (ทั้งในภาษาเดียวกัน) โปรแกรมหน่วยเก็บใช้สตริงจาก STDIN และเก็บไว้ที่ไหนสักแห่งถาวร (ดูด้านล่าง) แล้วออกโดยไม่มีข้อผิดพลาด โปรแกรมดึงข้อมูลไม่มีการป้อนข้อมูลดึงสายอักขระที่เก็บไว้และพิมพ์ลงใน STDOUT

วัตถุประสงค์ของการทดสอบความคงทน:

คุณควรจะสามารถเรียกใช้โปรแกรมจัดเก็บข้อมูลในเครื่องท้องถิ่นของคุณจากนั้นหมุนเวียนรอบเครื่องท้องถิ่นของคุณแล้วเรียกโปรแกรมเรียกคืนจากเครื่องท้องถิ่นของคุณ คุณสามารถซ่อนสตริงได้ตามต้องการ (แม้กระทั่งบนเว็บ) ตราบใดที่คุณผ่านการทดสอบการรีบูต

กรณีทดสอบ:

การจัดเก็บข้อมูลแล้วดึง:

echo foo | Store
Retrieve
foo

ร้านค้าซ้ำควรเขียนทับ (เช่นวิธี set ()):

echo foo | Store
echo bar | Store
Retrieve
bar

การเรียกคืนซ้ำแล้วซ้ำอีกเป็นวิธีที่ไม่ทำลาย (เช่นวิธี get ()):

echo foo | Store
Retrieve
foo
Retrieve
foo

ดึงข้อมูลก่อนการเรียกใช้หน่วยเก็บข้อมูลใด ๆ :

คุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้ โปรแกรมดึงข้อมูลของคุณสามารถสันนิษฐานได้ว่ามีการเรียกใช้โปรแกรมจัดเก็บข้อมูลในบางจุดในอดีต

ความยืดหยุ่นของอินพุต / เอาต์พุต

ผู้คนขอให้ฉันขยายสิ่งนี้จาก STDIN / STDOUT ที่เข้มงวดเป็นกฎ IO มาตรฐาน ฉันทำไม่ได้เพราะมันจะแนะนำช่องโหว่มากเกินไป ตัวเลือก IO มาตรฐานบางตัวมีอินพุตที่เก็บไว้ในวิธีถาวรเช่น "โปรแกรมอาจรับอินพุตจากไฟล์" ฉันต้องการที่จะมีความยืดหยุ่นมากกว่าแค่ STDIN และ STDOUT ที่เข้มงวด แต่ไม่เปิดประตูระบายน้ำ

จากเธรดกฎ IO มาตรฐานฉันเลือกสิ่งที่ไม่ทำลายความท้าทาย:

หากคุณใช้ตัวเลือกจะต้องเป็นแบบโต้ตอบกับผู้ใช้ ผู้ใช้ไม่ควรทำงานอื่นนอกเหนือจากการป้อนข้อมูลไปยังโปรแกรมของคุณการพิมพ์ลงในพรอมต์ที่โปรแกรมของคุณให้หรือพิมพ์อินพุตเป็น command-line-arg ของโปรแกรมของคุณ ผู้ใช้ไม่ควรทำสิ่งใดนอกจากการเรียกใช้โปรแกรมเรียกคืนของคุณเพื่อดูผลลัพธ์ที่แสดงบนหน้าจอหรือส่งไปยัง STDOUT หรือ STDERR

สมมติฐานที่อนุญาต:

  • โปรแกรมทั้งสองของคุณจะทำงานในไดเรกทอรีเดียวกัน
  • โปรแกรมของคุณมีสิทธิ์อ่าน - เขียนสำหรับไดเรกทอรีนั้น
  • ไฟล์ที่คุณสร้างจะรอดชีวิตจากการรีบูต (ไม่ใช่ใน temp dir)
  • ขึ้นบรรทัดใหม่หนึ่งบรรทัดที่ไม่ได้เป็นส่วนหนึ่งของสตริง ไม่มีช่องว่างต่อท้ายอื่น ๆ

นี่คือโค้ดกอล์ฟและคะแนนของคุณคือผลรวมของจำนวนไบต์จากทั้งสองโปรแกรม


9
ดังนั้นเพียงecho $@>xและcat xถูกต้อง?
Adám

1
ข้อมูลจำเพาะของคุณไม่ได้กล่าวถึงความสามารถในการจัดเก็บหลายครั้ง แต่คุณมีกรณีตัวอย่างที่ทำเช่นนั้น เราขอสมมติสภาพแวดล้อมที่สะอาดสำหรับการเรียกใช้แต่ละครั้งได้Storeไหม
อดัม

4
@EriktheOutgolfer ทำไมถึงไม่ถูกต้อง แม้ว่าจะมีช่องโหว่ที่กล่าวถึงในเมตาดาต้าซึ่งไม่ได้ป้องกันความท้าทายจากการอนุญาตโดยเฉพาะ
dylnan

6
ข้อ จำกัด ทางเว็บมักเกี่ยวกับการดึงข้อมูลจากเว็บในฐานะช่องโหว่เพื่อหลีกเลี่ยงการทำสิ่งที่สร้างขึ้น ในกรณีนี้ถ้ามันอยู่บนเว็บนั่นเป็นเพราะคุณทำการวางไว้ที่นั่น
Jared K

3
ใครบางคนต้องเขียนคำตอบสำหรับคอมพิวเตอร์ที่มีหน่วยความจำแกนแม่เหล็ก
ทำเครื่องหมาย

คำตอบ:


88

zsh, 4 ไบต์

Store: >f(อ่านจาก STDIN และเขียนไปยังไฟล์ที่เรียกว่าf)
Retrieve: <f(เขียนเนื้อหาของfไปยัง STDOUT)


8
ฉันคิดว่าเรามีผู้ชนะ
Adám

@ Adámเว้นแต่ว่ามีโทเค็นในการเขียนอินพุตเป็นไฟล์ใน 1 ไบต์: P
FreezePhoenix

1
@FreezePhoenix อาจจะไม่มีใครนอกจากคุณจะเขียนภาษาใหม่ตอนนี้ซึ่งไม่ได้รับอนุญาต ...
Chromium

4
@Chromium ตรวจสอบคำตอบ Z80: บางภาษาที่มีอยู่สามารถเขียนได้จากโปรแกรม 0 ไบต์
Cœur

55

TI-BASIC (Z80), 1 ไบต์ ?

Store:  (เพียงป้อนสตริง)
สืบค้น: Ans(byte 27)

แต่ถ้ามันไม่ถูกต้อง:

TI-BASIC (Z80), 7 6 ไบต์

-1 ขอบคุณจาคอบ

Store: Prompt Str0(bytes DD AA 09) การ
ดึงข้อมูล: disp Str0(bytes ED AA 09)


1
คุณแน่ใจหรือไม่ว่ามีขนาด 5 ไบต์
FreezePhoenix

6
@FreezePhoenix TI-Basic ใช้โทเค็น
Adám

3
อืม ... ทำไมไม่รับอินพุตAnsและคงอยู่ในตัวแปรเดียวกัน? โปรแกรมร้านค้าที่ว่างเปล่าและAnsการดึงข้อมูลควรทำงาน: 1 ไบต์!
Jakob

9
@Arthur Yep Ansยังคงมีอยู่ ในความเป็นจริงรัฐจำนวนมากยังคงมีอยู่รวมถึง (ฉันคิดว่า) ตัวแปรผู้ใช้สมการและประวัติทั้งหมด จากมุมมองของผู้ใช้การปิดเครื่องนั้นเป็นเครื่องคิดเลข TI เทียบเท่าสถานะสลีปสำหรับพีซีดังนั้นจึงไม่ได้รบกวนมากนัก
Jakob

2
@ JaredK ฉันยอมรับอย่างแน่นอนว่าโซลูชันขนาด 1 ไบต์มีกลิ่นของการละเมิดกฎ (แม้ว่าฉันจะเป็นคนที่แนะนำก็ตาม) อย่างไรก็ตามฉันจะบอกว่าโปรแกรม store จบการทำงานเนื่องจากโปรแกรมอื่นสามารถรันได้หลังจากนั้น (แม้ว่าพวกเขาจะรบกวนการทำงานของโซลูชัน) การตีความของฉันใน "การทดสอบจุดประสงค์ของการคงอยู่" ของคุณคือโปรแกรมจะทำงานโดยตรงก่อนและหลังรอบการใช้พลังงาน หากไม่ถูกต้องคุณอาจต้องการโซลูชัน 1 ไบต์เพื่อทำเครื่องหมายว่าไม่ใช่การแข่งขัน?
Jakob

23

เบราว์เซอร์ JS, 44 ไบต์

ร้านค้า :

localStorage.a=prompt()

ดึงข้อมูล :

alert(localStorage.a)

จะprompt()อ่านจาก STDIN หรือไม่
ท่อ

9
เว็บเบราว์เซอร์กราฟิกมี STDIN หรือไม่ ไม่prompt()ปรากฏการแจ้งเตือนที่ขอให้คุณป้อนข้อความและส่งคืนผลลัพธ์
Dev

5
@Dev แน่นอนเว็บเบราว์เซอร์กราฟิกมี STDIN เหมือนกับทุกกระบวนการอื่น หากคุณไม่สามารถใช้จากภาษาใดภาษาหนึ่งเป็นคำถามอื่นและหากคำตอบคือ "ไม่" ฉันอาจจะสามารถใช้มันในการท้าทายนี้ได้
ท่อ

5
@Dev ที่ผมเริ่มต้น / O วิธีการรวมถึงการป้อนข้อมูลผ่านทางหน้าจอพร้อมรับคำ GUIและเอาท์พุทผ่านจอแสดงผล GUI ยกเว้นว่า OP หมายถึงการแทนที่มาตรฐานนี้ควรจะถูกต้อง ฉันจะชี้แจง
ผลไม้แยกแยะ

2
ฉันได้แก้ไขความท้าทายเพื่อให้มี IO มากขึ้น แต่ฉันขยายไปยังชุดย่อยที่ จำกัด ของวิธีการเริ่มต้นของ IO คำตอบนี้อยู่ในส่วนย่อยของฉัน ฉันชอบมัน.
Jared K

19

POSIX เชลล์ sh / bash / ... 8 ไบต์

เก็บ:

dd>f

จะได้รับ:

dd<f

2
เป็นคนที่ดีเต้นแม้กระทั่งcat...
cmaster

12

Python 3 , 46 ไบต์

เก็บ 45 ไบต์:

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

fโปรแกรมเรียกถูกสร้างขึ้นโดยคำสั่งการจัดเก็บไฟล์ชื่อ ( 1 ไบต์สำหรับชื่อไฟล์ )


2
แน่นอนคุณสามารถใช้input()?
อาร์ทิมิสไก่

@ArtemisFowl input()รับได้มากถึง newline แรกเท่านั้น open(0).readอ่านSTDIN ทั้งหมด
Jo King

คุณอาจโพสต์เมื่อสิ่งต่าง ๆ ยังคงคลุมเครือ แต่เนื่องจากคำตอบนี้ไม่ตรงตามข้อกำหนดปัจจุบัน ฉันตั้งใจเดิมข้อกำหนดของ STDIN / STDOUT ให้เข้มงวดโดยไม่อนุญาตค่าเริ่มต้น ฉันได้ขยายมัน แต่เฉพาะส่วนย่อยของค่าเริ่มต้น โปรแกรมดึงข้อมูลของคุณหากไม่ได้ใช้ STDOUT ยังคงต้องแสดงเอาต์พุตบนหน้าจอ หากฉันอนุญาตให้ใช้ค่าเริ่มต้นเต็มรูปแบบโซลูชันสำหรับทุกภาษาจะเป็น 'รับอินพุตในไฟล์', 'ให้เอาต์พุตในไฟล์', เป็นศูนย์ไบต์
Jared K

@ JaredK ฉันไม่คิดว่าคุณจะเข้าใจวิธีการทำงาน store-program อ่านข้อมูลจาก STDIN fแล้วเก็บโปรแกรมหลามที่พิมพ์ป้อนข้อมูลนี้ใน ตัวอย่าง: abcร้านค้าที่เรียกว่ามีการป้อนข้อมูลของ จากนั้นก็เขียนไปprint('abc') fถ้าคุณโทรf(RETRIEVE) มันจะพิมพ์abcไปที่ STDOUT
ovs

@ JaredK ฉันถามคุณในความคิดเห็นว่าอนุญาตให้ร้านค้าแก้ไข RETRIEVE หรือไม่
ovs


8

Powershell - 4 ไบต์

การจัดเก็บ:

ac

(ทางเลือกด้วยsc)

การแก้ไข

gc

แก้ไข: ฉันเพิ่งสังเกตเห็นว่าเอาต์พุตไม่ได้รับอนุญาตให้ป้อนข้อมูลผู้ใช้ใด ๆ ... ดังนั้นจึงกระโดดจาก 4 เป็น 6 หรือ 8 ไบต์

การจัดเก็บ:

ac f

(ทางเลือกsc f) สำหรับเวอร์ชัน 8 ไบต์

ac

(และระบุfเป็นพา ธ ) สำหรับเวอร์ชัน 6 ไบต์

การแก้ไข

gc f

8

สนิม 136 ไบต์

ร้านค้า (84 ไบต์)

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

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

ดึงข้อมูล (52 ไบต์)

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

กิตติกรรมประกาศ


1
คุณสามารถบันทึกไบต์โดยการเปลี่ยนการนำเข้าuse std::{io::*,fs::*}แล้วใช้แทนwrite std::fs::write
ผลไม้แยกแยะ

แล้วไงwrite("a",String::from_iter(stdin().chars()))ล่ะ
Bergi

@ Bergi Nice แต่charsก่อให้เกิดerror[E0658]: use of unstable library feature 'io'สนิม
Jakob

อืมมันก็ดูเหมือนจะเลิกในความโปรดปรานของchars() String::from_utf8(stdin().bytes())(นอกจากนี้ผมใช้เอกสารคืนไม่แน่ใจว่าไม่ว่าจะเป็นผู้กระทำผิด)
Bergi

@Bergi ฉันพยายามไม่กี่รูปแบบที่มีbytes()หรือchars()แต่ไม่มีของพวกเขาเป็นที่สั้นมากเนื่องจากรายการ iterator io::Resultเป็นห่อใน
แยกผลไม้

8

ทุบตี, 12 11 10 ไบต์

เก็บ, 7 6 5 ไบต์

cat ->f# ไม่ต้องการ-stdin เป็นค่าเริ่มต้น

cat >f# ไม่จำเป็นต้องใช้พื้นที่>คั่นด้วย

cat>f

ดึง 5 ไบต์

cat f

1
ไม่จำเป็นต้องใช้-ในโปรแกรมร้านค้า
Konrad Rudolph

2
ไม่จำเป็นต้องใช้ช่องว่างระหว่าง "cat" และ ">" เช่นกัน!
psmears

คุณควรจะสามารถที่จะทำเช่นเดียวกับในการโพสต์ zsh >fสำหรับการเขียนและการใช้งาน ฉันไม่แน่ใจว่า<fถูกต้องสำหรับการอ่านหรือไม่
อัลโล

@allo อย่างน้อยใน Cygwin >fทำงานเหมือนecho '' > f(ล้างไฟล์ถ้ามันมีอยู่สร้างถ้ามันไม่ได้) ในขณะที่<fดูเหมือนว่าจะไม่มีการ op
sundar

7

HP 49G RPL, 48 ไบต์

วิธีบันทึก: :2: A DUP PURGE STO, 26.5 ไบต์

ในการกู้คืน: :2: A RCL, 21.5 ไบต์

หากเราสามารถทิ้งแบตเตอรี่สำรองไว้เราจะได้รับ:

HP 49G RPL, 0 ไบต์

วิธีบันทึก: , 0 ไบต์

ในการกู้คืน: , 0 ไบต์เนื่องจาก HP 49G ปล่อยให้กองไม่ถูกแตะต้องข้ามการรีบูต


วิธีแก้ปัญหา zero-byte ควรใช้กับเครื่องวัด caluclators หลากหลายแบบ ฉันจะอายุ 42 เมื่อฉันกลับถึงบ้าน
SIGSTACKFAULT

ฉันคิดว่าวิธีแก้ปัญหา zero-byte ของคุณและอื่น ๆ ที่ใช้งานกับเครื่องคิดเลขที่รีบูตแบบไม่ทำลายล้างไม่พบคำถามสองส่วน: "คุณจะทำสองโปรแกรม" สิ่งที่คุณมีก็คือโปรแกรมเดียวที่รอดจากการรีบูต และ "Store อ่านจาก STDIN จากนั้นออกโดยไม่มีข้อผิดพลาด" โปรแกรมของคุณยังคงรอให้ผู้ใช้กดปุ่ม สแต็กและสถานะการทำงานของโปรแกรมของคุณยังคงไม่แน่นอน ฉันคิดว่านั่นหมายความว่ามันยังคงทำงานอยู่และยังไม่ออก
Jared K

@ JaredK คำถามไม่เคยระบุว่าทั้งสองโปรแกรมไม่เหมือนกัน สำหรับส่วนที่ออก: ตามปกติในอินพุต RPL ไปยังโปรแกรมจะได้รับในสแต็ก นั่นคืออินพุตมาตรฐาน
Jason

1
สแต็คจะอยู่รอดในวงจรพลังงานหรือไม่ อาจปิดไฟอ่อน ๆ ผ่านปุ่มของเครื่องคิดเลข แต่ฉันเดาว่าไม่ได้ถอดแบตเตอรี่ออก ดังนั้นมันอาจขึ้นอยู่กับว่าวงจรกำลังเป็นอะไร
ผู้ใช้

1
@user ไม่สแต็กไม่รอดนุ่ม (ON + C) หรือฮาร์ดรีเซ็ต (ON + A + F) (แตกต่างจากการปิดไฟอ่อน, Shift ขวา + เปิด) แตกต่างจากการจัดเก็บในพอร์ต 2 ซึ่งเป็นหน่วยความจำแฟลช ( และมีชีวิตอยู่รีเซ็ตอ่อนและแข็ง) เนื่องจากคำตอบของ TI-BASIC ดูเหมือนจะใช้คำจำกัดความนั้นฉันจึงรวมคำตอบสแต็กไว้เพื่อความสมบูรณ์
Jason

6

APL (APLX) 5 ไบต์

ร้านค้า: ⍞⍈1
ดึงข้อมูล:⍇1

 รับสายจาก stdin
⍈1 เขียนไปยังองค์ประกอบที่มีอยู่ต่อไปของหมายเลขไฟล์ 1

⍇1 อ่านองค์ประกอบแรก * สุดท้ายของหมายเลขไฟล์ 1

เซสชันร้านค้า APLXAPLX ดึงข้อมูลเซสชัน

* เอกสารกล่าวว่าเป็นครั้งแรกแต่การทดลองแสดงให้เห็นว่าที่ผ่านมา


6

ทุบตี, 10 ไบต์ (ไม่แข่งขัน)

touch $@
ls

ชื่อไฟล์ Unix สามารถมีอักขระใด ๆ ยกเว้นNULและ/และชื่อของพวกเขาสามารถมีความยาวได้ไม่เกิน 255 ไบต์ดังนั้นสิ่งนี้จะสามารถเก็บเฉพาะสตริงที่มีความยาวสูงสุดเท่านั้น (พิจารณาว่าข้อ จำกัด ของสื่อจัดเก็บ) และที่ไม่มี '/ ในพวกเขา นั่นเป็นเหตุผลหนึ่งที่ทำให้ไม่สามารถแข่งขันได้อีกอย่างหนึ่งคือถือว่าไดเรกทอรีที่ใช้งานอยู่นั้นว่างเปล่า (หรือlsอนุญาตให้มีการส่งออกจากภายนอก) ฉันยังต้องการโพสต์สิ่งนี้เพราะมันเป็นวิธีที่ยอดเยี่ยมและไม่ชัดเจนในการจัดเก็บข้อมูล

อีกแบบในหลอดเลือดดำที่คล้ายกันซึ่งไม่มีความยาวและข้อ จำกัด ของอักขระเหมือนกันคือ:

35 33 ไบต์

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

สิ่งนี้จะช่วยให้/ตัวละครในสตริงและรองรับตัวละครอีกหลายตัว (ขึ้นอยู่กับการใช้งาน)

(-2 ไบต์ในการขอบคุณ @Cows นักต้มตุ๋น)


1
IIRC ฉันเชื่อว่ากลุ่มที่ Berkeley เคยสร้างระบบฐานข้อมูลขึ้นในปี 1990 ที่เก็บข้อมูลคอลัมน์ตารางเป็นชื่อไฟล์ (มากถึง 255 ตัวอักษร) ฉันคิดว่าแถวและตารางเป็นไดเรกทอรีหลัก
David R Tribble

ในการตอบไบต์ 35 s/..//ของคุณคุณสามารถเปลี่ยนคำสั่งที่สองที่จะ $ไม่จำเป็นต้องใช้เพราะสายอื่น ๆ ทั้งหมดจะถูกลบดังนั้นนี้เท่านั้นที่สามารถนำไปใช้กับบรรทัดสุดท้ายและ^สามารถลดลงเนื่องจากการทดแทนที่มีใช้เฉพาะในการแข่งขันครั้งแรก
Kritixi Lithos

@Cowsquack เรียบร้อยแล้ว ขอบคุณที่อธิบายว่าทำไมการเปลี่ยนแปลงจึงใช้งานได้เช่นกัน
sundar

คุณจำเป็นต้องใช้"$@"ไม่ได้$@ที่จะหลีกเลี่ยงการเผาโดยช่องว่าง*, ?หรือ~ตัวอักษร
Anders Kaseorg

5

Python 3, 56 ไบต์

ร้านค้า (33 ไบต์)

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

ดึงข้อมูล (23 ไบต์)

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

พิมพ์ด้วยบรรทัดใหม่ต่อท้าย


ทำไมไม่input()แทนopen(0).read()และละเว้นend=จากprint?
MoxieBall

@MoxieBall ไม่แน่ใจเกี่ยวกับสาเหตุที่inputไม่ได้ใช้ แต่การละเว้นend=จะส่งผลให้มีการเพิ่มบรรทัดใหม่ที่ส่วนท้ายของสตริง (เช่นไม่ใช่สตริงเดิม) (อาจ)
NickA

@NickA ดูเหมือนว่ามีการพิมพ์บรรทัดใหม่ขึ้นมาในคำถามอย่างไรก็ตามฉันไม่คิดว่ามันจะสำคัญ ...
MoxieBall

ฉันบ้าไปแล้วหรือ 23 + 33 = 56 (ไม่ใช่ 54)? ยังทำไมไม่ใช้input()?
อาร์ทิมิสไก่

1
@ArtemisFowl จับได้ดี สำหรับinputฉันสมมติว่าสตริงที่จะคงอยู่อาจมีการขึ้นบรรทัดใหม่
Jakob

4

Japt 46 46ไบต์

-16 ไบต์ขอบคุณที่มีขนดก

ครั้งแรกที่ฉันลองใช้ Japt JS eval บางครั้งอาจหงุดหงิด window.localStorageใช้เบราว์เซอร์

ร้านค้า (16 ไบต์)

Ox`lo¯lSÈSge.P=U

ดึงข้อมูล (14 ไบต์)

Ox`lo¯lSÈSge.P

+1 ที่เป็นคนแรกที่ใช้สิ่งอื่นที่ไม่ใช่ไฟล์มาตรฐาน IO ที่ฉันชอบ
Jared K

1
ยินดีต้อนรับสู่ Japt! :)
Shaggy

1
โดยวิธีการที่คุณสามารถหลีกเลี่ยงsetItemและสมบูรณ์ด้วยgetItem การตั้งค่า , เรียกค่าlocalStorage.key
ปุย

@Shaggy ขอบคุณ! คุณยังหลีกเลี่ยงตัวละครควบคุม weirder
LegionMammal978

4

Haskell, 46 ไบต์

ร้านค้า (26 ไบต์):

getContents>>=writeFile"t"

ดึงข้อมูล (20 ไบต์):

readFile"t">>=putStr



3

C (GCC), 98 ไบต์

ร้านค้า (46 ไบต์)

อินพุตคือผ่านอาร์กิวเมนต์บรรทัดคำสั่งแรก

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

ดึงข้อมูล (52 ไบต์)

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

Unportability

  • intกำหนดว่าประเภทตัวชี้หลายพอดี

กิตติกรรมประกาศ


1
สิ่งนี้ต้องมีการนำ C ไปใช้ซึ่งintสามารถเก็บตัวชี้ไว้เพื่อให้การประกาศโดยปริยายของint fopen()ทำงาน (เช่นระบบ 32 บิตส่วนใหญ่หรือใช้gcc -m32ถ้าคุณใช้ x86-64 เพื่อให้ทำงานได้ 32- บิต) และ BTW ฉันลองใช้การโทรของ Linux sendfileและcopy_file_range(2)ระบบ แต่มันไม่ทำงานกับ / จาก TTY
Peter Cordes

1
เนื่องจากคุณกำลังเขียนฟังก์ชั่นไม่ได้โปรแกรมบางทีคุณสามารถปรับการสายป้อนเป็นฟังก์ชั่นที่ช่วยให้หาเรื่องและfputs(fopen()) read(open(),buf,-1)(ตอนนี้คำถามอนุญาตให้บรรทัดคำสั่งหาเรื่องเป็นอินพุต)
Peter Cordes

ฟังก์ชัน 'splice' ของ Linux คัดลอกจากไพพ์ไปยังไฟล์ (และในทางกลับกัน) หาก stdin / out เป็นไพพ์แล้วมันจะบันทึกการเรียกใช้ฟังก์ชันโดยใช้พารามิเตอร์เพิ่มเติม
CSM

2

APL (Dyalog Unicode)ขนาด 18 ไบต์

ร้านค้า: ⍞⎕NPUT⎕A 1 ลองออนไลน์!
ดึงข้อมูล: ⊃⎕NGET⎕A ลองออนไลน์!

 รับสายจาก stdin
⎕NPUT วางไว้ในไฟล์พื้นเมืองที่เรียกว่า
⎕A ตัวอักษรตัวพิมพ์ใหญ่ 1 และเขียนทับหากไฟล์ที่มีอยู่

 ส่วนแรก (ข้อมูลส่วนถัดไปคือการเข้ารหัสและประเภทการสิ้นสุดบรรทัด) ของการ
⎕NGET รับไฟล์เนทิฟ
⎕A ตัวอักษรตัวพิมพ์ใหญ่


2

R (27 ไบต์)

ร้านค้า (21 ไบต์)

x=readLines('stdin')

โหลด (6 ไบต์)

cat(x)

เพื่อให้สามารถใช้งานได้สคริปต์ตัวแรกจะต้องถูกเรียกใช้ด้วยตัวเลือกบรรทัดคำสั่ง--saveและตัวที่สองด้วย--restore(แม้ว่าในโหมดโต้ตอบนี้ไม่จำเป็น: ตัวเลือกเหล่านี้เป็นค่าเริ่มต้น)

สิ่งนี้อาจสั้นลงได้ถึง 7 ไบต์เพราะไม่ใช่ว่าข้อผิดพลาดใน R จะป้องกันไม่ให้อาร์กิวเมนต์เริ่มต้นreadLineทำงานในโหมดที่ไม่โต้ตอบ ในโหมดอินเทอร์แอกทีฟไม่จำเป็นและวิธีแก้ปัญหาจึงใช้เพียง20 ไบต์เท่านั้น


1
ฉันคิดว่ามันจะมีประสิทธิภาพมากขึ้นที่จะใช้qโดยตรงกับโปรแกรมแรกx=scan(); q("y")และครั้งที่สองอย่างใดอย่างหนึ่งxหรือcat(x)ขึ้นอยู่กับว่าเราต้องการเข้มงวดเกี่ยวกับวิธีการพิมพ์สตริง โดยกฎของรหัสกอล์ฟปกติคุณยังต้องนับอาร์กิวเมนต์บรรทัดคำสั่งเพื่อเพิ่มไบต์--saveและ--restore(ซึ่งสูตรของฉันไม่จำเป็น)
JDL

@JDL scanไม่ทำงานสำหรับเนื้อหาโดยพลการและมีความยาวมากกว่าscan(w='character') ไม่จำเป็น (แต่ใช้งานไม่ได้คุณต้องสะกดคำ) ฉันคิดถึงการใช้ในโปรแกรมที่สอง แต่สิ่งนี้จะเป็นการละเมิดข้อกำหนดเท่าที่ฉันเข้าใจ readLines()qq('y')yesx
Konrad Rudolph

1
คุณสามารถใช้งานscan(w="")ได้คุณไม่จำเป็นต้องสะกดคำชนิดนั้นscanจะอนุมานจากประเภทของอาร์กิวเมนต์ที่ระบุ สำหรับฉัน q ("y") ทำงานเป็นตัวกระตุ้นการเลิก แต่อาจขึ้นอยู่กับรุ่น R ของคุณและอาจเป็นไปได้ว่าคุณกำลังใช้ Rstudio หรือไม่
JDL

@JDL scan: โอ้เรียบร้อยเอกสารไม่ได้พูดถึงเรื่องนี้! น่าเสียดายที่scanยังคงทำการแยกวิเคราะห์อยู่ดังนั้นจึงไม่สามารถทำงานกับอินพุตทั้งหมด อย่างไรก็ตามscan('stdin',w='')มีความยาวเท่าreadLines('stdin')กันกับ q: R 3.4.4 กล่าวว่า“ ข้อผิดพลาดใน q ("y"): ค่าที่ไม่รู้จักของ 'บันทึก' "
Konrad Rudolph

อามันเป็นสิ่งที่ Rstudio - ฉันลองใช้ใน Rstudio และแยกต่างหากที่เครื่องเทอร์มินัลและทำงานใน Rstudio เท่านั้น
JDL

2

Java (JDK 10) , 204 ไบต์

คำเตือน:เขียนทับการตั้งค่าใด ๆ ที่โปรแกรมจาวาใด ๆ ได้จัดเก็บไว้สำหรับชื่อผู้ใช้ของคุณ!

ร้านค้า, 94 ไบต์:

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

ลองออนไลน์!

ดึงข้อมูล 110 ไบต์:

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

ลองออนไลน์!

java S foo
java R
foo

นี้ทำงานโดยการป้อนข้อมูลเป็นหาเรื่องและเก็บไว้ในการตั้งค่าการใช้การเก็บข้อมูลสำรองไว้ให้โดยjava.util.prefs มันเขียนทับรูตโหนดของผู้ใช้เพื่อบันทึกหนึ่งไบต์ในการตั้งชื่อโหนด หากคุณต้องการทดสอบแบบไม่ทำลายระบบให้รันจากชื่อผู้ใช้แบบไม่มีการเปลี่ยนแปลงหรือเปลี่ยนรหัสจาก "" เป็นชื่อโหนด


ความคิดที่ดี! เมื่อคุณใช้ Java 10 คุณสามารถย่อให้สั้นลงได้ด้วยการแสดงแลมบ์ดา นอกจากนี้หากจำนวนไบต์ของคุณไม่รวมzคุณควรลบออกจากโปรแกรมและ TIO ลองวางคำเตือนไว้ที่ด้านบนสุดของการส่งแทนเพื่อเตือนผู้คน แน่นอนว่า TIO ควรมีโซลูชัน 94- และ 110- ไบต์ของคุณ
Jakob

ขอบคุณ! ฉันได้ทำการแก้ไขที่คุณแนะนำ ฉันไม่แน่ใจ แต่ฉันไม่คิดว่าการแสดงออกแลมบ์ดาสามารถทำตามกฎ IO ที่กำหนดเองสำหรับคำถามนี้ได้
Jared K

โอศิลปวัตถุ ถูกต้องฉันลืมเรื่องนั้นไป
Jakob

2

C #, 157 ไบต์

ชุด 74 ไบต์:

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

รับ 83 ไบต์:

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

-1 ไบต์ขอบคุณ VisualMelon
-2 ไบต์ขอบคุณ LiefdeWen


ลบช่องว่างนั้นออกไปหลังจาก"a",นั้นและฉันสงสัยว่ามันจะถูกโจมตี :)
VisualMelon

คุณสามารถบันทึกไบต์อื่นได้โดยใช้WriteAllLinesและพารามิเตอร์ที่สองa
LiefdeWen

2

Perl 5, 48 26 23 ไบต์

เขียน, 20 + 1 (-n) ไบต์

-3 ไบต์ขอบคุณม็อบ

open f,">>f";print f

จริง ๆ แล้วฉันไม่แน่ใจเกี่ยวกับประเด็นนี้ แต่มันก็ตรงตามเกณฑ์ สำหรับรายการที่ผ่านมามีเพียงการนับตัวเลือก cli เท่านั้นนั่นคือสิ่งที่ฉันจะไปด้วย

อ่าน, 0 + 2 ไบต์

perl -pe "" f

1
ทำไมคุณถึงทำคะแนน-neด้วย 1 (ควรมีeเหมือนกัน) แต่เป็น-pe2 คุณสามารถใช้-Eและแทนsay print
simbabque

ขอบคุณที่แจ้งให้ฉันทราบ-Eฉันไม่คุ้นเคยกับสิ่งนั้น สำหรับสาเหตุที่ฉันไม่ได้ไปด้วย-neนั่นเป็นเพราะสิ่งนั้นฉันกำลังเรียกใช้จากไฟล์ ดังนั้นมันจะดูเหมือนว่าperl -n w.plหากสิ่งนี้ขัดกับมาตรฐานชุมชน PCG แต่ฉันสามารถแก้ไขคำตอบของฉันได้
Geoffrey H.

ไม่เป็นไร. เราเพิ่ม malus สำหรับอาร์กิวเมนต์บรรทัดคำสั่งพิเศษดังนั้นจึงไม่เป็นไร
simbabque

2
">>","f"-> ">>f"บันทึก 3 ตัวอักษร
mob

1

ทูต , 23 + 16 = 39 ไบต์

เพียงแค่เขียน STDIN ไปยังแฟ้มแล้วอ่านแฟ้มAA

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

การทดสอบ

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 ไบต์

ร้านค้า, 27 ไบต์

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

ดึงข้อมูล 24 ไบต์

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

1

ทับทิม

ร้านค้า (24 ไบต์)

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

ดึงข้อมูล (16 ไบต์)

p File.read('a')

4
คำถามถามสำหรับการจัดเก็บข้อมูลจาก STDIN ไม่ใช่ข้อโต้แย้ง
Ferrybig

ฉันตั้งแต่แก้ไขเพื่ออนุญาต IO การสลับรวมถึงการขัดแย้ง
Jared K

1
File.write'a',getsและp File.read'a'จะสั้นลงเล็กน้อย;)
DarkWiiPlayer

1

C (Unix / GNU), 23 + 23 = 46 ไบต์

ร้านค้า, 27 23 ไบต์

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

ดึงข้อมูล27 23 ไบต์

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

สิ่งนี้จะห่อคำตอบของ jofelไว้ในโปรแกรม C

หมายเหตุ: ddคำสั่งแสดงผลสถิติบางอย่างstderrดังนั้นคุณจะเห็นผลลัพธ์เพิ่มเติมบางอย่างเมื่อคุณเรียกใช้ในเชลล์อย่างไร้เดียงสา อย่างไรก็ตามเนื่องจากความท้าทายเพียงบอกว่าจะต้องนำเสนอสตริงที่เก็บไว้ในstdoutไม่stderrฉันเอามันว่ามันได้รับอนุญาตให้มีการส่งออกเพิ่มเติมในstderr... อย่างไรก็ตามการระงับการstderrส่งออกเป็นเรื่องง่ายเหมือนกับการแทนที่ddด้วยการcatเพิ่มจำนวนไบต์ของ สองโปรแกรมโดยหนึ่งแต่ละ


ขึ้นอยู่กับคอมไพเลอร์ของคุณคุณอาจลบintประเภทการคืนออกmainได้ ในสไตล์ ANSI C เก่าintเป็นประเภทผลตอบแทนเริ่มต้น
Jakob

@ Jakob อ่าใช่แน่นอน ฉันพึ่งพาการประกาศโดยปริยายsystem()และลืมเกี่ยวกับสิ่งmain()นั้น ขอขอบคุณที่ชี้ว่า :-)
cmaster

1

PHP, 26 + 1 + 21 = 48 ไบต์

Store.php:

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

echo <input> | php -nF Store.phpทำงานด้วย

Retrieve.php:

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

php -n Retrieve.phpทำงานด้วย


1

C (gcc) , 77 67 + 25 = 92 ไบต์

คอมไพล์ด้วยคำเตือนเพียงไม่กี่คำใน gcc ของฉัน

store.c

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

อาจจะเล่นกอล์ฟรวมถึง แต่ฉันไม่สามารถหาวิธี Segfaults ถ้าคุณไม่ผ่านมันไป แต่อย่างใด

Peter Cordes: -1

read.c

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

int*f=fopenควรใช้งานได้กล่าวคือคอมไพเลอร์ของคุณเกี่ยวกับประเภทตัวชี้ แต่ถ้าคุณรวบรวมสำหรับระบบ 32 บิต (เช่นหนึ่งที่intสามารถเก็บตัวชี้เช่นgcc -m32หรือเพียงแค่gccในระบบ 32 บิตเต็ม) คุณสามารถประกาศหลักเป็นmain(int c,char**v)หรืออาจเป็นint**vเพราะคุณไม่ได้ลงทะเบียน
Peter Cordes

main(int c,char**v)งาน ฉันยังตระหนักว่าฉันสามารถทำได้fputs(v[1],fopen("f","w")แม้ว่ามันจะยังคงต้องการ stdio ด้วยเหตุผลบางอย่าง
SIGSTACKFAULT

มันควรจะทำงานถ้าคุณคอมไพล์เอ็กซีคิวต์แบบ 32 บิต สำหรับ x86-64 คอมไพเลอร์จะตัดทอนintค่าส่งคืนเป็น 32 บิตจากนั้นลงชื่อขยายที่เป็นตัวชี้ หากการส่งคืนFILE*อยู่ในระดับต่ำ 32 บิตจะสามารถใช้งานได้ แต่ไม่ใช่ในกรณีของ x86-64 Linux
Peter Cordes

หากคุณอยู่ในระบบที่ตัวชี้ทั้งหมดมีขนาดเท่ากัน (ค่อนข้างเป็นไปได้) คุณสามารถหลีกเลี่ยงการรวมด้วยการประกาศfopenด้วยตนเอง *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}ไปโรงเรียนเก่าที่มีการขัดแย้งประหยัดไบต์บางเกินไป:
Gastropner

1

รุ่นที่ - 11 ไบต์

%12>f
type f

การป้อนข้อมูลที่ได้รับเป็นอาร์กิวเมนต์บรรทัดคำสั่งและยังคงมีอยู่ (กับข้อผิดพลาดที่สร้างขึ้นเมื่อพยายามดำเนินการตั้งแต่ CMD พยายามดำเนินพารามิเตอร์) fใน


รุ่นที่ - 7 ไบต์ (ไม่ใช่การแข่งขัน)

'>%1
dir

มีอักขระที่ไม่ถูกต้องมากมายในชื่อไฟล์ดังนั้นสิ่งนี้จะไม่สามารถใช้งานได้กับสตริงบางตัว แต่สิ่งนี้จะช่วยประหยัดอักขระที่กำหนดเองไปยังชื่อไฟล์ที่กำหนดโดยพารามิเตอร์ หากต้องการอ่านมันเพียงแค่แสดงไฟล์ทั้งหมดในไดเรกทอรีรวมถึงสตริงของเรา


1
โซลูชันของคุณปรากฏเป็นเอาต์พุตใน STDOUT ซึ่งถูกต้อง STDERR เป็นเพียงตัวเลือกอื่นไม่จำเป็นต้องใช้ เครื่องหมายคำพูดรอบอินพุตไม่ได้หยุดจากการแข่งขัน คำถามเดียวก็คือพวกเขาควรจะนับในจำนวนไบต์ของคุณหรือไม่ ฉันคิดว่าไม่เพราะพวกเขาไม่ได้เฉพาะคำถาม ดูเหมือนว่ามาตรฐานสำเร็จรูปสำหรับ Batch ในการใช้บรรทัดคำสั่ง arg ซึ่งไม่แตกต่างจากภาษาที่ต้องการแฟล็กบรรทัดคำสั่งมาตรฐาน บางทีคนอื่นที่มีความรู้แบบแบตช์จะพูดสอดในตอนนี้ปล่อยพวกเขาออกจากการนับไบต์ ยินดีต้อนรับสู่ Code Golf! :)
Jared K
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.