Wprowadzenie:
Holenderski BSN (BurgerServiceNummer) jest ważny, jeżeli jest zgodny z następującymi zasadami:
- Zawiera tylko cyfry.
- Długość powinna wynosić 8 lub 9.
- Kiedy cyfry są indeksowane jako
A
throughI
, wynik należy do sumy:9xA + 8xB + 7xC + 6xD + 5xE + 4xF + 3xG + 2xH + -1xI
(! UWAGA -1 zamiast 1) powinna być podzielna przez 11, a nie powinno być 0.
Wyzwanie:
Dane wejściowe: ciąg znaków lub tablica znaków reprezentująca BSN.
Wyjście: truthy lub falsey wynik czy wejście jest poprawnym BSN.
Zasady konkursu:
- Format wejściowy powinien być ciągiem znaków lub tablicą znaków. Nie wolno używać wewnętrznej tablicy cyfr lub liczby (być może ósemkowej). (Możesz jednak przekonwertować go na wewnętrzną tablicę cyfr, ale nie bezpośrednio jako argument).
- Pomimo powyższego ograniczenia można założyć, że wszystkie przypadki testowe będą zawierać jedną lub więcej cyfr (
[0-9]+
) - W odniesieniu do BSN o długości 8 zamiast 9 holenderska Wikipedia stwierdza, co następuje: „ W przypadku testu jedenastego i innych praktycznych zastosowań dodaje się zero wiodące, aby uzyskać liczbę o długości 9. ” ( źródło )
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Odpowiedzi dotyczą standardowe zasady , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
// Truthy test cases:
111222333
123456782
232262536
010464554
10464554
44016773
// Falsey test cases:
000000000
192837465
247594057
88888888
73
3112223342
000000012
code-golf
string
arithmetic
decision-problem
Kevin Cruijssen
źródło
źródło
A
się podany wzór?A
ona formułę (lub w zasadzie dodaje wiodącą0
długość 9, co daje taki sam wynik jak pominięcieA
).Odpowiedzi:
05AB1E ,
2321 bajtówWypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
DgL
naā
i0Ê
naĀ
. Wypróbuj online.JavaScript (ES6) 57
Dane wejściowe jako tablica znaków.
reduceRight
ratuje dzień!Test
źródło
reduceRight
odpowiedź!map()
, po prostu uświadomienie sobie, że twoja odpowiedź ma w rzeczywistości 57 bajtów :-)R
86 86bajtówEdycja: Podziękowania dla Jarko Dubbeldam za sugestię produktu kropkowego!
Odczytuje dane wejściowe ze standardowego wejścia i zapisuje jako tablicę / wektor znaków. Następnie przekonwertuj na liczbę, pomnóż przez wektor
9...2,-1
i sprawdź wszystkie warunki.źródło
x
jako wektor.if(l<9)x=c(0,x);s=sum(as.double(x)*c(9:2,-1))
można zamienićs=sum(as.double(x)*c(l:2,-1))
. Również suma iloczynu par dwóch wektorów jest równa ich pomnożeniu przez kropkę%*%
.JavaScript (ES6),
61605958 bajtówPobiera na wejściu tablicę znaków. Zwraca
false
/true
.Przypadki testowe
Pokaż fragment kodu
źródło
C,
1121019698104 bajtówDzięki @MartinEnder za zapisanie
53 bajtówpodczas naprawy mojego kodu!Zwraca 0, jeśli jest niepoprawne, 1, jeśli jest poprawne. Wypróbuj online!
źródło
61
nawet jeśli nie ma właściwej długości.R
957993 bajtówFunkcja bez nazwy, która przyjmuje ciąg znaków jako argument. Na początku zignorowałem wymóg posiadania łańcucha wejściowego zamiast liczby, ale to dobrze, ponieważ pozwala zaoszczędzić trochę bajtów podczas konwersji.
Nie jestem pewien, jak interpretować tablicę znaków, ale jeśli to oznacza, że możesz użyć wektora cyfr ciągów
"1" "2" "3" "4" etc
jako danych wejściowych, staje się on nieco krótszy nawet:Dzieli x na wektor numeryczny, a następnie dodaje 0, jeśli długość wynosi 8, a następnie oblicza iloczyn iloczynu wektora y i
c(9,8,7,6,5,4,3,2,-1)
. Sprawdza, czy wynik jest zarówno niezerowy, jak i podzielny przez 11.Zaoszczędzono 16 bajtów dzięki logice @Enigma, domyślnie dołączając 0 podczas tworzenia wektora
c(length(x):2,-1)
.Zapomniałem dodać czek dla długości 8/9, więc +14 bajtów :(
źródło
Perl, 58 bajtów (52 + 6)
Biegnij z
Dane wejściowe przekazywane
STDIN
:Stosowanie
Wyjścia
1
dla jako wartość truthy,0
albo nic o wartościach falsey.źródło
$r+=$_*(-1,2..9)[$i++]for reverse@F
. Ponadto-F -pe
(i dane wejściowe dostarczone bez końcowej nowej linii,echo -n
na przykład) są wystarczające (chyba że Twój Perl jest zbyt stary, w takim przypadku będziesz potrzebować-a
(ale w przypadku ostatnich Perli, sugeruje to-F
). Wreszcie, twój kod miał 70 bajtów długości , nie 52;)C ++ 14,
107106 bajtów-1 bajt dla
int
zamiastauto
w pętli for.Jako nienazwana lambda powraca poprzez parametr referencyjny. Wymaga wejścia
std::string
lub kontenera znaków , takich jakvector<char>
.Niegolfowane i użytkowanie:
źródło
Befunge, 72 bajty
Wypróbuj online!
Wyjaśnienie
źródło
MATL, 36 bajtów
Nie jest to najdłuższy program MATL, jaki kiedykolwiek napisałem , ale podoba mi się, jak
if
/else
wypowiedzi bardzo szybko stają się bardzo długie w językach golfowych. Wydaje mi się, że to rozwiązanie może nie być optymalne w MATL, ale na razie nie mogę go dalej optymalizować. Zastanawiam się nad użyciem gdzieś podwójnego 0 i być może zmniejszyszt
wszędzie.Wypróbuj online! Wyjaśnienie:
źródło
!U
zamiast48-
[a2:9]*
skutkuje mnożeniem nieelementowym, więc!
potrzebna byłaby kolejna , która zrównoważyłaby początkowe wzmocnienie.MATL , 26 bajtów
Wynikiem jest niepusty wektor kolumny, co jest prawdą, jeśli wszystkie jego wpisy są niezerowe .
Wypróbuj online!
Lub sprawdź wszystkie przypadki testowe z każdym wynikiem w innym wierszu.
Wyjaśnienie
Testuje to trzy warunki w następującej kolejności:
Rozważ dane wejściowe
'8925'
dla wyjaśnienia.;
jest separatorem wierszy dla macierzy.źródło
?
prawdopodobnie byłoby bardziej wydajne, ale nie mogłem wymyślić, jak skrócić długość 8 lub 9. Twój pomysłGn8-tg=
jest bardzo sprytny.!
?G
wypycha wektor kolumny i muszę go przetransponować, aby powtórzyć zg*
Haskell,
116112102 bajtówg
zlicza sumę użytą w jedenastu-proefh
, af
jednocześnie sprawdza poprawność długości i czy jedenaście-proef nie jest równe 0. Zwłaszcza kontrolef
zajmują dużo bajtów.EDYCJA: zaoszczędzono 10 bajtów dzięki Lynn i
div
zaokrąglając w dół.źródło
f x=div(length x)2==4&&g x>0&&h x
?Galaretka , 21 bajtów
TryItOnline! lub uruchom wszystkie przypadki testowe
Prawdziwe wartości zwracane są niezerowe (i są w rzeczywistości wielokrotnością 11 sum).
W jaki sposób?
źródło
Python 2, 102 bajty
źródło
Python 2, 96 bajtów
Pobiera ciąg jako dane wejściowe. Funkcja dodaje a
'0'
na początku łańcucha, czy tego potrzebuje, czy nie, i używa ujemnych wskaźników Pythona do dodawania elementów, zaczynając od końca łańcucha i pracując od początku do końca.-1xI
Jest traktowane oddzielnie, za pomocą drugiego wywołanieint()
. Nie mogłem wymyślić, jak tego uniknąć, nie kosztując więcej bajtów niż zaoszczędziłem.def g(s):u=7<len(s)<10and sum(x*int(('0'+s)[-x])for x in range(10))-2*int(s[-1]);print(u%11<1)*u
działałby równie dobrze, ponieważ dodawałby1
czasy,s[-1]
ale następnie odejmowałby go dwukrotnie, a także dodawałby0
czasy (coś), co oczywiście nie wpłynęłoby na sumę.źródło
Brain-Flak , 345 bajtów
Obejmuje +3 za
-a
Prawda to 1, Falsy ma 0 na szczycie stosu.
Wypróbuj online!
Jestem prawie pewien, że istnieje krótszy sposób na pomnożenie w pętli, ale jeszcze go nie znalazłem.
źródło
PowerShell v2 +, 96 bajtów
OK, przyznaję, to wygląda na kompletny bałagan. I tak jest. Ale, znosząc mnie, przejdziemy przez to.
Bierzemy dane wejściowe
$n
(jakochar
-array) i ustawiamy na wartość$i
równą8
minus wartość logiczną dla tego, czy jest w niej 8 elementów$n
. Oznacza to, że jeśli jest 8 pozycji, to$i
byłoby7
.Następna sekcja łączy obliczenia z naszą wydajnością. Pracując od środka, zapętlamy
$n
się$n|%{...}
. W każdej iteracji używamy pseudo-trójki, aby uzyskać jeden z dwóch wyników - albo-"$_"
albo(($i+1)*+"$_")
. Indeks opiera się na tym, czy$i
jest (0
czy nie, trafiliśmy na-1xI
przypadek z równania wyzwania), który jest dekrementowany po kolejnej rundzie. Wszystkie są zebrane w pareny i-join
razem z nimi+
. Na przykład z wkładem111222333
w tym momencie mielibyśmy9+8+7+12+10+8+9+6+-3
. To jest przesyłane doiex
(skrótInvoke-Expression
i podobne doeval
) przed zapisaniem w$b
. Następnie bierzemy to%11
i wykonujemy wartość logiczną!(...)
na tym (tj. jeśli więc można podzielić przez 11, ta część jest$true
). Jest to połączone z,-and$b
aby zapewnić, że$b
jest niezerowa. Ten wynik logiczny jest pozostawiany w potoku, a dane wyjściowe są niejawne.Przykłady
źródło
PHP
139128 bajtówNie można zmusić interfejsu CLI do po prostu odzwierciedlenia prawdy fałszu. Musiałem zrobić to w ten sposób. Jakieś pomysły?
128 bajtów: zmieniono „prawda” i „fałsz” na 1 i 0.
źródło
C #,
120115 bajtówPętla przechodzi przez to,
char[]
co otrzymuje jako dane wejściowe i zwraca true lub false:Fiddle: https://dotnetfiddle.net/3Kaxrt
Jestem pewien, że potrafię zeskrobać kilka bajtów, zwłaszcza w nieuporządkowanym miejscu
return
. Wszelkie pomysły mile widziane!Edycja: Zaoszczędzono 5 bajtów dzięki Kevinowi. Nie miałem pojęcia, że mógłbym użyć
&
zamiast&&
!źródło
r>0&&r%11==0&&l<10&&l>7
można grać w golfa dor>0&r%11<1&l<10&l>7
(&&
do&
ir%11==0
dor%11<1
). I-'0'
można grać w golfa-48
.PHP,
868584838279 bajtówUwaga: używa PHP 7.1 do ujemnych indeksów ciągów.
Uruchom tak:
Wersja dla PHP <7.1 (+10 bajtów)
Wyjaśnienie
Poprawki
"0"
zapisanego bajtu10000000
jest nieprawidłowy, nie trzeba go porównywaćgreater than or equals
,greater than
wystarczy zaoszczędzić bajt-R
aby$argn
udostępnićźródło
Java 8,
11598 bajtówDziwi mnie, że nikt jeszcze nie opublikował odpowiedzi w języku Java, więc oto jedna.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
Clojure, 114 bajtów
Cóż, to jest coś,
-
odejmuje resztę argumentów od pierwszego, aby obsłużyć specjalny przypadek wagi-1
. Ta funkcja zwracanil
dane wejściowe o niepoprawnej długości, ale wif
klauzulach działają one tak samo jakfalse
.(#{8 9}(count v))
zwraca,nil
jeśli długośćv
nie jest równa 8 lub 9.Przypadki testowe:
źródło
Perl 5 , 63 + 2 (
-F
) = 65 bajtówWypróbuj online!
źródło
Stax , 23 bajty
Uruchom i debuguj online!
Wyjaśnienie
Używa rozpakowanej wersji do wyjaśnienia.
źródło