Ваши программы:
Вы напишите две программы (обе на одном языке). Программа хранения берет строку из 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 я выбираю те, которые не решают проблему:
Программы могут принимать ввод через приглашения графического интерфейса пользователя и командной строки, если вы хотите
Программы могут выводить данные, отображая их на экране. Это включает в себя диалоги с графическим интерфейсом.
Программы могут принимать ввод через аргументы командной строки
Программы могут выводить в STDERR, но на самом деле не могут выдавать ошибки.
Если вы используете альтернативу, она должна быть интерактивной. Пользователю не нужно выполнять какую-либо другую работу, кроме передачи своего ввода в вашу программу, ввода его в подсказку, которую предоставляет ваша программа, или ввода ввода в качестве аргумента командной строки вашей программы. Пользователь не должен делать ничего, кроме запуска вашей программы извлечения, чтобы увидеть вывод, отображаемый на экране или отправленный в STDOUT или STDERR.
Допустимые предположения:
- Ваши две программы будут запущены в одном каталоге
- Ваши программы имеют разрешения на чтение и запись для этого каталога
- Созданные вами файлы выживут после перезагрузки (не во временной директории)
- Разрешается использовать один завершающий перевод строки, который не был частью строки. Нет других конечных пробелов
echo $@>x
иcat x
действует?Store
?Ответы:
зш, 4 байта
Store:
>f
(читает из STDIN и записывает в файл с именемf
)Retrieve:
<f
(записывает содержимоеf
в STDOUT)источник
TI-BASIC (Z80), 1 байт ?
Store:
(просто введите строку)
Получить:
Ans
(байт 27)Но если это не верно:
TI-BASIC (Z80),
76 байтов-1 спасибо якобу
Хранить:
Prompt Str0
(байты DD AA 09)Получить:
disp Str0
(байты ED AA 09)источник
Ans
и сохранить его в той же переменной?Ans
Должна работать пустая программа хранения и только для извлечения: 1 байт!Ans
сохраняется. На самом деле сохраняется много состояний, включая (я думаю) все пользовательские переменные, уравнения и историю. С точки зрения пользователя, отключение питания - это, по сути, калькулятор TI, эквивалентный состоянию сна для ПК, поэтому он не сильно нарушает работу.Браузер JS, 44 байта
Магазин :
Получить :
источник
prompt()
читать из STDIN?prompt()
Выскакивает предупреждение, которое просит вас ввести текст, и возвращает результат.POSIX оболочка sh / bash / ... 8 байт
хранить:
получить:
источник
cat
Python 3 , 46 байт
магазин, 45 байт:
Программа извлечения создается командой store, файл с именем
f
. ( 1 байт для имени файла )источник
input()
?input()
получает только до первой новой строки.open(0).read
читает все STDINstore
-Программа считывает ввод из STDIN , а затем хранит программу Python , которая печатает этот вход вf
. Пример: STORE вызывается с вводомabc
. Затем он записываетprint('abc')
вf
. Если вы сейчас звонитеf
(ПОЛУЧИТЬ), он печатаетabc
в STDOUT.Пакетный, 16 байтов
источник
Powershell - 4 байта
Место хранения:
(альтернатива также
sc
)поиск
Редактировать: я только заметил, что вывод не допускается какой-либо пользовательский ввод ... поэтому он переходит с 4 до 6 или 8 байтов
Место хранения:
(альтернатива также
sc f
) для 8-байтовой версии(и укажите
f
как путь) для 6-байтовой версиипоиск
источник
Ржавчина, 136 байт
Store (84 байта)
Получить (52 байта)
Подтверждения
источник
use std::{io::*,fs::*}
а затем используяwrite
вместоstd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
срабатываетerror[E0658]: use of unstable library feature 'io'
в стабильном Rust.chars()
не рекомендуется в пользуString::from_utf8(stdin().bytes())
. (Также я использовал ночные документы, не уверен, что это виновник)bytes()
или,chars()
но ни один из них не был очень коротким, потому что элемент итератора обернутio::Result
.Bash,
12 1110 байтхранить,
7 65 байт# нет необходимостиcat ->f
-
, стандартный ввод по умолчанию# не нужно места, такжеcat >f
>
отделяетсяполучить 5 байт
источник
-
в программе магазина.>f
. Я не уверен, если<f
действительно для чтения, хотя.>f
работает какecho '' > f
(очистка файла, если он существует, создание, если он не существует), в то время как<f
кажется, что нет операции.HP 49G RPL, 48 байтов
Сохранить:
:2: A DUP PURGE STO
26,5 байтДля восстановления:
:2: A RCL
21,5 байтЕсли мы можем оставить в резервной батарее, мы получим:
HP 49G RPL, 0 байтов
Сохранить:
0 байт
Для восстановления:
0 байт, поскольку HP 49G оставляет стек без изменений при перезагрузке.
источник
APL (APLX) , 5 байтов
Магазин:
⍞⍈1
Получить:
⍇1
⍞
получить строку из stdin и⍈1
записать следующий доступный компонент файла номер 1⍇1
прочитатьпервый* последний компонент файла № 1* Документация говорит в первую очередь, но эксперименты показывают в последнюю очередь .
источник
bash, 10 байт (не конкурирует)
Имена файлов Unix могут содержать любой символ, кроме
NUL
и/
, и их имена могут иметь длину до 255 байт, поэтому в нем можно хранить только строки до этой длины (считая, что это ограничение носителя), и которые не содержат '/ ' в них. Это одна из причин, по которой это не конкурирует, другая - это то, что предполагается, что каталог, в котором он запущен, пуст (или что посторонний вывод изls
разрешен). Я все еще хотел опубликовать это, потому что это просто показалось классным и неочевидным способом хранения информации.Другой по аналогичной схеме, который не имел бы такой же длины и ограничений по характеру, был бы:
3533 байтаЭто позволяет использовать
/
символ в строке и поддерживает гораздо больше символов (сколько именно зависит от реализации).(-2 байта на это благодаря шарлатану @Cows)
источник
s/..//
.$
Не требуется , поскольку все остальные строки будут удалены , так это может применяться только к последней строке, и^
может быть отброшено , так как замена применяется только на первом матче."$@"
, а не$@
, чтобы избежать получения ожогов от пробельных,*
,?
или~
символов.Python 3, 56 байт
Store (33 байта)
Получить (23 байта)
Печать с завершающим переводом строки.
источник
input()
вместоopen(0).read()
опускаяend=
изprint
?input
он не использовался, но если его пропустить,end=
то в конец строки будет добавлена новая строка (т.input()
?input
, я предполагаю, что строка для сохранения может содержать новые строки.Japt,
4630 байт-16 байт благодаря Шегги .
Один из первых раз, когда я пытался использовать Japt. JS Eval иногда может быть беспокойным. Использует браузер
window.localStorage
.Store (16 байт)
Получить (14 байт)
источник
setItem
иgetItem
полностью сlocalStorage.key
. Установить значение , получить значениеHaskell, 46 байтов
Store (26 байт):
Получить (20 байтов):
источник
Рубин (26 байт)
Set (16 байт)
Получить (10 байт)
источник
MATLAB (30 байт)
Set (22 байта)
Можно сбрить 4 байта, изменив на
input('')
, но это потребует ввода в одинарных кавычках:'input string'
Получить (8 байт)
источник
C (GCC), 98 байт
Store (46 байт)
Ввод осуществляется через первый аргумент командной строки.
Получить (52 байта)
Unportability
int
.Подтверждения
источник
int
может храниться указатель, чтобы неявное объявлениеint fopen()
работало. (Например, большинство 32-битных систем, или используйте,gcc -m32
если вы используете x86-64, чтобы сделать 32-битный исполняемый файл.) И кстати, я пытался использовать Linuxsendfile
иcopy_file_range(2)
системные вызовы, но они не работают в / из TTY.fputs(fopen())
, иread(open(),buf,-1)
. (Теперь вопрос разрешает вводить аргумент командной строки в качестве входных данных.)APL (Dyalog Unicode) , 18 байт
Магазин:
⍞⎕NPUT⎕A 1
попробуйте онлайн!Получить:
⊃⎕NGET⎕A
попробуйте онлайн!⍞
получить строку из stdin,⎕NPUT
поместить ее в собственный файл, называемый⎕A
прописным алфавитом,1
и перезаписать, если файл существует⊃
первая часть (данные, следующие части - это кодировка и тип конца строки) для⎕NGET
получения собственного файла⎕A
в верхнем регистреисточник
R (27 байт)
магазин (21 байт)
нагрузка (6 байт)
Чтобы это работало, первый сценарий должен быть вызван с параметром командной строки
--save
, а второй - с--restore
(хотя в интерактивном режиме это не обязательно: эти параметры являются параметрами по умолчанию).Это может быть сокращено на 7 байт, если бы не тот факт, что ошибка в R не позволяет аргументу по умолчанию
readLine
работать в неинтерактивном режиме. В интерактивном режиме это не является необходимым, и поэтому решение использует только 20 байтов .источник
q
непосредственно, с первой программой бытием ,x=scan(); q("y")
а второй либоx
или вcat(x)
зависимости от того, насколько строги мы хотим быть о том , как будут напечатаны строки. По обычным правилам гольф-кода вы также должны считать аргументы командной строки, поэтому добавьте байты для--save
и--restore
(что не нужно моей формулировке)scan
не работает с произвольным содержимым иscan(w='character')
дольше, чемreadLines()
.q
не нужно (ноq('y')
не сработает, вы должны записать это по буквамyes
). Я думал о том, чтобы просто использоватьx
во второй программе, но это будет нарушать требования, насколько я понимаю.scan(w="")
, вам не нужно указывать тип по типу, этоscan
будет выводить из указанного типа аргумента. Для меня q ("y") работает как выход, вызывающий сохранение, но, возможно, это зависит от вашей версии R и, возможно, используете ли вы Rstudio или нет.scan
: О, аккуратно, документация не упоминает об этом! К сожалению,scan
все еще будет выполнять некоторый анализ, так что это не будет работать со всеми входными данными. Во всяком случае,scan('stdin',w='')
бывает такой же длины, какreadLines('stdin')
.q
: R 3.4.4 говорит: «Ошибка в q (« y »): нераспознанное значение« save »».Java (JDK 10) , 204 байта
Предупреждение: перезаписывает любые настройки, которые любые java-программы сохранили для вашего имени пользователя!
Store, 94 байта:
Попробуйте онлайн!
Восстановить 110 байт:
Попробуйте онлайн!
Это работает, принимая входные данные в качестве аргумента и сохраняя их в хранилище пользовательских настроек, предоставленном java.util.prefs . Он перезаписывает корневой узел пользователя, чтобы сохранить один байт при именовании узла. Если вы хотите проверить его без деструктивности, либо запустите его с одноразовым именем пользователя, либо измените ключ с "" на имя узла.
источник
z
вы должны удалить его из программ и TIO. Попробуйте вместо этого поместить предупреждение в верхней части представления, чтобы предупредить людей. Наверняка у TIO должны быть ваши решения на 94 и 110 байтов.C #, 157 байт
Set, 74 Bytes:
Получите 83 байта:
-1 байт благодаря VisualMelon
-2 байт благодаря LiefdeWen
источник
"a",
, и я сомневаюсь, что это будет побито :)WriteAllLines
второй параметрa
Perl 5,
482623 байтаЗапись, 20 + 1 (-n) байтов
-3 байта благодаря толпе
На самом деле я не уверен в этом, но это соответствует критериям. Для прошлых записей учитывались только параметры cli, так что я собираюсь.
Читать, 0 + 2 байта
источник
-ne
1 (должно бытьe
тоже), а-pe
2? Вы могли бы использовать-E
иsay
вместоprint
.-E
, я не был знаком с этим. Что касается того, почему я не пошел с-ne
, это потому, что для этого я на самом деле работает из файла. Так что,perl -n w.pl
если это идет вразрез со стандартами сообщества PCG, я могу соответствующим образом отредактировать свой ответ.">>","f"
->">>f"
сохраняет 3 символаАтташе , 23 + 16 = 39 байт
Просто записывает STDIN в файл
A
, затем читает файлA
.store.@
:retrieve.@
:тестирование
источник
Луа,
575351 байтStore, 27 байт
Получить, 24 байта
источник
РУБИН
Store (24 байта)
Получить (16 байт)
источник
File.write'a',gets
иp File.read'a'
немного короче;)C (Unix / GNU), 23 + 23 = 46 байт
Store,
2723 байтаПолучить,
2723 байтаЭто в основном оборачивает ответ Джофеля в C-программу.
Примечание.
dd
Команды выводят некоторую статистикуstderr
, поэтому вы увидите некоторые дополнительные выходные данные, когда вы наивно запустите ее в оболочке. Тем не менее, поскольку задача только говорит о том, что хранимая строка должна быть представленаstdout
, а неstderr
я полагаю, что разрешено иметь дополнительный вывод наstderr
... В любом случае, подавитьstderr
вывод так же просто, как заменитьdd
наcat
, увеличивая число байтов две программы по одной, каждая.источник
int
тип возвращаемого значенияmain
. В старом стиле ANSI C типint
возврата по умолчанию.system()
и забыл об этомmain()
. Спасибо за указание на это :-)PHP, 26 + 1 + 21 = 48 байт
Store.php:
Беги с
echo <input> | php -nF Store.php
.Retrieve.php:
Беги с
php -n Retrieve.php
.источник
C (gcc) ,
7767 + 25 = 92 байтаКомпилирует только несколько предупреждений на моем gcc.
store.c
Может быть, можно сыграть в гольф, но я не могу понять, как. Segfaults, если вы ничего не передадите, но что угодно.
Питер Кордес: -1
read.c
источник
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.int
возвращаемое значение до 32 бит, а затем расширяет его как указатель. Если возвращаемое значениеFILE*
находится в младших 32 битах, это будет работать, но это не так в Linux x86-64.fopen
вручную. Переход к старой школе с аргументами также экономит некоторые байты*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Пакет - 11 байт
Входные данные принимаются в качестве аргумента командной строки и сохраняются (с сообщением об ошибке, созданным при попытке выполнения, поскольку CMD пытается выполнить параметр) в
f
.Пакет - 7 байт (неконкурентный)
В имени файла имеется множество недопустимых символов, поэтому для некоторых строк это не сработает, но это, по сути, сохраняет произвольный символ в имени файла, заданном параметром. Чтобы прочитать его, он просто перечисляет все файлы в каталоге, включая нашу строку.
источник