Najkrótszy kod w Twoim języku, aby zachować ciąg znaków podczas ponownego uruchamiania

48

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:

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

To jest golf golfowy, a twój wynik to suma bajtów z obu programów.

Jared K.
źródło
9
więc sprawiedliwy echo $@>xi cat xważny?
Adám
1
Twoja specyfikacja nie wspomina o możliwości wielokrotnego przechowywania, ale masz przykładowy przypadek, który to robi. Czy możemy założyć czyste środowisko dla każdego wywołania Store?
Adám
4
@EriktheOutgolfer Dlaczego nie byłby ważny? Nawet jeśli w meta jest omawiana luka, która nie uniemożliwia konkretnemu wyzwaniu wyzwania.
dylnan
6
Ograniczenia sieciowe zazwyczaj dotyczą pobierania rzeczy z sieci jako luki, aby wyjść z pracy tworzenia takich rzeczy. W tym przypadku, jeśli jest w Internecie, to dlatego, że wykonałeś pracę, aby go tam umieścić.
Jared K
3
Ktoś musi napisać odpowiedź na komputer z pamięcią z rdzeniem magnetycznym.
Mark

Odpowiedzi:

88

zsh, 4 bajty

Zapisz: >f(odczytuje ze STDIN i zapisuje do pliku o nazwie f)
Pobierz: <f(zapisuje zawartość fdo STDOUT)

Klamka
źródło
8
Myślę, że mamy zwycięzcę.
Adám,
@ Adám, chyba że istnieje token do zapisywania danych wejściowych do pliku w 1 bajcie: P
FreezePhoenix
1
@FreezePhoenix Prawdopodobnie nie ma, chyba że napiszesz teraz nowy język, który jest niedozwolony ...
Chromium
4
@Chromium check Z80 odpowiedź: niektóre istniejące języki mogą pisać z programu 0-bajtowego.
Cœur
55

TI-BASIC (Z80), 1 bajt ?

Store:  (wystarczy wpisać ciąg)
Retrieve: Ans(byte 27)

Ale jeśli to nie jest poprawne:

TI-BASIC (Z80), 7 6 bajtów

-1 dzięki Jakobowi.

Sklep: Prompt Str0(bajty DD AA 09)
Pobierz: disp Str0(bajty ED AA 09)

Adám
źródło
1
Czy jesteś pewien, że to 5 bajtów?
FreezePhoenix
6
@FreezePhoenix TI-Basic używa tokenów.
Adám,
3
Hmm ... Dlaczego nie wziąć danych wejściowych Ansi zachować je w tej samej zmiennej? Pusty program sklepu i tylko Ansdo pobrania powinien działać: 1 bajt!
Jakob
9
@Arthur Tak, Anstrwa. 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.
Jakob
2
@JaredK Zdecydowanie zgadzam się, że 1-bajtowe rozwiązanie pachnie nadużyciami reguł (nawet jeśli to ja to zasugerowałem). Powiedziałbym jednak, że program sklepu kończy działanie, ponieważ inne programy mogą być uruchamiane po nim (chociaż zakłócają działanie rozwiązania). Moja interpretacja twojego „obiektywnego testu trwałości” była taka, że ​​programy będą uruchamiane bezpośrednio przed i po cyklu zasilania. Jeśli jest to niepoprawne, być może możesz wymagać, aby rozwiązanie 1-bajtowe było oznaczone jako niekonkurencyjne?
Jakob
23

Przeglądarka JS, 44 bajty

Sklep :

localStorage.a=prompt()

Odzyskaj :

alert(localStorage.a)
Esolanging Fruit
źródło
Będzie prompt()czytać z stdin?
rura
9
Czy graficzna przeglądarka internetowa ma STDIN? Nie prompt()pojawia się alert, który prosi, aby wprowadzić tekst, i zwraca wynik.
Dev
5
@Dev Oczywiście graficzna przeglądarka internetowa ma STDIN, tak jak każdy inny proces. Jeśli nie możesz użyć go z określonego języka, to inne pytanie, a jeśli odpowiedź brzmi „Nie”, być może mogę go wykorzystać w tym wyzwaniu.
rura
5
@Dev Domyślne metody we / wy obejmują wprowadzanie za pomocą zachęty GUI i wysyłanie za pośrednictwem wyświetlacza GUI . O ile OP nie ma na celu zastąpienia standardu, powinno to być ważne. Wyjaśnię.
Esolanging Fruit
2
Zredagowałem wyzwanie, aby pozwolić na więcej IO, ale rozszerzam je tylko na ograniczony podzbiór domyślnych metod IO. Ta odpowiedź jest jednak w moim podzbiorze. Lubię to.
Jared K,
19

Powłoka POSIX sh / bash / ... 8 bajtów

sklep:

dd>f

otrzymać:

dd<f
Jofel
źródło
2
Fajny, bije nawet cat...
cmaster
12

Python 3 , 46 bajtów

sklep, 45 bajtów:

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

Program pobierania jest budowany przez komendę store, plik o nazwie f. ( 1 bajt dla nazwy pliku )

ovs
źródło
2
Na pewno możesz użyć input()?
Artemis Fowl,
@ArtemisFowl input()otrzymuje tylko do pierwszej nowej linii. open(0).readczyta cały STDIN
Jo King
Prawdopodobnie pisałeś, gdy sprawy były nadal niejednoznaczne, ale jak na razie ta odpowiedź nie spełnia bieżącej specyfikacji. Pierwotnie chciałem, aby wymóg STDIN / STDOUT był ścisły, z domyślnymi niedozwolonymi. Rozszerzyłem go, ale tylko do części domyślnych. Twój program pobierania, jeśli nie używa STDOUT, nadal musi wyświetlać dane wyjściowe na ekranie. Gdybym zezwolił na pełne wartości domyślne, rozwiązaniem dla każdego języka byłoby „pobiera dane wejściowe do pliku”, „daje dane wyjściowe w pliku”, zero bajtów.
Jared K
@JaredK Nie sądzę, że rozumiesz, jak to działa. store-Program odczytuje dane wejściowe ze standardowego wejścia, a następnie przechowuje program Pythona, który drukuje to wejście w f. Przykład: STORE jest wywoływane z wejściem abc. Następnie pisze print('abc')do f. Jeśli teraz zadzwonisz f(RETRIEVE), zostanie wydrukowane abcdo STDOUT.
ovs
@JaredK W komentarzu spytałem Cię, czy STORE może modyfikować ODZYSKANIE.
ovs
10

Partia, 16 bajtów

COPY CON A
TYPE A
l4m2
źródło
8

PowerShell - 4 bajty

Przechowywanie:

ac

(także alternatywnie sc)

Wyszukiwanie

gc

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:

ac f

(alternatywnie również sc f) dla wersji 8-bajtowej

ac

(i określ fjako ścieżkę) dla wersji 6-bajtowej

Wyszukiwanie

gc f
Heiko Hatzfeld
źródło
8

Rdza, 136 bajtów

Sklep (84 bajty)

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

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

Odzyskaj (52 bajty)

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

Podziękowanie

Jakob
źródło
1
Możesz zapisać bajt, zmieniając import na, use std::{io::*,fs::*}a następnie używając writezamiast std::fs::write.
Esolanging Fruit
Jak o write("a",String::from_iter(stdin().chars()))?
Bergi,
@Bergi Nicea. Ale charswyzwala error[E0658]: use of unstable library feature 'io'stabilną rdzę.
Jakob,
Hm, wygląda na to, że 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)
Bergi
@Bergi Próbowałem kilka odmian z bytes()albo chars(), ale żaden z nich były bardzo krótki, ponieważ pozycja iterator owinięta io::Result.
Esolanging Fruit
8

Grzmotnąć, 12 11 10 bajtów

sklep, 7 6 5 bajtów

cat ->f# nie ma potrzeby -, domyślne jest standardowe wejście

cat >f# nie potrzeba miejsca, również się >oddziela

cat>f

odzyskać, 5 bajtów

cat f
Pelle
źródło
1
Nie ma potrzeby -w programie sklepu.
Konrad Rudolph
2
Nie ma też potrzeby odstępów między „cat” i „>”!
psmears,
Powinieneś być w stanie zrobić to samo, co w poście zsh do pisania i używania >f. Nie jestem jednak pewien, czy <fmożna czytać.
allo
@ allo Przynajmniej na Cygwinie >fdziała jak echo '' > f(opróżnianie pliku, jeśli istnieje, tworzenie, jeśli nie istnieje), podczas gdy <fwydaje się, że nie można tego zrobić.
sundar,
7

HP 49G RPL, 48 bajtów

Aby zapisać: :2: A DUP PURGE STO26,5 bajtów

Aby przywrócić: :2: A RCL21,5 bajtów

Jeś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.

Jason
źródło
Rozwiązanie zero-bajtowe powinno działać dla różnych kalkulatorów. Wyrzucę moje 42s, kiedy wrócę do domu.
SIGSTACKFAULT,
Myślę, że twoje rozwiązanie zero-bajtowe, a inne uruchamiane na kalkulatorach, które restartują się nieniszcząco, nie spełniają dwóch części pytania: „Stworzysz dwa programy”. To, co masz, to pojedynczy program, który przetrwa ponowne uruchomienie. I „Store odczytuje ze STDIN, a następnie kończy bez błędu”. Twój program nadal czeka na naciśnięcie klawisza przez użytkownika. Stos i stan wykonania programu są nadal zmienne. Myślę, że to oznacza, że ​​wciąż działa i nie wyszedł.
Jared K
@JaredK Pytanie nigdy nie przewidywało, że dwa programy nie mogą być identyczne. Co do końcowej części: tradycyjnie w RPL dane wejściowe do programów są podawane na stosie. To jest standardowe wejście.
Jason
1
Czy stos przetrwałby cykl zasilania? Może łagodne wyłączenie za pomocą przycisków kalkulatora, ale chyba nie wyjmuję baterii. Więc może zależy to od cyklu zasilania.
użytkownik
1
@ użytkownik Nie, stos nie przetrwa miękkiego (ON + C) lub twardego resetu (ON + A + F) (inaczej niż soft-power off, Right Shift + ON), w przeciwieństwie do przechowywania w porcie 2, którym jest pamięć flash ( i przetrwa miękki i twardy reset). Ponieważ wydaje się, że odpowiedź TI-BASIC używa tej definicji, do kompletności dołączyłem odpowiedź stosu.
Jason
6

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 przeczytaj pierwszy * ostatni składnik pliku o numerze 1

Sesja Sklepu APLXSesja pobierania APLX

* Dokumentacja mówi pierwsza, ale eksperymenty pokazują ostatnie .

Adám
źródło
6

bash, 10 bajtów (niekonkurencyjny)

touch $@
ls

Nazwy plików uniksowych mogą zawierać dowolny znak oprócz NULi /, 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 że lsdozwolone 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:

35 33 bajtów

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

Pozwala 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)

zegar słoneczny
źródło
1
IIRC, uważam, że grupa w Berkeley stworzyła kiedyś system baz danych w latach 90., który przechowywał dane kolumny tabeli jako nazwy plików (do 255 znaków). Myślę, że wiersze i tabele były katalogami nadrzędnymi.
David R Tribble
W swojej 35-bajtowej odpowiedzi możesz zmienić drugą instrukcję na 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.
Kritixi Lithos
@Cowsquack Gotowe. Dziękujemy za wyjaśnienie, dlaczego zmiana również działa.
sundar
Trzeba użyć "$@", a nie $@, aby uniknąć poparzenia przez białych, *, ?lub ~znaków.
Anders Kaseorg
5

Python 3, 56 bajtów

Przechowuj (33 bajty)

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

Odzyskaj (23 bajty)

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

Drukuje z końcowym znakiem nowej linii.

Jakob
źródło
dlaczego nie input()zamiast open(0).read()omijając end=od print?
MoxieBall,
@MoxieBall Nie jestem pewien, dlaczego inputnie został użyty, ale pominięcie end=spowoduje dodanie nowego wiersza na końcu łańcucha (tj. Nie oryginalnego łańcucha) (być może)
@NickA Wygląda na to, że w pytaniu jest drukowana nowa linia, więc nie sądzę, że powinno to mieć znaczenie ...
MoxieBall
Czy oszalałem czy 23 + 33 = 56 (nie 54)? Również dlaczego nie użyć input()?
Artemis Fowl
1
@ArtemisFowl Good catch. Jeśli chodzi o input, zakładam, że ciąg do zachowania może zawierać znaki nowej linii.
Jakob
4

Japt, 46 30 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)

Ox`lo¯lSÈSge.P=U

Odzyskaj (14 bajtów)

Ox`lo¯lSÈSge.P
LegionMammal978
źródło
+1 za to, że jako pierwszy użyłem czegoś innego niż standardowe IO pliku, podoba mi się.
Jared K,
1
Witamy w Japt! :)
Kudłaty
1
Nawiasem mówiąc, możesz ominąć setItemi getItemcałkowicie z localStorage.key. Ustaw wartość , odzyskaj wartość
Shaggy
@Shaggy Thanks! Pozdrawiam również unikając znaków kontrolnych Weirdera.
LegionMammal978
4

Haskell, 46 bajtów

Przechowuj (26 bajtów):

getContents>>=writeFile"t"

Pobierz (20 bajtów):

readFile"t">>=putStr
nimi
źródło
3

Rubin (26 bajtów)

Zestaw (16 bajtów)

IO.write'a',gets

Zdobądź (10 bajtów)

IO.read'a'
DarkWiiPlayer
źródło
3

MATLAB (30 bajtów)

Zestaw (22 bajtów)

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

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)

load a;a
18 października jest dniem ciszy na SE
źródło
3

C (GCC), 98 bajtów

Sklep (46 bajtów)

Dane wejściowe są przez argument pierwszego wiersza poleceń.

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

Odzyskaj (52 bajty)

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

Brak możliwości przenoszenia

  • Wymaga dopasowania kilku typów wskaźników int.

Podziękowanie

Jakob
źródło
1
Wymaga to implementacji języka C, w której intmożna przechowywać wskaźnik do niejawnej deklaracji int fopen()działania. (np. większość systemów 32-bitowych lub użyj, gcc -m32jeśli używasz x86-64, aby 32-bitowy plik wykonywalny.) A tak przy okazji, próbowałem używać Linuksa sendfilei copy_file_range(2)wywołań systemowych, ale one nie działają na / z TTY.
Peter Cordes,
1
Ponieważ piszesz funkcje, a nie programy, być może możesz uzasadnić przyjęcie ciągu wejściowego jako funkcji arg fputs(fopen()), i read(open(),buf,-1). (Pytanie pozwala teraz na wejście argumentu wiersza poleceń).
Peter Cordes
Linuksowa funkcja „splice” kopiuje z potoku do pliku (i odwrotnie). Jeśli stdin / out są potokami, zapisze wywołanie funkcji kosztem większej liczby parametrów.
CSM,
2

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 literami 1 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

Adám
źródło
2

R (27 bajtów)

przechowuj (21 bajtów)

x=readLines('stdin')

obciążenie (6 bajtów)

cat(x)

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 readLinedziałanie w trybie nieinteraktywnym. W trybie interaktywnym nie jest to konieczne, dlatego rozwiązanie wykorzystuje tylko 20 bajtów .

Konrad Rudolph
źródło
1
Myślę, że byłoby znacznie bardziej efektywne w użyciu qbezpośrednio z pierwszego programu samopoczucia x=scan(); q("y"), a drugi obu xlub cat(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 --savei --restore(których moja formuła nie potrzebuje)
JDL 6'18
@JDL scannie działa dla dowolnych treści i scan(w='character')jest dłuższy niż readLines(). qjest niepotrzebne (ale q('y')nie działałoby, musisz to przeliterować yes). Myślałem o użyciu tylko xw drugim programie, ale w stopniu, w jakim je rozumiem, naruszałoby to wymagania.
Konrad Rudolph
1
możesz użyć scan(w=""), nie musisz przeliterować typu, scanwywnioskuje 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.
JDL,
@JDL scan: Och, schludnie, dokumentacja nie wspomina o tym! Niestety scannadal będzie wykonywana parsowanie, więc nie będzie działać z wszystkimi danymi wejściowymi. W każdym razie scan('stdin',w='')okazuje się, że ma dokładnie taką samą długość jak readLines('stdin'). q: R 3.4.4 mówi „Błąd w q („ y ”): nierozpoznana wartość„ zapisz ”.
Konrad Rudolph
Ach, to jest sprawa Rstudio - wypróbowałem to w Rstudio i osobno na terminalu i działało tylko w Rstudio.
JDL
2

Java (JDK 10) , 204 bajtów

Ostrzeżenie: nadpisuje wszelkie preferencje zapisane w programach Java dla Twojej nazwy użytkownika!

Sklep, 94 bajty:

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

Wypróbuj online!

Odzyskaj 110 bajtów:

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

Wypróbuj online!

java S foo
java R
foo

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.

Jared K.
źródło
Dobry pomysł! Ponieważ używasz Java 10, możesz je skrócić, tworząc z nich wyrażenia lambda. Również jeśli twoja liczba bajtów nie obejmuje 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.
Jakob
Dzięki! Wprowadziłem twoje sugerowane zmiany. Nie jestem pewien, ale nie sądzę, że wyrażenia lambda mogą spełnić niestandardowe reguły IO dla tego pytania.
Jared K
Nie. Masz rację, zapomniałem o tym.
Jakob,
2

C #, 157 bajtów

Zestaw, 74 bajty:

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

Uzyskaj, 83 bajtów:

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

-1 bajtów dzięki VisualMelon
-2 bajtów dzięki LiefdeWen

raznagul
źródło
Usuń to miejsce później "a",i wątpię, aby to zostało pobite :)
VisualMelon
Możesz zapisać kolejny bajt za pomocą WriteAllLinesi drugiego parametrua
LiefdeWen
2

Perl 5, 48 26 23 bajtów

Napisz, 20 + 1 (-n) bajtów

-3 bajty dzięki mobowi

open f,">>f";print f

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

perl -pe "" f
Geoffrey H.
źródło
1
Dlaczego zdobyłeś wynik -nez 1 (powinien też mieć e), ale -pez 2? Możesz użyć -Ei sayzamiast print.
simbabque
Dziękuję za poinformowanie mnie -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, że perl -n w.pljeśli jest to sprzeczne ze standardami społeczności PCG, mogę odpowiednio edytować swoją odpowiedź.
Geoffrey H.
Nie, w porządku. Dodajemy znak do dodatkowych argumentów wiersza poleceń, więc jest w porządku.
simbabque
2
">>","f"-> ">>f"zapisuje 3 char
mob
1

Attache , 23 + 16 = 39 bajtów

Po prostu zapisuje STDIN do pliku A, a następnie odczytuje plik A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Testowanie

C:\Users\conorob\Programming\attache (master -> origin)
λ echo testing | attache store.@

C:\Users\conorob\Programming\attache (master -> origin)
λ attache retrieve.@
testing
Conor O'Brien
źródło
1

Lua, 57 53 51 bajtów

Sklep, 27 bajtów

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

Odzyskaj, 24 bajty

print(io.open"x":read())
Lycea
źródło
1

RUBIN

Przechowuj (24 bajty)

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

Odzyskaj (16 bajtów)

p File.read('a')
Gregory
źródło
4
Pytanie dotyczy przechowywania danych wejściowych ze STDIN, a nie argumentów
Ferrybig
Od tego czasu edytowałem, aby umożliwić alternatywne operacje wejścia / wyjścia, w tym argumenty.
Jared K,
1
File.write'a',getsi p File.read'a'są nieco
krótsi
1

C (Unix / GNU), 23 + 23 = 46 bajtów

Sklep, 27 23 bajtów

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

Odzyskaj, 27 23 bajtów

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

Zasadniczo otacza to odpowiedź Jofela w programie C.

Uwaga: ddPolecenia stderrgenerują 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 na stdoutnie stderr, biorę go, że może mieć dodatkowe wyjście na stderr... W każdym razie, tłumiąc stderrwyjście jest tak proste jak wymiana ddz cat, zwiększając liczbę bajt dwa programy po jednym, każdy.

cmaster
źródło
W zależności od kompilatora możesz również być w stanie usunąć inttyp zwrotu main. W starym stylu ANSI C intjest domyślnym typem zwrotu.
Jakob,
@Jakob Ah, tak, oczywiście. Oparłem się świadomie na dorozumianej deklaracji system()i zapomniałem o main()ouch. Dzięki za zwrócenie na to uwagi :-)
cmaster,
1

PHP, 26 + 1 + 21 = 48 bajtów

Store.php:

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

Uruchom z echo <input> | php -nF Store.php.

Retrieve.php:

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

Uruchom z php -n Retrieve.php.

Tytus
źródło
1

C (gcc) , 77 67 + 25 = 92 bajty

Kompiluje z kilkoma ostrzeżeniami na moim gcc.

store.c

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

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

main(){system("cat f");}
SIGSTACKFAULT
źródło
int*f=fopenpowinien działać, tj. okłamać kompilator o typie wskaźnika. Ale tylko wtedy, gdy kompilujesz dla systemu 32-bitowego (tj. Takiego, w którym intmożna trzymać wskaźnik, jak gcc -m32, lub po prostu gccw systemie w pełni 32-bitowym). Możesz także zadeklarować główny jako main(int c,char**v), a może int**vdlatego, że nie dereferencjonujesz.
Peter Cordes,
Do 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.
SIGSTACKFAULT,
Powinno działać, jeśli skompilujesz 32-bitowy plik wykonywalny. W przypadku x86-64 kompilator skróci intwartość zwracaną do 32 bitów, a następnie rozszerzy znak jako wskaźnik. Jeśli zwracany kod FILE*ma mniej niż 32 bity, działałoby, ale nie jest tak w przypadku Linuksa x86-64.
Peter Cordes,
Jeśli korzystasz z systemu, w którym wszystkie wskaźniki mają taki sam rozmiar (raczej prawdopodobne), możesz uniknąć włączenia, deklarując fopenrę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"));}.
gastropner
1

Partia - 11 bajtów

%12>f
type f

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)

'>%1
dir

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.

GetHacked
źródło
1
Twoje rozwiązanie wydaje się wyświetlać dane wyjściowe w STDOUT, co jest poprawne. STDERR to kolejna opcja, niewymagana. Cytaty wokół danych wejściowych nie powstrzymują ich przed konkurowaniem. Jedyne pytanie brzmi, czy powinny być liczone w liczbie bajtów. Myślę, że nie, ponieważ nie są one specyficzne dla pytania. Wydają się być standardowym szablonem dla Batcha, który przyjmuje argument wiersza poleceń, który nie różni się tak bardzo od języków, które wymagają standardowych flag wiersza poleceń. Może ktoś inny z wiedzą wsadową włączy się. Na razie pomiń ich liczbę bajtów. Witamy w Code Golf! :)
Jared K