Jest to drugi z serii, trzeci to Dwie drogi rozbieżne w żółtym lesie (część 3)
Opiera się to na dwóch drogach podzielonych na żółte drewno (część 1) , które było moim wcześniejszym wyzwaniem. Został dość dobrze przyjęty, ale był również dość trywialny (odpowiedź Java w 52 bajtach!) Więc zrobiłem coś bardziej złożonego ...
Inspiracja
Wyzwanie to inspirowane jest słynnym wierszem Roberta Frosta „Droga nie podjęta”:
Dwie drogi rozchodziły się w żółtym lesie.
I przepraszam, że nie mogłem podróżować obaj
I być jednym podróżnikiem, długo stałem
I patrzyłem w dół jak najdalej,
do miejsca, gdzie zakręciło się w zaroślach;... przycięte 2 akapity ...
Będę opowiadać z westchnieniem
Gdzieś wieki wieków stąd:
Dwie drogi rozchyliły się w lesie, a ja -
wziąłem tę mniej uczęszczaną,
i to zrobiło różnicę.
Zauważ przedostatniej linii I took the one less traveled by,
. Twoim celem jest znalezienie drogi najmniej przejechanej w danych wejściowych ciągu. Musisz wyprowadzić jedną z 2 wartości, które różnią się od siebie, sygnalizując, w którą stronę należy skręcić, aby wybrać drogę mniej przejechaną. Gdy droga rozwidli się (szlak sześciokątów zmienia się na liczby), jesteś na skrzyżowaniu. Stamtąd będą 2 ścieżki złożone z cyfr. Ścieżka, której cyfry mają najniższą sumę, będzie drogą niezebraną. Pamiętaj, że niezebrana droga może mieć większą ścieżkę, ale niższą sumę ścieżki. Oto kilka przykładów / przypadków testowych z programu, który drukuje „w lewo” lub „w prawo” dla niezebranej ścieżki:
1 2
1 2
1 2
#
#
#
left (3 < 6)
1 2
2 2
1 1
#
#
#
left (4 < 5)
12 2
11 2
1 1
#
#
#
right (6 > 5)
99 989
99 89
99 99
99 99
#
#
#
#
left (72 < 79)
1111 1110
001 111
11 11
11 11
#
##
##
##
left (9 < 10) (Note: 1111 is interpreted as 1+1+1+1=4, not 1111=1111)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
Rzeczy do przyjęcia i zapamiętania
- Zawsze będą 2 ścieżki. Nie więcej nie mniej.
- Możesz pobierać dane ze STDIN jeden wiersz na raz, ciąg zawierający znaki LF lub ciąg zawierający dosłowny odwrotny ukośnik i n. Jeśli potrzebujesz danych wejściowych w jakikolwiek inny sposób, poproś o zgodę w komentarzach.
- Nie musisz się martwić o nieprawidłowe dane wejściowe lub powiązane ścieżki. Nie zostaną one nigdy wprowadzone do twojego programu / funkcji.
- Dane wejściowe mogą mieć dowolną długość, szerokość lub wysokość, mniejszą niż limit napisów w Twoim języku.
- W
#
tym samym wierszu nigdy nie będzie ani cyfr. - Wszystkie cyfry na ścieżce są dodatnimi liczbami całkowitymi od 0 do 9.
- Dozwolone jest wprowadzanie lub wyprowadzanie z końcowym znakiem nowej linii.
- Zobacz moją odpowiedź JS ES6 poniżej.
- Zawsze będzie co najmniej 1 spacja między 2 ścieżkami.
- 2 ścieżki zawsze będą miały tę samą wysokość dla każdej mapy, ale mogą być inne na innych mapach.
- Jeśli masz wątpliwości co do konkretnego przypadku testowego, powiedz mi.
- 1111 interpretuje się jako 1 + 1 + 1 + 1 = 4, a nie 1111 = 1111. Mapa to ciąg liczb jednocyfrowych, a nie liczb o dowolnej długości.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
- Standardowe luki zabronione
Jeśli masz jakieś pytania dotyczące tego wyzwania, zapytaj mnie w komentarzach i powodzenia!
źródło
$("div > h1").map(function(){return $(this).text()}).get().join("\n");
do konsoli!let answers = $('div > h1').map(function(){return $(this).clone().children(':not(a)').remove().end().text().replace(/\s+/g,' ').trim()}).get();answers.splice(0, 1);answers.join('\n');
Odpowiedzi:
05AB1E ,
2115 bajtówWyjścia 0 dla lewej i 1 dla prawej.
Wypróbuj online!
Wyjaśnienie
źródło
Siatkówka , 28 bajtów
Wypróbuj online!
Drukuje
0
dla lewej i1
prawej strony. Zakłada, że na liniach nie ma spacji końcowych.Wyjaśnienie
Konwertuj każdą cyfrę
N
na ciągN
jedności.Jedna linia (
%
), dopasuj kolejne (\G
) od końca (r
) i zamień każdą z nich-
(tj. Zmień prawą gałąź na-
s).Sortuj wszystkie znaki, aby wszystkie
-
s znajdowały się bezpośrednio przed wszystkimi1
.Wielokrotnie anuluj parę znaków
-
i1
.Spróbuj dopasować co najmniej jeden
1
(jeśli tak, na lewej ścieżce było więcej odważników).źródło
Python 2 ,
95898887 bajtówOto mój pierwszy krok w Pythonie. Zdecydowanie nie optymalny, ale przyzwoity początek.
Wypróbuj online!
źródło
"#"!=y
z"#"<y
Chip , 216 bajtów
Wypróbuj online!
Nieco większa niż odpowiedź na część 1 ...
Przegląd
Chip to język 2D inspirowany rzeczywistymi obwodami, który zajmuje się bitami składowymi każdego bajtu w strumieniu bajtów.
To rozwiązanie utrzymuje bieżącą sumę cyfr, które widzi, odwracając znak wejścia za każdym razem, gdy napotyka odcinek białych znaków, a następnie kończy na pierwszej
#
. Tak więc dla danych wejściowychDostajemy
1 + 1 - 1 - 2 + 2 - 2 + 1 - 1 = -1
. Znak wyniku jest podawany jako wynik, liczba ujemna daje wynik1
, a dodatnia to0
.Dlatego wynik
1
oznacza, że lewa ścieżka jest mniej zajęta, a0
oznacza prawą.Wyjaśnienie
Na wysokim poziomie działa to tak:
Główną przekątną z
@
elementami jest akumulator, o wydajności decydujea
u dołu. (Osiem par@
oznacza osiem bitów, ale najwyższy bit jest znakiem, więc to rozwiązanie może obsłużyć maksymalną różnicę +127 lub -128. Przepełnienie w połowie jest w porządku, o ile wrócimy przed zakończeniem.)Cztery linie, które zaczynają się jak
Ax]}#--
... odczytują dane wejściowe, aw przypadku cyfry, negują je (w razie potrzeby) i przekazują wartość do sumatorów.Pierwsze trzy linie decydują, czy patrzymy na cyfrę, czy sekwencję białych znaków, i sprawdzamy, czy cyfry należy zanegować.
Pozostałe elementy zaklinowane pod wejściami i elementy po prawej stronie obsługują warunek zakończenia i odwzorowują dane wyjściowe na ASCII (tak, że otrzymujemy znaki
'0'
lub'1'
zamiast wartości0x0
lub0x1
. To odwzorowanie ASCII nie wymagało żadnych dodatkowych bajtów, inaczej nie zrobiłbym tego zawarłem to.)źródło
JavaScript (ES6), 55 bajtów
Zakłada brak spacje na każdej linii, oraz wyjścia
true
dlaright
,false
dlaleft
. Sztuczka polega na dopasowaniu każdej cyfry na wejściu, a jeśli po tej samej linii jest spacja, odejmij ją od sumy; w przeciwnym razie dodaj go do całości. Jeśli końcowa suma jest mniejsza niż 0, właściwa droga jest tą, którą mniej przejechano i odwrotnie.Wypróbuj to:
źródło
x=
na początku, ponieważ wyrażenia nie są dozwolone, tylko funkcje przechowywane jako zmienne i całe programy.Python 3 ,
8594 bajtówWypróbuj online!
Pomstowanie! Nie przeczytałem problemu wystarczająco blisko. Dodano poprawkę (
''.join()
), ale kosztem 9 bajtów.źródło
Python 2, 78 bajtów
-1 bajt dzięki @math_junkie
Wypróbuj online
Drukuje
False
dla lewej ścieżki iTrue
dla prawejźródło
r=-r
zamiastr*=-1
zapisywać bajtSiatkówka , 180 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Pomyślałem, że wypróbuję również rozwiązanie tylko do wyrażenia regularnego (powyższe jest zwykłym wyrażeniem regularnym .NET, które pasuje tylko do danych wejściowych, w których należy podążać właściwą ścieżką, z wyjątkiem użycia
¶
jako skrótu\n
).Jest to denerwująco powtarzalne, ale dzieje się tak, gdy musisz traktować każdą możliwą cyfrę indywidualnie.
Rozwiązaniem jest dość proste zastosowanie grup bilansujących : najpierw sumujemy cyfry w lewej gałęzi, wypychając
N
przechwytywanie na stos3
dla każdej cyfryN
. Następnie staramy się dotrzeć do#
, wyskakując z3
N
czasów stosu dla każdej cyfryN
w prawej gałęzi. Jest to możliwe tylko wtedy, gdy suma cyfr w lewej gałęzi jest większa niż w prawej gałęzi (ponieważ nie można wyskoczyć z pustego stosu).źródło
[0-9]
dopasować wszystkie cyfry lub\d
?JavaScript (ES6),
106104 bajtóws
to funkcja, która powraca,true
jeśli droga nie jest zajęta po lewej stronie. Nie golfowany:źródło
PowerShell , 80 bajtów
Wypróbuj online!
(Po prostu piszczy pod odpowiedziami w języku Python.: D)
Wyjścia
True
dla lewej ścieżki iFalse
prawej ścieżki.Pobiera dane wejściowe jako ciąg wyznaczony za pomocą
`n
, który jest odpowiednikiem programu PowerShell „ciąg zawierający dosłowny odwrotny ukośnik i n” , lub jako dosłowny ciąg wielowierszowy. Następnie-split
włączamy to wejście\s
(białe znaki, w tym nowe wiersze) lub#
odfiltrowujemy wszystkie puste wyniki-ne''
, więc pozostaje nam tylko tablica cyfr. Te są wprowadzane do pętli|%{...}
.Przy każdej iteracji najpierw bierzemy bieżący element
$_
, rzutujemy go jakochar
tablicę,-join
razem ze znakiem plus+
i potokujemy doiex
(skrót odInvoke-Expression
i podobny doeval
). Jest to zapisane w,$i
więc właściwie podsumowujemy cyfry na tym konkretnym fragmencie ścieżki. Następnie używamy tego i jego ujemnego jako dwóch elementów tablicy($i, -$i)
, indeksowanych przez przerzucanie wartości logicznej tam iz powrotem. Oznacza to, że pierwsza iteracja przez tę pętlę, pierwszy fragment lewej ścieżki, do którego się indeksujemy-$i
; następnym razem weźmiemy$i
; i tak dalej. Są one kumulowane$a
z+=
.Na koniec oceniamy, czy
$a
jest-g
reatert
han0
. Jeśli tak, to prawa ścieżka miała większą sumę, w przeciwnym razie lewa ścieżka miała większą sumę. Ten wynik logiczny jest pozostawiany w potoku, a dane wyjściowe są niejawne.źródło
CJam ,
1918 bajtówWypróbuj online!
Drukuje
0
dla lewej i1
prawej strony.Wyjaśnienie
źródło
Mathematica,
8077 bajtówDzięki Martin Ender za oszczędność 3 bajtów!
Czysta funkcja przyjmująca ciąg znaków rozdzielany znakiem nowej linii jako dane wejściowe i powracająca
True
do wyboru lewej ścieżki,False
aby wybrać właściwą ścieżkę. Cholera, te długie nazwy poleceń Mathematica; to jest jak 10 żetonów.źródło
Pip ,
1918 bajtówPobiera dane wejściowe jako pojedynczy ciąg w wierszu polecenia (który będzie wymagał cytowania i zmiany znaczenia nowych linii, jeśli zostanie uruchomiony w rzeczywistym wierszu polecenia). Wyjścia
-1
dla lewej,1
dla prawej. Wypróbuj online!Wyjaśnienie
Pętle nad seriami cyfr, dodając sumy cyfr do sumy. Znak liczenia jest zamieniany za każdym razem, w wyniku czego wartości po lewej stronie są ujemne, a wartości po prawej są dodatnie. Następnie drukujemy znak końcowej sumy (
-1
lub1
).źródło
Haskell , 64 bajty
Wypróbuj online! Użycie: Funkcja anonimowa
(>0).f.words
przyjmuje jako argument ciąg oddzielony znakiem nowej linii i zwraca znakiFalse
lewy iTrue
prawej.Wyjaśnienie:
Biorąc pod uwagę wkład
że jest łańcuch
" 99 989\n 99 89\n 99 99\n #\n #\n #"
, a następniewords
usuwa wszystkie znaki nowej linii i spacje i zwraca listę pozostałych strun:["99","989","99","89","99","99","#","#","#"]
. Funkcjaf
przyjmuje dwa pierwsze elementya
ib
z tej listy i sprawdza, czya
jest ciąg cyfr, porównując go do strun „#”. (Ponieważ char'#'
jest mniejszy niż wszystkie cyfry znaków'0'
,'1'
... każdy łańcuch rozpoczynający się cyfrą będzie leksykograficznie większy niż"#"
.) Funkcjag
odwzorowuje każdy char w ciąg jego kod ASCII i zwraca ich sumę. Wf
stosujemy sięg
doa
ib
i obliczyćg a - g b
, która jest wartością lewej ścieżce minus wartości prawą i dodać go do wywołania rekurencyjnegof
do obsługi następujących wierszy. Jeśli lewa ścieżka jest częściej podróżowana, wynik zf
będzie ujemna, a poza tym dodatnia dla właściwej ścieżki, więc(>0)
sprawdza, czy wynik jest większy od zera.źródło
Python 3 , 84 bajtów
Ponieważ wszystkie obecne zgłoszenia Pythona są funkcjami, pomyślałem, że wrócę pełny program.
Drukuje,
True
jeśli lewa ścieżka jest mniej uczęszczana, wFalse
przeciwnym razie. Wypróbuj online!Dla każdego wiersza danych wejściowych podział na białe znaki, sumuje cyfry każdego wynikowego elementu i dodaje go do licznika, jednocześnie odwracając znak licznika na każdym kroku. Kontynuuje czytanie linii wejściowych, dopóki nie natrafi na jeden z
#
, w którym to momenciemap(int,n)
powstaje wyjątek i wychodzimy z pętli, drukując,True
czy suma jest dodatnia iFalse
inaczej.źródło
Partia, 169 bajtów
Drukuje
0
dla lewej,-1
dla prawej. Uwaga: odczytuje wiersze, dopóki nie znajdzie linii z#
, a następnie przestaje czytać. Różnica w sumach ścieżek jest ograniczona do 511 (dodaj 1 bajt, aby obsłużyć większe różnice). Nie więcej niż 9 cyfr w każdym rzędzie każdej ścieżki (obsługuje dowolną liczbę wierszy). Objaśnienie: Podprogram do obsługi cyfr, które należy dodać, a następnie przechodzi do obsługi dwóch pierwszych parametrów. Oznacza to, że wywołanie podprogramu z parametrami oraz cyframi lewymi i prawymi doda cyfry prawe i odejmie cyfry lewe. Ostatecznie wynik jest przesuwany, aby wyodrębnić znak.d
Podprogram ma dwa parametry: dodawanie lub odejmowanie oraz cyfry. Wyodrębnia ostatnią cyfrę modulo przez 10, a pozostałe cyfry dzieląc przez 10 i wywołuje się rekurencyjnie, podczas gdy pozostały jeszcze cyfry.c
Podprogram pobiera trzy parametry: czy dodać lub odjąć, cyfry, aby dodać lub odjąć, a kolejne cyfry dodać. To nazywad
c
-
źródło
Oktawa, 46 bajtów
Wypróbuj online! Funkcja, która pobiera tablicę znaków 2D
a
jako dane wejściowe.Wyjaśnienie:
źródło
Java 7,
219216 bajtówTym razem nieco dłuższy niż 52 bajty . ;)
I znowu wraca
false
na prawo itrue
na lewo.Wyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło