Używając najmniejszej liczby znaków Unicode, napisz funkcję, która akceptuje trzy parametry:
- Łączna liczba domino
n
th dotknięte domino- Przewróć kierunek dotkniętego domina (
0
lubL
w lewo1
lubR
w prawo)
Gdy domino zostanie obalone, musi również obalić pozostałe domino w tym samym kierunku.
Powinieneś wyprowadzać domino |
reprezentując domino stojące \
i /
reprezentując domino obalone odpowiednio po lewej i prawej stronie.
Przykłady
10, 5, 1
powinien wrócić ||||//////
6, 3, 0
powinien wrócić\\\|||
if(third_parameter)
zamiastif(third_paramter=='l')
Odpowiedzi:
Rubinowy, 38 (46) znaków
Ta funkcja przyjmuje kierunek jako liczbę całkowitą (
1
dla prawej,0
dla lewej). Funkcja, która pobiera ciąg, ma 8 znaków dłużej:Przykłady użycia:
źródło
Haskell, 70
zakładając, że jest typu kierunek , który ma konstruktorów R i L .
źródło
J -
3226 znakówJ nie może obsłużyć więcej niż dwóch argumentów bez użycia listy i nie może obsłużyć niejednorodnych list bez boksu. Zatem posiadanie danych wejściowych jako listy trzech liczb całkowitych jest idealne. Kolejność parametrów jest odwrotna do standardowej: 0 dla lewej lub 1 dla prawej, następnie pozycja, a następnie całkowita liczba domino. Powodem tego jest to, że J ostatecznie przejdzie przez nie od prawej do lewej.
Oto co się dzieje.
F`G/
zastosowane do listyx,y,z
ocenix F (y G z)
.y G z
konstruuje oba możliwe sposoby obalenia domina, a następnieF
używa,x
aby wybrać, który z nich ma zostać użyty.Poniżej znajduje się tam iz powrotem z J REPL, który wyjaśnia, w jaki sposób funkcja jest budowana razem: wcięte linie są wprowadzane do REPL, a odpowiedzi są wyrównane z lewym marginesem. Przypomnij sobie, że J ocenia dokładnie od prawej do lewej, chyba że istnieją pareny:
Kosztem kilku znaków możemy ustawić kolejność na standardową: wystarczy dołączyć
@|.
na końcu funkcji:Dostosowanie tego do pracy z argumentem ciągu dla kierunku byłoby jednak znacznie droższe.
źródło
/
także sposób, w jaki budujesz dwa wyjścia i wybierasz żądane. Wydaje mi się, że czuję, że brakuje mu uznania, na które zasługuje.PowerShell, 66
Prawdopodobnie ten sam pomysł wszyscy mieli.
źródło
Golfscript (44
53)Mój pierwszy w historii program Golfscript. Zajęło mi to znacznie więcej czasu, niż powinno i prawdopodobnie można to zrobić w mądrzejszy, bardziej zwięzły sposób (jestem pewien, że ktoś to udowodni :)):
Przykładowe dane wejściowe to
10 5 0
.Nie golfowany:
źródło
d
się0
/1
zamiast'l'
/'r'
co daje pewną krótszy kod. W przeciwnym razie, jeśli przechowujeszd'l'=
w zmiennej, oyu może użyć jej zamiast drugiego porównania zd
. W ramach tego terminux i j
można zapisać obie białe spacje, jeśli zamiast nazwy używa się niealfanumerycznej nazwy zmienneji
.'l'
/'r'
ponieważ w tym czasie nie widziałem jeszcze, że możemy swobodnie używać liczb całkowitych. Nie alfanumeryczna sztuczka jest zręczna, dzięki! Może zaktualizuję odpowiedź później.GolfScript,
2823 znakówArgumenty na szczycie stosu, spróbuj online :
źródło
Python - 45
52Wymaga to
1
dla prawej i0
lewej.Oto wersja, która trwa
r
il
prawidłowo, na 58 :Niektóre przykłady użycia ...
źródło
JS (ES6) -
7974726562dzięki @nderscore!
Trzeci parametr jest wartością logiczną (0: lewy / 1: prawy)
źródło
d=(a,b,c)=>"\\"[r="repeat"](!c&&a-b+1)+"|"[r](--b)+"/"[r](c&&a-b)
[r='repeat'][r]
15 znaków..repeat.repeat
14 znakówPython2 / 3 - 54
Ta ostatnia dodana reguła była całkiem niezła (0/1 zamiast „l” / „r”). Zrobił mój faktycznie mniejszy niż istniejące rozwiązanie python. 0 jest w lewo, 1 jest w prawo
źródło
Haskell , 42 bajty
Wypróbuj online!
Pobiera dane wejściowe jak w
(%) n k b
przypadkun
domina,k
przewrócone dominob
.Znajduje znak w każdej pozycji
c
, od1
don
, używając wyrażenia arytmetycznego do obliczenia indeksu znaku 0, 1 lub 2.Przypadki testowe wzięte stąd .
Haskell , 44 bajty
Wypróbuj online!
Ciekawa strategia, która okazała się nieco dłuższa. Generuje ciąg
"\\|/"<*[1..n]
zn
kolejnymi kopiami każdego symbolu, a następnie pobiera plasterekn
ciągłych znaków o ustalonej arytmetycznie pozycji początkowej.źródło
Python 2.7,
68 65 61 5958 znakówUżyj
d=1
dla lewej id=0
prawejUwaga: Dzięki @TheRare za dalsze granie w golfa.
źródło
d and'\\'...or'/'...
?('\\'...,'/'...)[d]
f=lambda a,p,d:('|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p))[d]
Also, I don't think your code works when falling left.
Czy możesz podać test, aby to udowodnić?JavaScript, 46 znaków
Wygląda na to, że oszustwo robi 0 = 1, a 1 = r, ale jest. Zmniejszyłem to z niewielką rekurencją.
edycja: brakowało oczywistej postaci
źródło
JavaScript (ES6) 61
63Edytować To było buggy - wstyd mnie.
Nie różni się tak bardzo od @xem, ale sam go znalazłem i jest krótszy. Parametr d wynosi 0/1 dla lewej / prawej
Przetestuj w konsoli Firefox
Wydajność
źródło
--p
?Perl,
6765 znakówPrzypisz pierwsze trzy parametry (suma, pozycja, kierunek jako liczba całkowita [0 w lewo, 1 w prawo]). Dodatki trafiają do eteru. Odejmij 1 od pozycji, jeśli zmierzamy w prawo, aby domino w pozycji X również zostało odwrócone.
źródło
$p--if$d
z$p-=$d
stracić dwa znaki :)Haskell , 57 bajtów
4 bajty zapisane dzięki tej wskazówce
Wypróbuj online!
Haskell ,
69616058 bajtówWypróbuj online!
Niezbyt złożona odpowiedź, ale bije obie z istniejących odpowiedzi Haskella.
źródło
R ,
75686157 bajtówAnonimowa funkcja. W razie zainteresowania opublikuję pełniejsze wyjaśnienie.
Wypróbuj online!
źródło
Haskell , 51 bajtów
a
= liczba domino,b
= indeks dotkniętego 1 na podstawie,c
= kierunek (0
jest lewy i1
prawy).Wypróbuj online!
źródło
(a#b)c= ...
.PHP - 64
Prosta pętla i echo postaci.
Generuje a
Notice: Undefined variable: i
, oto kolejna wersja wyciszająca błąd (65 znaków):Wersja bez żadnego błędu (69 znaków):
Inne funkcje w PHP:
sprintf
/printf
paddingwypełnianie przez
str_pad
/str_repeat
funkcjeUżywając obu
printf
istr_repeat
funkcjiźródło
Scala 75 znaków
źródło
CJam - 20
Główny kod znajduje się w drugim wierszu, pierwszy wiersz służy tylko do pobierania parametrów ze standardowego wejścia (w przeciwnym razie należy umieścić parametry w kodzie).
Wypróbuj na http://cjam.aditsu.net/
Przykłady:
Wyjaśnienie:
:X
przechowuje ostatni parametr (kierunek 0/1) w zmiennej X-
odejmuje X od pozycji przewrócenia, uzyskując długość pierwszej sekwencji znaków (nazwijmy to L)_
sprawia, że kopia L"\|"X=
pobiera znak do użycia w pierwszej kolejności:\
dla X = 0|
do x = 1*
powtarza się, że czasy postać Lo
drukuje łańcucha, usuwanie go ze stosu-
odejmuje L od liczby domina, uzyskując długość drugiej sekwencji znaków (Zawołajmy to R)"|/"X=
uzyskuje znak użyj dalej:|
dla X = 0 i/
dla X = 1*
powtarza ten znak R razyźródło
Common Lisp
Nie wygra to w golfa kodowego, ale podkreśla dyrektywę dotyczącą formatu uzasadnienia Common Lisp:
Arytmetyka nie jest zła:
n
jest całkowitą liczbą domino;p
jest pozycją pierwszego obalonego domina;d
jest albo,0
albo1
reprezentuje lewą i prawą (jak dozwolone w komentarzach) i jest używany jako indeks dox
;x
jest ciągiem\
,|
i/
. Łańcuch formatu używa dwóch (zagnieżdżonych) dyrektyw justowania, z których każda pozwala na dopełnianie znaku. A zatem:źródło
PHP, 89 znaków
Tylko dlatego, że kocham PHP.
EDYCJA: Poniższy kod robi to samo.
źródło
($i+1>$p)
. 2) Przepisanie wyrażenia trójskładnikowego w celu$d?($i+1<$p?'|':'/'):$i+1>$p?'|':'\\'
zapisania kolejnych 3 bajtów. Lub po prostu usuń==0
i odwróć wskazówki. 3)$i++<$a
Możesz usunąć$i++
warunek z posta i użyć$i
zamiast$i+1
(-6 bajtów). 4)$i=0
nie jest konieczne; ale--n
musisz usunąć powiadomienia (opcja ), jeśli je usuniesz (-4 bajty).J ,
23 2119 bajtówWypróbuj online!
Dane wejściowe to lista liczb całkowitych w standardowej kolejności.
źródło
05AB1E , 19 bajtów
Nadal mam wrażenie, że jest trochę długi, ale działa .. I lepszy niż początkowe 23 bajtowe rozwiązanie, które miałem z konstrukcją if-else, którą szybko upuściłem ..
Kolejność wejścia jest taki sam jak w wyzwaniu: długość całkowita, indeks,
1
/0
na lewo / prawo.Wypróbuj online lub sprawdź oba przypadki testowe .
Wyjaśnienie:
źródło
C ++ 181
źródło
return 0
odmain
.C(n)>>k>>p
byłoby zwarte, niżC(n)C(k)C(p)
nie? A gdyby definicja P () mogła sprecyzować argument, czy nie zapisałoby to znaków dla wszystkich cudzysłowów? A gdy porównasz p do „l” i „r”: 0 i 1 byłyby krótsze - w szczególności> 0 zamiast == 'r' i <1 zamiast == 'l' (zakładając, że dobrze jest używać liczb zamiast r / l - jeśli nie <<r 'jest nadal krótszy niż ==' l 'i>' l 'jest nadal krótszy niż ==' r ')PHP -
105,97, 96Przykładowe wyniki:
źródło
JavaScript,
8185 znakówPo raz pierwszy próbowałem codegolf, było fajnie dzięki :)
źródło
JavaScript - 85 znaków
1 = w lewo, 0 = w prawo
źródło
Clojure, 81 znaków
źródło
vb.net (~ 75c)
źródło