Самый короткий код на вашем языке, чтобы сохранить строку при перезагрузке

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

Из стандартной ветки правил IO я выбираю те, которые не решают проблему:

Если вы используете альтернативу, она должна быть интерактивной. Пользователю не нужно выполнять какую-либо другую работу, кроме передачи своего ввода в вашу программу, ввода его в подсказку, которую предоставляет ваша программа, или ввода ввода в качестве аргумента командной строки вашей программы. Пользователь не должен делать ничего, кроме запуска вашей программы извлечения, чтобы увидеть вывод, отображаемый на экране или отправленный в STDOUT или STDERR.

Допустимые предположения:

  • Ваши две программы будут запущены в одном каталоге
  • Ваши программы имеют разрешения на чтение и запись для этого каталога
  • Созданные вами файлы выживут после перезагрузки (не во временной директории)
  • Разрешается использовать один завершающий перевод строки, который не был частью строки. Нет других конечных пробелов

Это код-гольф, а ваш результат - сумма байтов в обеих программах.

Джаред К
источник
9
так просто echo $@>xи cat xдействует?
Адам
1
В вашей спецификации не упоминается возможность хранить несколько раз, но у вас есть пример, который это делает. Можем ли мы предполагать чистую среду для каждого вызова Store?
Адам
4
@EriktheOutgolfer Почему это не будет действительным? Даже если в мета обсуждается лазейка, которая не мешает конкретной проблеме разрешить ее.
Дилнан,
6
Веб-ограничения обычно сводятся к тому, чтобы вытащить материал из Интернета как лазейку, чтобы избавиться от работы по созданию этого материала. В этом случае, если он находится в сети, это потому, что вы проделали работу по его размещению.
Джаред К
3
Кто-то должен написать ответ для компьютера с магнитной памятью.
Mark

Ответы:

88

зш, 4 байта

Store: >f(читает из STDIN и записывает в файл с именем f)
Retrieve: <f(записывает содержимое fв STDOUT)

Дверная ручка
источник
8
Я думаю, что у нас есть победитель.
Адам
@ Adám, если нет токена для записи входных данных в файл в 1 байт: P
FreezePhoenix
1
@FreezePhoenix Вероятно, нет ничего, если вы сейчас не напишите новый язык, который не разрешен ...
Chromium
4
@Chromium check Z80 answer: некоторые существующие языки могут писать из 0-байтовой программы.
Cœur
55

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

Store:  (просто введите строку)
Получить: 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 использует токены.
Адам
3
Хм ... Почему бы не принять ввод Ansи сохранить его в той же переменной? AnsДолжна работать пустая программа хранения и только для извлечения: 1 байт!
Якоб
9
@ Артур Да, Ansсохраняется. На самом деле сохраняется много состояний, включая (я думаю) все пользовательские переменные, уравнения и историю. С точки зрения пользователя, отключение питания - это, по сути, калькулятор TI, эквивалентный состоянию сна для ПК, поэтому он не сильно нарушает работу.
Якоб
2
@JaredK Я определенно согласен с тем, что однобайтовое решение пахнет нарушением правил (хотя я и предлагал это). Однако я бы сказал, что программа хранилища завершается, поскольку другие программы могут быть запущены после нее (хотя они мешают работе решения). Моя интерпретация вашего «объективного теста на стойкость» заключалась в том, что программы будут запускаться непосредственно до и после цикла питания. Если это неверно, возможно, вы могли бы потребовать, чтобы 1-байтовое решение было помечено как неконкурентное?
Якоб
23

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

Магазин :

localStorage.a=prompt()

Получить :

alert(localStorage.a)
Esolanging Fruit
источник
Будете prompt()читать из STDIN?
труба
9
Есть ли в графическом веб-браузере STDIN? Нет. prompt()Выскакивает предупреждение, которое просит вас ввести текст, и возвращает результат.
Дев
5
@Dev Конечно, графический веб-браузер имеет STDIN, как и любой другой процесс. Если вы не можете использовать его на определенном языке, это другой вопрос, и если ответ «Нет», то, возможно, его можно использовать в этом задании.
труба
5
@Dev Методы ввода / вывода по умолчанию включают ввод через приглашение GUI и вывод через отображение GUI . Если OP не предназначен для переопределения стандарта, это должно быть допустимо. Я уточню.
Esolanging Fruit
2
Я отредактировал задачу, чтобы разрешить больше операций ввода-вывода, но я лишь расширяю ее до ограниченного подмножества методов ввода-вывода по умолчанию. Этот ответ в моем подмножестве, хотя. Мне это нравится.
Джаред К
19

POSIX оболочка sh / bash / ... 8 байт

хранить:

dd>f

получить:

dd<f
jofel
источник
2
cat
Хорошо
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(ПОЛУЧИТЬ), он печатает abcв STDOUT.
овс
@JaredK Я спросил вас в комментарии, разрешено ли для STORE изменять RETRIEVE.
овс
8

Powershell - 4 байта

Место хранения:

ac

(альтернатива также sc)

поиск

gc

Редактировать: я только заметил, что вывод не допускается какой-либо пользовательский ввод ... поэтому он переходит с 4 до 6 или 8 байтов

Место хранения:

ac f

(альтернатива также sc f) для 8-байтовой версии

ac

(и укажите fкак путь) для 6-байтовой версии

поиск

gc f
Хайко Хацфельд
источник
8

Ржавчина, 136 байт

Store (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())

Подтверждения

Jakob
источник
1
Вы можете сохранить байт, изменив импорт на, use std::{io::*,fs::*}а затем используя writeвместо std::fs::write.
Esolanging Fruit
Как насчет write("a",String::from_iter(stdin().chars()))?
Берги
@ Берги Хорошо. Но charsсрабатывает error[E0658]: use of unstable library feature 'io'в стабильном Rust.
Якоб
Хм, похоже, chars()не рекомендуется в пользу String::from_utf8(stdin().bytes()). (Также я использовал ночные документы, не уверен, что это виновник)
Берги
@Bergi Я попробовал несколько вариантов с bytes()или, chars()но ни один из них не был очень коротким, потому что элемент итератора обернут io::Result.
Esolanging Fruit
8

Bash, 12 11 10 байт

хранить, 7 6 5 байт

cat ->f# нет необходимости -, стандартный ввод по умолчанию

cat >f# не нужно места, также >отделяется

cat>f

получить 5 байт

cat f
Pelle
источник
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
Я думаю, что ваше нулевое байтовое решение и другие, работающие на калькуляторах, которые перезагружаются без разрушения, не отвечают на две части вопроса: «Вы создадите две программы». То, что у вас есть, это единственная программа, которая выживает после перезагрузки. И «Store читает из STDIN и затем завершает работу без ошибок». Ваша программа все еще ждет, когда пользователь нажмет клавишу. Стек вашей программы и состояние выполнения все еще изменчивы. Я думаю, это означает, что он все еще работает и не вышел.
Джаред К
@JaredK Вопрос никогда не предусматривал, что две программы не могут быть идентичными. Что касается выходной части: традиционно в RPL ввод программ осуществляется в стеке. То есть стандартный ввод.
Джейсон
1
Выживет ли стек из цикла питания? Может быть, мягкое выключение через кнопки калькулятора, но я думаю, не удаляя батарею. Так что, возможно, это зависит от того, что такое цикл питания.
Пользователь
1
@user Нет, стек не выживает при мягком (ON + C) или аппаратном сбросе (ON + A + F) (в отличие от мягкого выключения, правого Shift + ON), в отличие от сохранения в порту 2, который является флэш-памятью ( и переживает мягкий и жесткий сброс). Поскольку в ответе TI-BASIC использовалось это определение, для полноты изложения я включил ответ стека.
Джейсон
6

APL (APLX) , 5 байтов

Магазин: ⍞⍈1
Получить:⍇1

 получить строку из stdin и
⍈1 записать следующий доступный компонент файла номер 1

⍇1 прочитать первый * последний компонент файла № 1

APLX Store сессияAPLX Получить сессию

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

Адам
источник
6

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

touch $@
ls

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

Другой по аналогичной схеме, который не имел бы такой же длины и ограничений по характеру, был бы:

35 33 байта

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

Это позволяет использовать /символ в строке и поддерживает гораздо больше символов (сколько именно зависит от реализации).

(-2 байта на это благодаря шарлатану @Cows)

sundar - Восстановить Монику
источник
1
IIRC, я полагаю, что однажды в Беркли одна группа создала систему баз данных еще в 1990-х годах, которая хранила данные столбцов таблицы в виде имен файлов (до 255 символов). Я думаю, что строки и таблицы были родительскими каталогами.
Дэвид Р. Триббл
В своем 35-байтовом ответе вы можете изменить второе утверждение на s/..//. $Не требуется , поскольку все остальные строки будут удалены , так это может применяться только к последней строке, и ^может быть отброшено , так как замена применяется только на первом матче.
Kritixi Lithos
@ Cowsquack Готово. Спасибо за объяснение, почему изменение тоже работает.
sundar - Восстановить Монику
Вам нужно использовать "$@", а не $@, чтобы избежать получения ожогов от пробельных, *, ?или ~символов.
Андерс Касеорг
5

Python 3, 56 байт

Store (33 байта)

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

Получить (23 байта)

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

Печать с завершающим переводом строки.

Jakob
источник
почему не 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.

Store (16 байт)

Ox`lo¯lSÈSge.P=U

Получить (14 байт)

Ox`lo¯lSÈSge.P
LegionMammal978
источник
+1 за то, что первым использовал что-то отличное от стандартного файлового ввода-вывода. Мне это нравится.
Джаред К
1
Добро пожаловать в Japt! :)
Лохматый
1
Кстати, вы можете обойти setItemи getItemполностью с localStorage.key. Установить значение , получить значение
Shaggy
@ Shaggy Спасибо! Ваш также избегает странных управляющих персонажей.
LegionMammal978
4

Haskell, 46 байтов

Store (26 байт):

getContents>>=writeFile"t"

Получить (20 байтов):

readFile"t">>=putStr
Ними
источник
3

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

Set (16 байт)

IO.write'a',gets

Получить (10 байт)

IO.read'a'
DarkWiiPlayer
источник
3

MATLAB (30 байт)

Set (22 байта)

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

Можно сбрить 4 байта, изменив на input(''), но это потребует ввода в одинарных кавычках:'input string'

Получить (8 байт)

load a;a
18 октября - день молчания на ЮВ
источник
3

C (GCC), 98 байт

Store (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.

Подтверждения

Jakob
источник
1
Для этого требуется реализация C, в которой intможет храниться указатель, чтобы неявное объявление int fopen()работало. (Например, большинство 32-битных систем, или используйте, gcc -m32если вы используете x86-64, чтобы сделать 32-битный исполняемый файл.) И кстати, я пытался использовать Linux sendfileи copy_file_range(2)системные вызовы, но они не работают в / из TTY.
Питер Кордес
1
Поскольку вы пишете функции, а не программы, возможно, вы могли бы оправдать использование входной строки как разрешающей функции arg 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-программы сохранили для вашего имени пользователя!

Store, 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 байтов.
Якоб
Спасибо! Я сделал ваши предложенные изменения. Я не уверен, но я не думаю, что лямбда-выражения могут соответствовать пользовательским правилам ввода-вывода для этого вопроса.
Джаред К
D'о. Вы правы, я забыл об этом.
Якоб
2

C #, 157 байт

Set, 74 Bytes:

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

raznagul
источник
Удалите это место после "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
Почему вы набрали -ne1 (должно быть eтоже), а -pe2? Вы могли бы использовать -Eи sayвместо print.
Simbabque
Спасибо, что сообщили мне -E, я не был знаком с этим. Что касается того, почему я не пошел с -ne, это потому, что для этого я на самом деле работает из файла. Так что, perl -n w.plесли это идет вразрез со стандартами сообщества PCG, я могу соответствующим образом отредактировать свой ответ.
Джеффри Х.
Нет, все хорошо. Мы добавили малус для дополнительных аргументов командной строки, так что все в порядке.
Симбабк
2
">>","f"-> ">>f"сохраняет 3 символа
моб
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 байт

Store, 27 байт

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

Получить, 24 байта

print(io.open"x":read())
лицеи
источник
1

РУБИН

Store (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 байт

Store, 27 23 байта

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

Получить, 27 23 байта

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

Это в основном оборачивает ответ Джофеля в C-программу.

Примечание. ddКоманды выводят некоторую статистику stderr, поэтому вы увидите некоторые дополнительные выходные данные, когда вы наивно запустите ее в оболочке. Тем не менее, поскольку задача только говорит о том, что хранимая строка должна быть представлена stdout, а не stderrя полагаю, что разрешено иметь дополнительный вывод на stderr... В любом случае, подавить stderrвывод так же просто, как заменить ddна cat, увеличивая число байтов две программы по одной, каждая.

cmaster
источник
В зависимости от вашего компилятора вы также можете удалить intтип возвращаемого значения main. В старом стиле ANSI C тип intвозврата по умолчанию.
Якоб
@ Якоб Ах, да, конечно. Я сознательно полагался на неявное заявление о себе 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.

Titus
источник
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");}
SIGSTACKFAULT
источник
int*f=fopenдолжно работать, т.е. врать вашему компилятору о типе указателя. Но только если вы компилируете для 32-битной системы (то есть той, где intможно хранить указатель, например gcc -m32, или просто gccв полностью 32-битной системе). Вы также можете объявить main как 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

В имени файла имеется множество недопустимых символов, поэтому для некоторых строк это не сработает, но это, по сути, сохраняет произвольный символ в имени файла, заданном параметром. Чтобы прочитать его, он просто перечисляет все файлы в каталоге, включая нашу строку.

GetHacked
источник
1
Ваше решение выводится на STDOUT, который действителен. STDERR это просто другой вариант, не требуется. Кавычки вокруг ввода не мешают ему конкурировать. Единственный вопрос заключается в том, должны ли они учитываться при подсчете байтов. Я думаю, что нет, так как они не являются специфическими для вопроса. Они кажутся стандартным шаблоном для Batch, принимающим аргумент командной строки, который не так отличается от языков, которым требуются стандартные флаги командной строки. Может быть, кто-то еще со знанием партии будет вмешиваться. А пока оставьте их вне подсчета байтов. Добро пожаловать в Code Golf! :)
Джаред К