Twoje programy:
Napiszecie dwa programy (oba w tym samym języku). Program pamięci pobiera ciąg znaków ze STDIN i przechowuje go w trwałym miejscu (patrz poniżej), a następnie kończy działanie bez błędu. Program pobierający nie pobiera danych wejściowych, pobiera zapisany ciąg i drukuje go do STDOUT.
Obiektywny test trwałości:
Powinno być możliwe uruchomienie programu pamięci masowej na komputerze lokalnym, a następnie wyłączenie i wyłączenie komputera lokalnego, a następnie wywołanie programu pobierania na komputerze lokalnym. Możesz ukryć ciąg znaków, jak chcesz (nawet w Internecie), pod warunkiem, że przejdziesz ten test ponownego uruchomienia.
Przypadki testowe:
Przechowywanie, a następnie pobieranie:
echo foo | Store
Retrieve
foo
Powtarzające się sklepy powinny nadpisywać (jak metoda set ()):
echo foo | Store
echo bar | Store
Retrieve
bar
Powtarzane pobieranie jest nieniszczące (jak metoda get ()):
echo foo | Store
Retrieve
foo
Retrieve
foo
Pobieranie przed wywołaniem Storage:
Nie musisz się tym martwić. Twój program pobierania może założyć, że program pamięci masowej został uruchomiony w pewnym momencie w przeszłości.
Elastyczność wejścia / wyjścia.
Ludzie prosili mnie o rozszerzenie tego ze ścisłego STDIN / STDOUT na standardowe zasady IO. Nie mogę, ponieważ wprowadziłoby to zbyt wiele luk. Niektóre standardowe opcje We / Wy już przechowują dane wejściowe w trwały sposób, np. „Programy mogą pobierać dane z pliku”. Chciałbym być bardziej elastyczny niż tylko ścisłe STDIN i STDOUT, ale bez otwierania zastawek.
Ze standardowego wątku zasad IO wybieram te, które nie łamią wyzwania:
Programy mogą pobierać dane za pośrednictwem monitów GUI i wierszy poleceń, jeśli chcesz
Programy mogą wyświetlać dane wyjściowe, wyświetlając je na ekranie. Obejmuje to okna dialogowe GUI
Programy mogą pobierać dane za pomocą argumentów wiersza polecenia
Programy mogą wyświetlać dane wyjściowe w STDERR, ale nadal nie mogą zgłaszać błędów.
Jeśli użyjesz alternatywy, musi ona być interaktywna dla użytkownika. Użytkownik nie powinien wykonywać żadnej innej pracy poza przesyłaniem danych wejściowych do programu, wpisywaniem go w wierszu polecenia programu lub wpisywaniem danych wejściowych jako argumentu wiersza polecenia programu. Użytkownik nie powinien nic robić poza uruchomieniem programu do pobierania, aby wyświetlić dane wyjściowe wyświetlane na ekranie lub wysyłane do STDOUT lub STDERR.
Dozwolone założenia:
- Twoje dwa programy będą działać w tym samym katalogu
- Twoje programy mają uprawnienia do odczytu i zapisu dla tego katalogu
- Pliki, które utworzysz, przetrwają ponowne uruchomienie (nie w katalogu tymczasowym)
- Dozwolony jest jeden znak nowej linii, który nie był częścią ciągu. Żadnych innych białych spacji
echo $@>x
icat x
ważny?Store
?Odpowiedzi:
zsh, 4 bajty
Zapisz:
>f
(odczytuje ze STDIN i zapisuje do pliku o nazwief
)Pobierz:
<f
(zapisuje zawartośćf
do STDOUT)źródło
TI-BASIC (Z80), 1 bajt ?
Store:
(wystarczy wpisać ciąg)
Retrieve:
Ans
(byte 27)Ale jeśli to nie jest poprawne:
TI-BASIC (Z80),
76 bajtów-1 dzięki Jakobowi.
Sklep:
Prompt Str0
(bajty DD AA 09)Pobierz:
disp Str0
(bajty ED AA 09)źródło
Ans
i zachować je w tej samej zmiennej? Pusty program sklepu i tylkoAns
do pobrania powinien działać: 1 bajt!Ans
trwa. W rzeczywistości utrzymuje się wiele stanów, w tym (jak sądzę) wszystkie zmienne użytkownika, równania i historia. Z punktu widzenia użytkownika, wyłączony jest w zasadzie odpowiednikiem kalkulatora TI stanu uśpienia na PC, więc nie zakłóca zbyt wiele.Przeglądarka JS, 44 bajty
Sklep :
Odzyskaj :
źródło
prompt()
czytać z stdin?prompt()
pojawia się alert, który prosi, aby wprowadzić tekst, i zwraca wynik.Powłoka POSIX sh / bash / ... 8 bajtów
sklep:
otrzymać:
źródło
cat
...Python 3 , 46 bajtów
sklep, 45 bajtów:
Program pobierania jest budowany przez komendę store, plik o nazwie
f
. ( 1 bajt dla nazwy pliku )źródło
input()
?input()
otrzymuje tylko do pierwszej nowej linii.open(0).read
czyta cały STDINstore
-Program odczytuje dane wejściowe ze standardowego wejścia, a następnie przechowuje program Pythona, który drukuje to wejście wf
. Przykład: STORE jest wywoływane z wejściemabc
. Następnie piszeprint('abc')
dof
. Jeśli teraz zadzwoniszf
(RETRIEVE), zostanie wydrukowaneabc
do STDOUT.Partia, 16 bajtów
źródło
PowerShell - 4 bajty
Przechowywanie:
(także alternatywnie
sc
)Wyszukiwanie
Edycja: Właśnie zauważyłem, że dane wyjściowe nie są dozwolone przez użytkownika ... więc przeskakuje z 4 do 6 lub 8 bajtów
Przechowywanie:
(alternatywnie również
sc f
) dla wersji 8-bajtowej(i określ
f
jako ścieżkę) dla wersji 6-bajtowejWyszukiwanie
źródło
Rdza, 136 bajtów
Sklep (84 bajty)
Odzyskaj (52 bajty)
Podziękowanie
źródło
use std::{io::*,fs::*}
a następnie używającwrite
zamiaststd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
wyzwalaerror[E0658]: use of unstable library feature 'io'
stabilną rdzę.chars()
jest przestarzałe na korzyśćString::from_utf8(stdin().bytes())
. (Również korzystałem z nocnych dokumentów, nie jestem pewien, czy to winowajca)bytes()
albochars()
, ale żaden z nich były bardzo krótki, ponieważ pozycja iterator owiniętaio::Result
.Grzmotnąć,
12 1110 bajtówsklep,
7 65 bajtów# nie ma potrzebycat ->f
-
, domyślne jest standardowe wejście# nie potrzeba miejsca, również sięcat >f
>
oddzielaodzyskać, 5 bajtów
źródło
-
w programie sklepu.>f
. Nie jestem jednak pewien, czy<f
można czytać.>f
działa jakecho '' > f
(opróżnianie pliku, jeśli istnieje, tworzenie, jeśli nie istnieje), podczas gdy<f
wydaje się, że nie można tego zrobić.HP 49G RPL, 48 bajtów
Aby zapisać:
:2: A DUP PURGE STO
26,5 bajtówAby przywrócić:
:2: A RCL
21,5 bajtówJeśli możemy zostawić baterię zapasową, otrzymujemy:
HP 49G RPL, 0 bajtów
Aby zapisać
:, 0 bajtów
Aby przywrócić:
0 bajtów, ponieważ HP 49G pozostawia stos nietknięty podczas ponownego uruchamiania.
źródło
APL (APLX) , 5 bajtów
Sklep:
⍞⍈1
Retrieve:
⍇1
⍞
pobierz wiersz ze standardowego⍈1
zapisu do następnego dostępnego komponentu pliku o numerze 1⍇1
przeczytajpierwszy* ostatni składnik pliku o numerze 1* Dokumentacja mówi pierwsza, ale eksperymenty pokazują ostatnie .
źródło
bash, 10 bajtów (niekonkurencyjny)
Nazwy plików uniksowych mogą zawierać dowolny znak oprócz
NUL
i/
, a ich nazwy mogą mieć długość do 255 bajtów, dzięki czemu będzie w stanie przechowywać tylko ciągi znaków do tej długości (weź pod uwagę ograniczenie nośnika pamięci) i które nie zawierają „/ ' w nich. To jeden z powodów, dla których nie jest konkurencyjny, innym jest to, że zakłada, że katalog, w którym jest uruchamiany, jest pusty (lub żels
dozwolone są dodatkowe dane wyjściowe z ). Nadal chciałem to opublikować, ponieważ wydawał się po prostu fajnym i nieoczywistym sposobem przechowywania informacji.Innym o podobnym charakterze, który nie miałby takich samych ograniczeń długości i znaków, byłoby:
3533 bajtówPozwala to na
/
znak w ciągu i obsługuje o wiele więcej znaków (dokładnie ile zależy od implementacji).(-2 bajty na ten temat dzięki kwakowi @Cows)
źródło
s/..//
. Nie$
jest to wymagane, ponieważ wszystkie inne wiersze są usuwane, więc można to zastosować tylko do ostatniego wiersza, a^
można je usunąć, ponieważ podstawienie jest stosowane tylko przy pierwszym dopasowaniu."$@"
, a nie$@
, aby uniknąć poparzenia przez białych,*
,?
lub~
znaków.Python 3, 56 bajtów
Przechowuj (33 bajty)
Odzyskaj (23 bajty)
Drukuje z końcowym znakiem nowej linii.
źródło
input()
zamiastopen(0).read()
omijającend=
odprint
?input
nie został użyty, ale pominięcieend=
spowoduje dodanie nowego wiersza na końcu łańcucha (tj. Nie oryginalnego łańcucha) (być może)input()
?input
, zakładam, że ciąg do zachowania może zawierać znaki nowej linii.Japt,
4630 bajtów-16 bajtów dzięki Shaggy .
Jeden z pierwszych przypadków, w których próbowałem użyć Japt. Ewaluacja JS może czasami być niespokojna. Korzysta z przeglądarki
window.localStorage
.Przechowuj (16 bajtów)
Odzyskaj (14 bajtów)
źródło
setItem
igetItem
całkowicie zlocalStorage.key
. Ustaw wartość , odzyskaj wartośćHaskell, 46 bajtów
Przechowuj (26 bajtów):
Pobierz (20 bajtów):
źródło
Rubin (26 bajtów)
Zestaw (16 bajtów)
Zdobądź (10 bajtów)
źródło
MATLAB (30 bajtów)
Zestaw (22 bajtów)
Można ogolić 4 bajty, zmieniając na
input('')
, ale będzie to wymagało wprowadzania danych w pojedynczych cudzysłowach:'input string'
Uzyskaj (8 bajtów)
źródło
C (GCC), 98 bajtów
Sklep (46 bajtów)
Dane wejściowe są przez argument pierwszego wiersza poleceń.
Odzyskaj (52 bajty)
Brak możliwości przenoszenia
int
.Podziękowanie
źródło
int
można przechowywać wskaźnik do niejawnej deklaracjiint fopen()
działania. (np. większość systemów 32-bitowych lub użyj,gcc -m32
jeśli używasz x86-64, aby 32-bitowy plik wykonywalny.) A tak przy okazji, próbowałem używać Linuksasendfile
icopy_file_range(2)
wywołań systemowych, ale one nie działają na / z TTY.fputs(fopen())
, iread(open(),buf,-1)
. (Pytanie pozwala teraz na wejście argumentu wiersza poleceń).APL (Dyalog Unicode) , 18 bajtów
Sklep:
⍞⎕NPUT⎕A 1
Wypróbuj online!Pobierz:
⊃⎕NGET⎕A
Wypróbuj online!⍞
pobierz wiersz ze stdin⎕NPUT
umieść go w pliku rodzimym zwanym⎕A
wielkimi literami1
i zastąp, jeśli plik istnieje⊃
pierwsza część (dane, kolejne części to kodowanie i typ zakończenia linii) z⎕NGET
pliku natywnego,⎕A
aby uzyskać wielkie litery alfabetuźródło
R (27 bajtów)
przechowuj (21 bajtów)
obciążenie (6 bajtów)
Aby to zadziałało, pierwszy skrypt musi zostać wywołany z opcją wiersza poleceń
--save
, a drugi z--restore
(chociaż w trybie interaktywnym nie jest to konieczne: te opcje są domyślne).Można to skrócić o 7 bajtów, gdyby nie fakt, że błąd w R uniemożliwia domyślnemu argumentowi
readLine
działanie w trybie nieinteraktywnym. W trybie interaktywnym nie jest to konieczne, dlatego rozwiązanie wykorzystuje tylko 20 bajtów .źródło
q
bezpośrednio z pierwszego programu samopoczuciax=scan(); q("y")
, a drugi obux
lubcat(x)
w zależności od tego, jak ścisłe chcemy być o tym, jak struny są drukowane. Zgodnie ze zwykłymi kodami golfowymi musisz także liczyć argumenty wiersza poleceń, więc dodaj bajty dla--save
i--restore
(których moja formuła nie potrzebuje)scan
nie działa dla dowolnych treści iscan(w='character')
jest dłuższy niżreadLines()
.q
jest niepotrzebne (aleq('y')
nie działałoby, musisz to przeliterowaćyes
). Myślałem o użyciu tylkox
w drugim programie, ale w stopniu, w jakim je rozumiem, naruszałoby to wymagania.scan(w="")
, nie musisz przeliterować typu,scan
wywnioskuje to na podstawie określonego typu argumentu. Dla mnie q („y”) działa jako wyjście powodujące zapisanie, ale być może zależy to od twojej wersji R i ewentualnie od tego, czy używasz Rstudio, czy nie.scan
: Och, schludnie, dokumentacja nie wspomina o tym! Niestetyscan
nadal będzie wykonywana parsowanie, więc nie będzie działać z wszystkimi danymi wejściowymi. W każdym raziescan('stdin',w='')
okazuje się, że ma dokładnie taką samą długość jakreadLines('stdin')
.q
: R 3.4.4 mówi „Błąd w q („ y ”): nierozpoznana wartość„ zapisz ”.Java (JDK 10) , 204 bajtów
Ostrzeżenie: nadpisuje wszelkie preferencje zapisane w programach Java dla Twojej nazwy użytkownika!
Sklep, 94 bajty:
Wypróbuj online!
Odzyskaj 110 bajtów:
Wypróbuj online!
Działa to poprzez przyjmowanie danych wejściowych jako argumentu i przechowywanie go w archiwum preferencji użytkownika dostarczonym przez java.util.prefs . Nadpisuje węzeł główny użytkownika, aby zaoszczędzić jeden bajt na nazwie węzła. Jeśli chcesz przetestować go nieniszcząco, albo uruchom go z nazwy użytkownika, którą chcesz wyrzucić, albo zmień klucz z „” na nazwę węzła.
źródło
z
, powinieneś usunąć ją z programów i TIO. Zastanów się nad umieszczeniem ostrzeżenia u góry zgłoszenia, aby ostrzec ludzi. Na pewno TIO powinno mieć twoje 94- i 110-bajtowe rozwiązania.C #, 157 bajtów
Zestaw, 74 bajty:
Uzyskaj, 83 bajtów:
-1 bajtów dzięki VisualMelon
-2 bajtów dzięki LiefdeWen
źródło
"a",
i wątpię, aby to zostało pobite :)WriteAllLines
i drugiego parametrua
Perl 5,
482623 bajtówNapisz, 20 + 1 (-n) bajtów
-3 bajty dzięki mobowi
Właściwie nie jestem pewien co do tego jednego punktu, ale spełnia on kryteria. W poprzednich wpisach liczono tylko opcje cli, więc o to właśnie chodzi.
Odczyt, 0 + 2 bajty
źródło
-ne
z 1 (powinien też mieće
), ale-pe
z 2? Możesz użyć-E
isay
zamiastprint
.-E
, że nie znałem tego. Jeśli chodzi o to, dlaczego nie poszedłem-ne
, to dlatego, że w tym przypadku tak naprawdę uruchamiam z pliku. Wygląda więc na to, żeperl -n w.pl
jeśli jest to sprzeczne ze standardami społeczności PCG, mogę odpowiednio edytować swoją odpowiedź.">>","f"
->">>f"
zapisuje 3 charAttache , 23 + 16 = 39 bajtów
Po prostu zapisuje STDIN do pliku
A
, a następnie odczytuje plikA
.store.@
:retrieve.@
:Testowanie
źródło
Lua,
575351 bajtówSklep, 27 bajtów
Odzyskaj, 24 bajty
źródło
RUBIN
Przechowuj (24 bajty)
Odzyskaj (16 bajtów)
źródło
File.write'a',gets
ip File.read'a'
są niecoC (Unix / GNU), 23 + 23 = 46 bajtów
Sklep,
2723 bajtówOdzyskaj,
2723 bajtówZasadniczo otacza to odpowiedź Jofela w programie C.
Uwaga:
dd
Poleceniastderr
generują statystyki , więc zobaczysz dodatkowe wyniki, gdy naiwnie uruchomisz je w powłoce. Jednakże, ponieważ tylko wyzwanie, mówi, że składowany ciąg musi być przedstawiony nastdout
niestderr
, biorę go, że może mieć dodatkowe wyjście nastderr
... W każdym razie, tłumiącstderr
wyjście jest tak proste jak wymianadd
zcat
, zwiększając liczbę bajt dwa programy po jednym, każdy.źródło
int
typ zwrotumain
. W starym stylu ANSI Cint
jest domyślnym typem zwrotu.system()
i zapomniałem omain()
ouch. Dzięki za zwrócenie na to uwagi :-)PHP, 26 + 1 + 21 = 48 bajtów
Store.php:
Uruchom z
echo <input> | php -nF Store.php
.Retrieve.php:
Uruchom z
php -n Retrieve.php
.źródło
C (gcc) ,
7767 + 25 = 92 bajtyKompiluje z kilkoma ostrzeżeniami na moim gcc.
store.c
Prawdopodobnie mogę zagrać w golfa, ale nie wiedziałem, jak to zrobić. Segfaults, jeśli nic nie zdasz, ale cokolwiek.
Peter Cordes: -1
czytaj. c
źródło
int*f=fopen
powinien działać, tj. okłamać kompilator o typie wskaźnika. Ale tylko wtedy, gdy kompilujesz dla systemu 32-bitowego (tj. Takiego, w którymint
można trzymać wskaźnik, jakgcc -m32
, lub po prostugcc
w systemie w pełni 32-bitowym). Możesz także zadeklarować główny jakomain(int c,char**v)
, a możeint**v
dlatego, że nie dereferencjonujesz.main(int c,char**v)
dzieła. Zdałem sobie również sprawę, że mogę to zrobićfputs(v[1],fopen("f","w")
, chociaż z jakiegoś powodu nadal wymaga stdio.int
wartość zwracaną do 32 bitów, a następnie rozszerzy znak jako wskaźnik. Jeśli zwracany kodFILE*
ma mniej niż 32 bity, działałoby, ale nie jest tak w przypadku Linuksa x86-64.fopen
ręcznie. Idąc starą szkołę z argumentami oszczędza kilka bajtów za:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Partia - 11 bajtów
Dane wejściowe są odbierane jako argument wiersza polecenia i są kontynuowane (z komunikatem o błędzie utworzonym podczas próby wykonania, ponieważ CMD próbuje wykonać parametr) w
f
.Partia - 7 bajtów (niekonkurencyjne)
W nazwie pliku jest mnóstwo nieprawidłowych znaków, więc nie działałoby to w przypadku niektórych ciągów, ale zasadniczo zapisuje dowolny znak w nazwie pliku podanej przez parametr. Aby go przeczytać, po prostu wyświetla wszystkie pliki w katalogu, w tym nasz ciąg.
źródło