Biorąc pod uwagę standardowy zamek szyfrowy, taki jak na zdjęciu. Sposób odblokowania polega na wyrównaniu 4 cyfr w kodzie w wierszu kombinacji. Po latach lojalnej służby zostałeś zwolniony z fabryki zamków i zdecydowałeś się zemścić, nie zrywając zamków przed ich wysłaniem, pozostawiając w ten sposób każdy zamek z kombinacją, aby odblokować go na linii kombinacji.
Wiesz również, że patrząc na kolejność liczb w innych liniach można ustalić, jakie liczby muszą znajdować się na linii kombinacji (a zatem i kombinacji, aby ją odblokować).
Jeśli każda linia na zamku otrzyma numer zaczynający się od linii 0 dla linii złożonej (linia, która odblokowuje zamek) do linii 9. Na przykład, jeśli liczby w linii 4 są 5336
, to kombinacja do odblokowania będzie 1992
.
Niestety zamki zostały już spakowane, a widok każdego zamka jest zasłonięty, więc możesz zobaczyć tylko liczby w różnych liniach zamka.
Wyzwanie
Biorąc pod uwagę 4 pary cyfr, gdzie pierwsza cyfra liczby całkowitej reprezentuje numer linii, a druga cyfra reprezentuje liczbę, która pojawia się w tej linii, opracuj kombinację do zamka. Na przykład jeśli wpiszesz:
57 23 99 45
Następnie powinien wypisać:
2101
Lub
25 78 63 15
i
3174
Załóżmy, że dane wejściowe będą zawsze 4 dodatnimi liczbami całkowitymi w postaci `25 64 72 18.
To jest golf golfowy , więc wygrywa najkrótszy program pod względem liczby bajtów.
Jest to również moje pierwsze pytanie, więc wszelkie uwagi są mile widziane.
57 23 99 45
. To nie są cztery pary liczb całkowitych: to cztery liczby całkowite. I niektóre odpowiedzi zakładają, że otrzymają to jako ciąg, podczas gdy inne zakładają, że jest gotowy jako 4 ints.0
).Odpowiedzi:
CJam,
98 bajtówCzyta pary cyfr jako argumenty wiersza poleceń. Aby wypróbować kodu w Internecie , zmiany
ea
dolS/
odczytu z symulowanym stdin.Przykładowy przebieg
Jak to działa
Kod znaku cyfry d to 48 + d . Zatem, biorąc pod uwagę dwucyfrowy ciąg xy, podstawowa liczba 9 daje 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
źródło
"99"
jest interpretowany jako tablica[57 57]
przezb
;"xy"9b
jest implementowany jako9 * ord(x) + ord(y)
. Powinienem dodać to do mojej odpowiedzi.CJam,
131211 znakówDzięki user23013 ma teraz do 11 znaków :)
Objaśnienia:
Wypróbuj online
Wiem, że można bardziej grać w golfa. Ale to moja pierwsza prawdziwa próba na CJam i jestem ograniczony doświadczeniem :)
Alternatywnie, inne metody, aby zrobić to samo z 1 dodatkową postacią:
lub
lub
źródło
l~]
. Wydaje mi się, że parsowanie danych wejściowych powinno być możliwe przy mniej niż trzech, ale nigdy wcześniej nie korzystałem z CJam: /4{ri_A/-A%}*
jest o jeden bajt krótszy.4{Ar:--A%}*
.Golfscript (14
13)Wypróbuj online tutaj
Jest prawie taki sam jak rozwiązanie Optimizer , ale w innym języku. Trudno podejść do tego inaczej, ponieważ problem jest dość prosty
, więc remis zdecydowanie trafia do Optymalizatora, którego wejście i tak było wcześniej.Dla tej samej liczby bajtów możesz zrobić
źródło
- 10
.GNU dc , 14 bajtów
Pożyczka @ Sprytna sztuczka z bazą 9 Dennisa :
Wprowadź liczby całkowite odczytane ze STDIN, po jednej w wierszu.
Wyjaśnienie:
Wydajność:
Poprzednia odpowiedź, 18 bajtów:
Ponieważ myślałem, że mogę zbliżyć się do języków „golfowych” dzięki temu (ale nie zrobiłem tego):
źródło
9i[?A%nd]dxxxx
C
646356 lub 61Jeśli dane wejściowe można potokować z pliku
Jeśli dane wejściowe należy wpisać jako standardowe
Odczytuje cztery liczby w pętli, a następnie przetwarza każdą z nich, odejmując pierwszą cyfrę od wartości i wypisując wynik modulo 10.
Oszczędności dzięki różnym komentarzom poniżej, a także zastosowaniu putchar zamiast printf
źródło
scanf
zewnętrzną stronę wfor()
ten sposóba,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
zamiasta-a/10
while
pętli i deklarująca
jako argumentmain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Bezpośredni.
Może być krótszy, jeśli mogę
[2, 1, 0, 1]
zamiast tego drukować, powiedzmy, ( 46 ):źródło
str((i-i//10)%10)
bezpośrednio zamiast używać sekundymap()
. Zacząłem od generatorów również dla moich, ale okazało się, że rzeczywistafor
pętla okazała się krótsza.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Także jeśli przestrzenie allowd na wyjściu można uniknąćjoin
i wykorzystanie krotka-rozpakowaniu:print(*((i-i//10)%10for i in map(int,input().split())))
.C 92
Dane wejściowe z wiersza polecenia. Odejmuje pierwszy kod ASCII każdego argumentu od drugiego, dodaje 10 i przyjmuje modulo 10.
Myślę, że po raz pierwszy napisałem
printf
z czterema%
si bez przecinka (przecinek jest w#define.
)źródło
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
po którym następujea,b;main(){f;f;f;f;}
18 bajtów krótszych.scanf
jest konieczne, biorąc pod uwagę, żescanf
ma on analizować białe znaki tylko jako separator. Alchymist ma jeszcze lepszy pomysł w C. Ale wygląda na to, że już wygrałeś swoją odpowiedzią Cjam.a(n)
można pominąć, potem zauważyłem, że wstawienieprintf("%d%,...)
makra pozwoliłoby zaoszczędzić kilka bajtów i w końcu trochę mnie poniosło ... - Miejsce jest potrzebne, ponieważ%c
czyta się dowolną postać znak, więc przy drugim uruchomieniu zapisuje 32 wa
. - Pokonanie CJam z C powinno okazać się trudne.printf()
jest już tak długo, jak moja odpowiedź ...Java - 203 bajty
Tylko dlatego, że musi być wpis Java, widziałem dobrą okazję, aby dać szansę temu kodowi golfowemu (pierwsze zgłoszenie w historii).
Jeśli jest miejsce na ulepszenia, chętnie się o nich dowiem ;-)
źródło
Lua - 46 znaków
Czyta trzy znaki na raz (daj mi małą litość wpisywania spacji na końcu), a mimo to a i b są ciągami-y ... ba MAGICZNIE pozwala im poczuć zdrową liczbę całkowitą dla dziecka. Czy zawijanie sprawdza się podczas drukowania.
źródło
JavaScript ES6 -
5343 bajtyDość prosta funkcja, używa wyrażeń regularnych, aby uzyskać liczby. Wypróbuj na http://jsfiddle.net/efc93986/1/ . Jeśli funkcje nie są dozwolone, samodzielny program o 52 bajtach:
Ponieważ ES6 działa obecnie tylko w przeglądarce Firefox, poniższy kod działa w każdej nowoczesnej przeglądarce o rozmiarze 70 bajtów:
źródło
1+
....?
zamiast/\d+ ?
. Spację po powrocie można pominąć. Ponadto, ponieważ nie określono konkretnego wejścia / wyjścia, powinieneś móc korzystać z funkcji.a-a[0]
zamiast1+a[1]-a[0]
powinien również działać.Python 2 - 33 bajty
Akceptuje dane wejściowe użytkownika rozdzielane przecinkami. Np. Wejście:
Wydajność:
Jeśli dane wyjściowe są wymagane, aby dokładnie pasować do przykładu, jest znacznie dłuższy. 47 bajtów:
źródło
input()
nie działa w moim interpretatorze Python 2.APL, 14
Wyjaśnienie
⎕
pobiera dane z ekranu. Wartości rozdzielone spacjami są analizowane jako tablica.{...}¨
dla każdej liczby wprowadź ją do funkcji.⍎¨⍕⍵
bierze argument, utwórz tablicę jego cyfr.--/
oblicza jednostki minus dziesiątki.10|
mod 10.źródło
J -
2015Forma nie-czasownikowa (jako instrukcja zamiast definicji funkcji) jest krótsza o 5 znaków:
Forma czasownika, która jest ładnym pociągiem :
Ten czasownik użyty na przykładowych danych wejściowych:
źródło
Haskell
6058Cyfry jednoznakowe, prawdziwy nemezis w grze w golfa w Haskell.
źródło
Perl:
3840Wydajność:
źródło
abs
nie jest konieczne;x - x/10
nie może być negatywne. 3. Jeśli używasz flag-040pe
(zwykle liczonych jako 5 bajtów) do iteracji po danych wejściowych rozdzielanych spacjami, możesz skrócić swój kod do$_=($_-int$_/10)%10
. 4. Jeśli wolisz unikać flag wiersza poleceń, nadal możesz zapisać kilka bajtów, ustawiając$/=$;
i usuwając wywołanie dosplit
.Rubin, 35 bajtów
Wyjaśnienie
Dane wejściowe są traktowane jako argumenty wiersza poleceń.
String#bytes
zwraca tablicę liczb całkowitych (kody znaków ASCII). Ważna jest tylko różnica między kodem ostatniego i pierwszego znaku, a nie same liczby całkowite.źródło
C # i LinqPad: 104
źródło
C ++ 118
źródło
#include<iostream>
istd::
przedcin
icout
. 2. Nie potrzebujesz warunkowego, jeśli pominiesza=a%10
. 3. Nie trzeba zmienneb
ic
tego, karetki i (z kilkoma modyfikacji) nawiasy wokół pętli.#include<iostream>
using namespace std;
PHP - 90 znaków
Pomyślałem, że wypróbuję kod golfa, więc oto moja pierwsza próba - prawdopodobnie można więcej.
58 znaków (dzięki uprzejmości Ismael Miguel)
Uzyskaj dostęp do pliku za pomocą
źródło
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
który ma 44 znaki. Dostęp z przeglądarki za pomocąfile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (nieprzetestowany kod)$_GET
ale wyświetla 57% 10 i potrzebuję (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Niestety ma on 65 bajtów. (zapomniałem$i
przyrostu na ostatnim) Lub możesz spróbować<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
uzyskać dostęp do przeglądarki, używającfile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
61 bajtów długości.$_GET['n']
. Zredagowałem moją odpowiedź.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
.%10
Jest bezużyteczny, a to po prostu wygląda lepiej. Możesz również uzyskać do niego dostęp za pomocąfile.php?n[]=xyxyxyxy
. To rozwiązanie ma długość 58 bajtów.Python 3, 60
Dane wejściowe i wyjściowe są dokładnie takie, jak określono, chociaż nie drukuje końcowego nowego wiersza. Dwie interesujące sztuczki tutaj: 1) zamiana dwóch wywołań na
int()
jedno wywołanie doeval()
, i 2) używanie,join()
aby uzyskaća-b
, a następnie negowanie tegob-a
w razie potrzeby. Na szczęście operator modulo Pythona podaje wartości dodatnie, nawet jeśli pierwszy argument jest ujemny!źródło
eval('-'.join(x))
sztuczka jest genialna.)