Найкоротший код на вашій мові, щоб зберегти рядок через перезавантаження


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. Я не можу, бо це введе занадто багато лазівки. У деяких стандартних параметрах вводу-виводу вже вхід зберігається послідовно, наприклад, "програми можуть приймати дані з файлу". Я хотів би бути більш гнучким, ніж просто суворі STDIN та STDOUT, але без відкриття шлюзів.

Зі стандартних ниток правил вводу-виводу я вибираю вишні, які не порушують завдання:

Якщо ви використовуєте альтернатив, він повинен бути інтерактивним. Користувачеві не слід виконувати будь-яку іншу роботу, окрім того, щоб передавати вхід у вашу програму, вводити його у підказку, яке надає ваша програма, або вводити введення як командний рядок-аргументу вашої програми. Користувачеві не слід нічого робити, крім запуску програми для отримання, щоб побачити вихід, який відображається на екрані або надісланий STDOUT або STDERR.

Дозволені припущення:

  • Ваші дві програми будуть запускатися в одному каталозі
  • Ваші програми мають дозволи для читання та запису для цього каталогу
  • Файли, які ви створюєте, переживуть перезавантаження (не в темп режимі)
  • Допускається одна нижня лінія рядка, яка не була частиною рядка. Немає інших пробілів

Це код-гольф, а ваш рахунок - це сума байтів обох програм.


9
так справедливо echo $@>xі cat xчинне?
Адам

1
Ваша специфікація не згадує можливість зберігання декількох разів, але у вас є приклад, який це робить. Чи можемо ми припустити чисте середовище для кожного виклику Store?
Адам

4
@EriktheOutgolfer Чому це не було б дійсним? Навіть якщо на мета-диску обговорюється лазівка, яка не заважає виклику спеціально дозволити це.
ділнан

6
Обмеження в Інтернеті зазвичай полягають у витягуванні матеріалів з Інтернету як лазівки, щоб вийти з роботи над її створенням. У цьому випадку, якщо це є в Інтернеті, це тому, що ви зробили роботу над його розміщенням.
Джаред К

3
Комусь потрібно написати відповідь для комп’ютера з магнітоядерною пам'яттю.
Марк

Відповіді:


88

zsh, 4 байти

Зберігати: >f(читає з STDIN і записує у файл під назвою f)
Отримайте: <f(записує вміст fу STDOUT)


8
Я думаю, що у нас є переможець.
Adám

@ Adám, якщо немає маркера, щоб написати вхід до файлу в 1 байт: P
FreezePhoenix

1
@FreezePhoenix Мабуть, немає, якщо ви зараз не напишете нову мову, яка заборонена ...
Chromium

4
@Chromium check Z80 відповідь: деякі існуючі мови можуть писати з 0 байтової програми.
Cœur

55

TI-BASIC (Z80), 1 байт ?

Магазин:  (просто введіть рядок)
Отримайте: Ans(байт 27)

Але якщо це не вірно:

TI-BASIC (Z80), 7 6 байт

-1 завдяки Якобу.

Зберігати: Prompt Str0(байти DD AA 09)
Отримати: disp Str0(байти ED AA 09)


1
Ви впевнені, що це 5 байт?
FreezePhoenix

6
@FreezePhoenix TI-Basic використовує лексеми.
Adám

3
Хм ... Чому б не взяти вхід Ansі не зберегти його в одній змінній? Порожня програма магазину і лише Ansдля отримання повинна працювати: 1 байт!
Якоб

9
@Arthur Yep, Ansзберігається. Насправді багато стан зберігається, включаючи (я думаю) всі користувацькі змінні, рівняння та історію. З точки зору користувача, вимкнене живлення - це, в основному, калькулятор TI, еквівалентний режиму сну для ПК, тому він сильно не порушує.
Якоб

2
@JaredK Я безумовно погоджуюся, що 1-байтне рішення пахне порушеннями правил (навіть якщо я був тим, хто запропонував це). Тим НЕ менше, я б сказав , виходи магазин програм, так як інші програми можуть бути запущені після нього (хоча вони заважають роботі рішення). Моя інтерпретація вашого "об'єктивного тесту на стійкість" полягала в тому, що програми будуть запускатися безпосередньо до та після енергетичного циклу. Якщо це неправильно, можливо, ви можете зажадати, щоб 1-байтне рішення було позначено як неконкурентне?
Якоб

23

Браузер JS, 44 байти

Магазин :

localStorage.a=prompt()

Отримайте :

alert(localStorage.a)

Буде чи prompt()читати STDIN?
труба

9
Чи має графічний веб-браузер STDIN? Ні. prompt()З'являється повідомлення, яке вимагає ввести текст, і повертає результат.
Дев

5
@Dev Звичайно, графічний веб-браузер має STDIN, як і будь-який інший процес. Якщо ви не можете використовувати його з певної мови - це інше питання, і якщо відповідь "Ні", то я, можливо, це можна використати в цьому виклику.
труба

5
@Dev Методи вводу- виводу за замовчуванням включають введення через підказку GUI та вихід через GUI-дисплей . Якщо ОП не означало перевищення стандарту, це має бути дійсним. Я уточню.
Esolanging Fruit

2
Я відредагував виклик, щоб дозволити більше вводу-виводу, але розширюю його лише до обмеженого набору методів вводу-виводу за замовчуванням. Ця відповідь є всередині моєї підмножини. Мені це подобається.
Джаред К


12

Python 3 , 46 байт

магазин, 45 байт:

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

Програма вилучення побудована командою store, файлом з ім'ям f. ( 1 байт для імені файлу )


2
Звичайно, ви можете використовувати input()?
Артеміда Фаул

@ArtemisFowl input()отримує лише до першого нового рядка. open(0).readчитає всі STDIN
Джо Кінг

Ви, ймовірно, публікували, коли все ще було неоднозначним, але, як це, ця відповідь не відповідає поточній специфікації. Спочатку я передбачав, що вимога STDIN / STDOUT буде суворою, з умовами за замовчуванням не допускається. Я розширив його, але лише до підмножини за замовчуванням. Вашій програмі отримання, якщо вона не використовує STDOUT, все ще потрібно відображати вихід на екрані. Якби я дозволив повні типові параметри, рішенням для кожної мови було б "приймає вхід у файл", "дає вихід у файл", нульові байти.
Джаред К

@JaredK Я не думаю, що ви цілком розумієте, як це працює. Програма storeзчитує вхід з STDIN, а потім зберігає програму Python, яка друкує цей вхід f. Приклад: STORE викликається з введенням abc. Потім він пише print('abc')в f. Якщо ви зараз зателефонували f(RETRIEVE), він надрукує кнопку abcSTDOUT.
ов

@JaredK Я запитав вас у коментарі, чи дозволено STORE змінювати RETRIEVE.
ов


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.
Esolanging Fruit

Як щодо write("a",String::from_iter(stdin().chars()))?
Бергі

@Bergi Nice. Але charsспрацьовує error[E0658]: use of unstable library feature 'io'в стабільній іржі.
Якоб

Гм, здається chars(), застаріло на користь String::from_utf8(stdin().bytes()). (Також я використовував нічні документи, не впевнений, чи це винуватець)
Бергі,

@Bergi Я спробував кілька варіантів з bytes()або , chars()але жоден з них не був дуже коротким , тому що елемент ітератора загортають в io::Result.
Esolanging Fruit

8

Bash, 12 11 10 байт

магазин, 7 6 5 байт

cat ->f# немає потреби -, stdin за замовчуванням

cat >f# немає потреби в просторі, >розділяє також

cat>f

отримати, 5 байт

cat f

1
Немає потреби -в програмі магазину.
Конрад Рудольф

2
Немає потреби в просторі між "котом" і ">"!
psmears

Ви повинні мати можливість робити те ж саме, що в zsh публікації для написання та використання >f. Я не впевнений, чи <fдійсний він для читання.
Алло

@allo Принаймні на Cygwin >fпрацює так echo '' > f(випорожнення файлу, якщо він існує, створення, якщо його немає), хоча, <fздається, не працює.
sundar

7

HP 49G RPL, 48 байт

Для економії: :2: A DUP PURGE STO26,5 байт

Для відновлення:, :2: A RCL21,5 байт

Якщо ми можемо залишити резервну батарею, ми отримаємо:

HP 49G RPL, 0 байт

Для збереження: 0 байт

Для відновлення: 0 байтів, оскільки HP 49G залишає стек недоторканим через перезавантаження.


Рішення з нульовим байтом повинно працювати для різних калькуляторів. Коли я повернуся додому, я вирву 42 роки.
SIGSTACKFAULT

Я думаю, що ваше нульове байтове рішення та інші, які працюють на калькуляторах, які перезавантажуються неруйнівно, не відповідають двом частинам питання: "Ви складете дві програми". У вас є єдина програма, яка переживає перезавантаження. І "Магазин читає з STDIN, а потім виходить без помилки". Ваша програма все ще чекає, коли користувач натисне клавішу. Стек програми та стан виконання програми все ще змінюються. Я думаю, це означає, що він все ще працює і не вийшов.
Джаред К

@JaredK Питання ніколи не передбачало, що дві програми не можуть бути однаковими. Що стосується частини, що виходить, традиційно в RPL введення програм наводиться на стеці. Те є стандартний ввід.
Джейсон

1
Чи зможе стек пережити цикл живлення? Можливо, м'яке відключення живлення за допомогою кнопок калькулятора, але я гадаю, не знімаючи акумулятор. Тож, можливо, це залежить від того, що таке силовий цикл.
користувач

1
@user Ні, стек не витримує м'якого (ON + C) або жорсткого скидання (ON + A + F) (відмінне від програмного вимкнення, Right Shift + ON), на відміну від зберігання в порту 2, який є флеш-пам’яттю ( і витримує м'яке та жорстке скидання). Оскільки, здавалося, відповідь TI-BASIC використовує це визначення, я включив відповідь на стек для повноти.
Джейсон

6

APL (APLX) , 5 байт

Магазин: ⍞⍈1
Отримайте:⍇1

 отримати рядок від запису stdin
⍈1 до наступного доступного компонента файлу №1

⍇1 прочитати перший * останній компонент файлу №1

Сесія магазину APLXAPLX Отримати сеанс

* Документація говорить спочатку, але експерименти показують останні .


6

bash, 10 байт (неконкурентоспроможний)

touch $@
ls

Імена файлів Unix можуть містити будь-які символи, за винятком NULі /, і їх імена можуть бути до 255 байт, тому це зможе зберігати лише рядки такої довжини (врахуйте, що обмеження носія зберігання), і вони не містять '/ ' у них. Це одна з причин, що це неконкурентоспроможне, а інша полягає в тому, що це передбачає, що каталог, за яким він працює, порожній (або що сторонній вихід з lsдозволений). Я все-таки хотів опублікувати це, тому що це просто здалося класним і не очевидним способом зберігання інформації.

Ще одна подібна жилка, яка не мала б однакових обмежень по довжині та символу, була б:

35 33 байт

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

Це дозволяє /символу в рядку і підтримує ще багато символів (саме скільки залежить від реалізації).

(-2 байти за це завдяки quack @Cows)


1
IIRC, я вважаю, що група в Берклі колись створила систему баз даних ще в 90-х роках, яка зберігала дані стовпців таблиці як імена файлів (до 255 символів). Я думаю, що рядки та таблиці були батьківськими каталогами.
David R Tribble

У вашій відповіді 35 байтів ви можете змінити друге твердження на s/..//. Це $не потрібно, оскільки всі інші рядки видалені, тому це може застосовуватися лише до останнього рядка, а ^може бути відмінено, оскільки заміна застосовується лише в першому збігу.
Kritixi Lithos

@Cowsquack Готово. Дякуємо, що пояснили, чому зміна також працює.
sundar

Вам потрібно використовувати "$@", а НЕ $@, щоб уникнути отримання опіків від пробільних, *, ?або ~символів.
Андерс Касеорг

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 Схоже, новий запит надрукується у запитанні, так що я не думаю, що це має значення ...
MoxieBall

Я з глузду з’їхав чи 23 + 33 = 56 (а не 54)? Також чому б не використовувати input()?
Артеміда Фаул

1
@ArtemisFowl Хороший улов. Що стосується input, я припускаю, що рядок для збереження може містити нові рядки.
Якоб

4

Japt, 46 30 байт

-16 байт завдяки Шаггі .

Один із перших разів, коли я спробував використовувати Japt. JS eval іноді може бути неповоротким. Використовує браузер window.localStorage.

Магазин (16 байт)

Ox`lo¯lSÈSge.P=U

Отримати (14 байт)

Ox`lo¯lSÈSge.P

+1 за те, що вперше застосував щось інше, ніж стандартний файл IO, який мені подобається.
Джаред К

1
Ласкаво просимо в Japt! :)
Shaggy

1
До речі, можна обійти setItemі getItemповністю з localStorage.key. Встановлене значення , отримане значення
Shaggy

@Shaggy Дякую! Ваше також уникає більш дивних контрольних символів.
LegionMammal978

4

Haskell, 46 байт

Магазин (26 байт):

getContents>>=writeFile"t"

Отримати (20 байт):

readFile"t">>=putStr

3

Рубін (26 байт)

Набір (16 байт)

IO.write'a',gets

Отримати (10 байт)

IO.read'a'

3

MATLAB (30 байт)

Набір (22 байти)

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

Можна погладити 4 байти, змінивши на input(''), але для цього знадобиться введення в одних лапках:'input string'

Отримати (8 байт)

load a;a

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);}

Нездатність

  • Потрібно, щоб підходило кілька типів вказівників int.

Подяка


1
Для цього потрібна реалізація C, де intможе містити вказівник, для неявного оголошення int fopen(). (Наприклад , більшість 32-бітових систем, або використовувати , gcc -m32якщо ви на x86-64 , щоб зробити 32-бітний виконуваний файл.) І до речі, я спробував з допомогою системи Linux sendfileі copy_file_range(2)системні виклики, але вони не працюють в / з TTY.
Пітер Кордес

1
Оскільки ви пишете функції, а не програми, можливо, ви можете виправдати прийняття рядка введення як аргумент функції, що дозволяє fputs(fopen()), і read(open(),buf,-1). (Питання тепер дозволяє аргумент командного рядка як введення.)
Пітер Кордес

Функція "зрощення" 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(). qце непотрібно (але q('y')це не спрацювало б, вам потрібно це написати yes). Я думав про просто використання xу другій програмі, але це порушило б вимоги, наскільки я їх розумію.
Конрад Рудольф

1
ви можете використовувати scan(w=""), вам не потрібно викладати тип, scanвиведете його з вказаного типу аргументу. Для мене q ("y") працює як виклик, що спонукає заощадження, але, можливо, це залежить від вашої версії R та, можливо, ви використовуєте Rstudio чи ні.
JDL

@JDL scan: О, акуратно, документація цього не згадує! На жаль scan, все ще буде виконано деякий аналіз, тому це не працюватиме з усіма вхідними даними. У будь-якому випадку, scan('stdin',w='')буває, точно такої ж довжини, як і readLines('stdin'). q: R 3.4.4 говорить "Помилка q (" y "): нерозпізнане значення 'save'".
Конрад Рудольф

Ах, це річ Rstudio - я спробував це в Rstudio і окремо на терміналі, і він працював лише в Rstudio.
JDL

2

Java (JDK 10) , 204 байт

Попередження: переписуйте будь-які налаштування, які зберігають будь-які програми Java для вашого імені користувача!

Магазин, 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-байтні рішення.
Якоб

Дякую! Я зробив ваші запропоновані зміни. Я не впевнений, але я не думаю, що лямбда-вирази можуть відповідати спеціальним правилам IO для цього питання.
Джаред К

D'oh. Ти маєш рацію, я про це забув.
Якоб

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

Я насправді не впевнений у цьому, але це відповідає критеріям. Для минулих записів враховувались лише варіанти кліпів, тож саме з цим я йду.

Читання, 0 + 2 байти

perl -pe "" f

1
Чому ти забив? -ne 1 (у нього теж має бути e), а -peз 2? Ви можете використовувати -Eі sayзамість цього print.
simbabque

Дякую, що повідомили про мене -E, я з цим не був знайомий. Що стосується того, чому я не пішов -ne, це тому, що для цього я фактично запускаю з файлу. Отже, це виглядатиме так: perl -n w.plЯкщо це суперечить стандартам спільноти PCG, я можу відповідно відредагувати свою відповідь.
Джеффрі Х.

Ні, це добре. Ми додаємо малус для додаткових аргументів командного рядка, так що це добре.
simbabque

2
">>","f"-> ">>f"економить 3 char
mob

1

Приєднати , 23 + 16 = 39 байт

Просто записує STDIN у файл A, а потім читає файл A.

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

Луа, 57 53 51 байт

Магазин, 27 байт

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

Отримайте, 24 байти

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

1

RUBY

Магазин (24 байти)

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

Отримати (16 байт)

p File.read('a')

4
Питання вимагає збереження вхідних даних від STDIN, а не аргументів
Ferrybig

Я з тих пір редагував, щоб дозволити чергування IO, включаючи аргументи.
Джаред К

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");}

Це в основному вказує відповідь Йофеля в програму C.

Примітка: ddКоманди виводять деякі статистичні дані stderr, тому ви побачите деякий додатковий результат, коли ви наївно запускаєте його в оболонці. Однак, оскільки проблема тільки говорить , що зберігається рядок повинна бути представлена на stdout, що не stderr, я розумію, що це дозволено мати додатковий вихід на stderr... У всякому разі, пригнічуючи stderrвихід так само легко , як заміна ddз cat, збільшуючи кількість байт з дві програми по одній, кожна.


Залежно від компілятора ви також можете видалити intтип повернення main. У старому стилі ANSI C intє типом повернення за замовчуванням.
Якоб

@Jakob Ага, так, звичайно. Я дуже покладався на неявну заяву system()і забув про те, що main()- ой. Дякуємо, що
вказали

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, якщо ви нічого не передаєте, але все одно.

Пітер Кордес: -1

read.c

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

int*f=fopenмає працювати, тобто брехати своєму компілятору про тип вказівника. Але тільки якщо ви компілюєте для 32-розрядної системи (тобто тієї, де intможна вмістити покажчик, як-от gcc -m32, або просто gccна повністю 32-бітній системі). Ви також можете оголосити основним як main(int c,char**v)або, можливо, int**vтому, що ви не перенаправляєтесь.
Пітер Кордес

В main(int c,char**v)роботі. Я також зрозумів, що можу зробити fputs(v[1],fopen("f","w"), хоча це все ще потребує stdio чомусь.
SIGSTACKFAULT

Це має спрацювати, якщо ви компілюєте 32-бітний виконуваний файл. Для x86-64 компілятор обрізає intповернене значення до 32 біт, а потім підпише-розширить це як покажчик. Якщо повернутий показник FILE*має низькі 32 біти, він би працював, але це не так у Linux x86-64.
Пітер Кордес

Якщо ви перебуваєте в системі, де всі вказівники рівні за розміром (швидше за все), ви можете уникнути включення, оголосивши fopenвручну. Перехід старої школи з аргументами зберігає деякі байти також: *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
гастропнер

1

Пакетна - 11 байт

%12>f
type f

Вхід приймається як аргумент командного рядка і зберігається (при повідомленні про помилку, створеному при спробі виконання, оскільки CMD намагається виконати параметр) в f.


Пакетна - 7 байт (неконкурентна)

'>%1
dir

У назві файлу є безліч недійсних символів, тому це не працює для деяких рядків, але це по суті зберігає довільний символ до імені файлу, заданого параметром. Щоб прочитати його, він просто перераховує всі файли в каталозі, включаючи наш рядок.


1
Здається, ваше рішення видається на STDOUT, що є дійсним. STDERR - це лише інший варіант, не обов'язковий. Цитати навколо вводу не заважають йому конкурувати. Питання лише в тому, чи слід їх рахувати у вашому підрахунку байтів. Я думаю, що ні, оскільки вони не конкретні в питанні. Вони здаються стандартною коробкою для Batch, щоб взяти аргумент командного рядка, який не так відрізняється від мов, які потребують стандартних прапорів командного рядка. Можливо, хтось інший, який має знання Batch, задзвенить. Поки що покиньте їх із числа байтів. Ласкаво просимо в Code Golf! :)
Джаред К
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.