W 1984 r. Michael Crichton napisał program bezpieczeństwa w języku BASIC, który został opublikowany w magazynie Creative Computing. Program poprosi użytkownika o wpisanie wybranej frazy, zarejestruje interwały między naciśnięciami klawiszy, a następnie poprosi ją o ponowne wpisanie frazy. Jeśli czasy różnią się zbytnio, program zidentyfikuje użytkownika jako oszusta.
Twoje zadanie: stwórz wersję programu Crichtona w wybranym języku.
Zasady:
Zwroty do komunikacji z użytkownikiem („Wpisz frazę kluczową”, „Wpisz ponownie frazę kluczową” itp.) Liczą się jako jeden bajt bez względu na rzeczywistą długość. Służy to wyłącznie komunikacji użytkownika, nie próbuj ukrywać kodu programu w ciągach znaków.
Test pozytywny / negatywny powinien opierać się na średniej wartości bezwzględnej procentowych odchyleń od pierwotnych przedziałów. Jeśli ciągi nie pasują, albo zwróć błąd, albo pozwól użytkownikowi spróbować ponownie, według własnego uznania.
Fraza kluczowa nie powinna dopuszczać łańcucha zerowego. W przypadku, gdy fraza kluczowa jest za długa dla typu ciągu znaków, możesz ją obciąć lub zabronić i zacząć od nowa, według własnego uznania.
Czułość testu (próg testu pozytywnego / negatywnego) powinna być regulowana w kodzie źródłowym.
Pierwotnie zapewniłem premię w wysokości 20% całkowitej liczby bajtów, jeśli kod źródłowy można sformatować tak, aby przypominał dinozaura. Zwrócono uwagę, że jest to bardzo subiektywne i być może bardziej odpowiednie dla konkursu popularności, więc usunąłem ten bonus. Jednak nadal serdecznie zachęcam do formatowania dinozaurów, a jeśli sformatujesz swój kod, aby wyglądał jak dinozaur, możesz odjąć wszelkie czysto kosmetyczne komentarze, znaki podziału linii lub białe znaki od całkowitej liczby bajtów.
Wygrywa najkrótsza liczba bajtów, z zastrzeżeniem dostosowania długości łańcucha i formatowania dinozaura.
Zauważ, że moja powyższa specyfikacja nie do końca pasuje do działania kodu Crichtona, którego kopie można znaleźć w Internecie. Postępuj zgodnie ze specyfikacją, nie próbuj klonować oryginału.
"Please type the key phrase"
liczy się jako 1 bajt, czy tylko fraza się liczy, a cytowana fraza liczy się jako 3 bajty ("
, fraza"
)? Czy jest celowe, że znacznie dłuższy i znacznie krótszy interwał „skasuje się” i zrówna się? Czy program musi sprawdzić, czy oba kluczowe frazy są zgodne?Odpowiedzi:
Rubin,
171 167157 bajtówDane
true
wyjściowe, jeśli średnia wariancja przekracza 20%, w przeciwnym razie dane wyjściowefalse
.Próba plastyczna dinozaura ASCII:
Nie golfowany:
require 'io/console'
może zostać usunięty po uruchomieniu w niektórych Ruby REPL, ponieważ biblioteka jest już załadowana.źródło
Java 768 bajtów
co? Jawa? do golfa kodowego?
Jest to prawdopodobnie najgorsza rzecz do zrobienia, ale i tak spróbowałem.
Wyświetla wszelkie komunikaty w oknie konsoli, ale rzeczywiste pisanie występuje w polu JTextField. Niezupełnie ładnie wyglądające. Aha, aby zaoszczędzić 5 bajtów, musisz sam zmienić rozmiar JFrame. Ponadto nie sprawdza poprawności łańcucha za drugim razem. Nie jestem pewien, czy jest to niezgodne ze specyfikacjami.
Używać:
Wpisz swój klucz w polu tekstowym.
Nie naciskaj Enter, przejdź do konsoli i wpisz coś. Wyświetli inną wiadomość
Wpisz to samo w polu tekstowym (które powinno być teraz wyczyszczone).
Idź do konsoli i naciśnij coś jeszcze raz. Wyświetli się informacja, czy jesteś intruzem, czy nie.
bez golfa:
grał w golfa:
źródło
JFrame
, przedłużając klasę , abyś nie potrzebowałf
.HTML, JavaScript (ES6), 328
Całkowita liczba bajtów kodu wynosi 402 bajty, a komunikaty do interakcji z użytkownikiem:
są łącznie 78 bajtów, więc łączny wynik => 402 - 78 + 4 = 328
Uruchom poniższy fragment w najnowszym Firefoksie i wpisz klucz w polu wprowadzania, a następnie klawisz Enter.
Kod sprawdza, czy oba wpisane i ponownie wprowadzone klucze są takie same (monituje o ponowne wprowadzenie, jeśli nie), oblicza średni procent różnicy bezwzględnej i sprawdza, czy jest on mniejszy niż wartość zmiennej
V
źródło
C, 154 (86 + 68 dla flag)
Skompilować
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
i-DP=puts(
. Nowe linie dodane w celach prezentacji i mogą zostać usunięte (podana liczba bajtów nie występuje).Niegolfowane + komentarze:
Nie sprawdza to, czy wpisana fraza jest identyczna, ani nie wyświetla niczego, jeśli użytkownik nie zostanie zidentyfikowany jako oszust.
Nie uwzględnia to również czasu potrzebnego po wyświetleniu monitu przed pierwszym naciśnięciem klawisza.
źródło
getch
stawiaćgetc
lubgetchar
? Mam niezdefiniowane odniesienie do `getch ', które, jeśli dobrze pamiętam, jest przestarzałe?char
przed deklaracjami globalnymi, a teraz daje to błąd segmentacji w czasie wykonywania. Czy możesz podać szczegóły, jak to zbudować? Z jakiego kompilatora korzystasz? Dzięki.int
i zainicjować0
. Przetestowałem to za pomocą gcc w systemie Windows (za pomocą systemu Windowsgetch
).getch
jest używany zamiastgetc
lubgetchar
ponieważgetch
nie wymaga naciśnięcia klawisza Return przed przetworzeniem jakichkolwiek znaków (getch
jest rzeczywiście przestarzały w Windows, chociaż nie ma nic złego w używaniu przestarzałych funkcji tutaj).Scala REPL 233
Po usunięciu wszystkich odstępów masz:
Który jestem pewien, że ktoś bardziej utalentowany niż ja mógłby zrobić z dinozaura!
Krótkie wyjaśnienie:
l
Sposób odczytać znaki i utrzymuje oddechowychnanoTime
, kiedy każdy znak został wpisany.Te
m
odciski metoda"Enter"
, łamiel
metodę momencie uderzenia wejść (13 znaków), a następnie odwzorowuje to, aby po prostunanoTimes
, a następnie dostaje odstępów czasowych pomiędzy każdym znaku.Następne 2 wiersze czyta 2 ciągi, zamyka je, a następnie znajduje średnią wartość bezwzględną różnicy procentowej między drugim interwałem a pierwszym, i ostatecznie drukuje, czy ta średnia była mniejsza niż
0.2
.źródło
Common Lisp: 660
Nie golfił
Dodatkowe uwagi
Bonus dinozaura
Powinienem mieć bonus, bo wszyscy wiedzą, że „ Common Lisp to konający dinozaur ”.
źródło