Czy Jimmy może powiesić się na linie?


18

Kolejne wyzwanie Jimmy'ego przez jego pierwotnego ojca. Zobacz inne piękne wyzwania .


Jak wszyscy wiecie, ostatnio widzimy wyzwania związane z Jimmy'm na platformach. Jimmy jest akrobatą, jak wspomniałem wcześniej, i ma inne sztuczki w rękawie.

Jedną z tych sztuczek jest zawieszenie na linach. Oto przykład liny, z której Jimmy mógłby powiesić:

            ||
            ||
            ||
            ||
            ||
            ||

Kiedy Jimmy wisi na linie, wygląda to tak:

            ||
            ||
           /o\
            ||
            ||
            ||

Może powiesić po lewej lub prawej stronie liny, więc to:

            ||
            ||
            ||
            /o\
            ||
            ||

jest również ważny. Ale nie może zawiesić tylko jednej części ciała, więc coś takiego:

            ||
            ||
            ||
          /o\|
            ||
            ||

jest nieważny. Zwróć uwagę, że gdy wisi na jednej części ciała, druga połowa liny jest widoczna, ponieważ Jimmy tego nie zakrywa.

Jimmy nie lubi też wisieć na dnie liny - to go przeraża - więc to:

            ||
            ||
            ||
            ||
            ||
            /o\

jest nieważny.

Wyzwanie

Weź udział w sytuacji Jimmy'ego, jak te powyżej, i wypowiedz, czy Jimmy zawiesi się na linie, czy nie, używając wartości prawdziwej lub fałszywej.

Specyfika

  • Napisz program, który pobiera dane wejściowe. Może to nastąpić przez funkcję lub dowolną inną odpowiednią metodę wprowadzania.

    1. Wkładem powinna być scena jednego Jimmy'ego i liny, jak na przykładzie powyżej.
  • Program powinien wypisać na konsolę prawdziwą lub fałszywą wartość na podstawie tego, czy Jimmy może zawiesić się na linie, czy też spadnie z niej odpowiednio.

  • Kryteria, które Jimmy może zawiesić na linie:

    1. Dwie jego części ciała są na linie.

    2. Nie ma go na dnie liny.

    3. Nie unosi się w powietrzu.

  • Możesz założyć, że lina będzie prosta, złożona z ||segmentów i będzie dłuższa niż jedna postać wysokości.

  • Możesz założyć jedną całą linę i jednego osobliwego Jimmy'ego na twojej scenie, nie więcej i nie mniej.

  • Możesz założyć, że na dole liny nie będzie żadnych nowych linii.

  • Przed liną i po niej musisz pokryć dowolną liczbę wiodących lub tylnych miejsc.

Przypadki testowe

           ||
           ||
           ||                 TRUTHY
           /o\
           ||
           ||


            ||
            ||
          /o\|                FALSY
            ||
            ||


        ||
       /o\                    TRUTHY
        ||


            ||
           /o\                FALSY


         /o\
          ||                  TRUTHY


            ||
            ||
       /o\  ||                FALSY
            ||
            ||

Punktacja

To jest , więc najniższy wynik w bajtach wygrywa po około tygodniu.

Tabela liderów

Możesz wyświetlić tabelę wyników dla tego postu, rozwijając widżet / fragment kodu poniżej. Aby Twój post znalazł się w rankingu, potrzebujesz nagłówka ( # header text) z następującymi informacjami:

  • Nazwa języka (zakończ go przecinkiem ,lub myślnikiem -), a następnie ...

  • Liczba bajtów, jako ostatnia liczba wyświetlana w nagłówku.

Na przykład JavaScript (ES6), 72 bytesjest poprawny, ale Fortran, 143 bytes (8-bit)jest nieprawidłowy, ponieważ liczba bajtów nie jest ostatnią liczbą w nagłówku (twoja odpowiedź zostanie rozpoznana jako 8 bajtów - nie wykorzystuj tego).

<!-- Run the snippet to see the leaderboard. Report any bugs to @ozewski on Github. -->    <iframe src="https://ozewski.github.io/ppcg-leaderboard/?id=187759" width="100%" height="100%" style="border:none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>


1
Czy lina zawsze będzie miała przed sobą taką samą liczbę pól, czy może się to różnić?
mprogrammer,

@Maxwell To może się różnić.
connectyourcharger

Czy możemy traktować dane wejściowe jako coś w rodzaju listy, gdzie każdy wiersz jest osobnym ciągiem, czy też musi to być pojedynczy ciąg?
mprogrammer,

19
Jimmy powinien naprawdę wziąć urlop
Luis Mendo

7
@LuisMendo Jimmy jest poświęcony temu, co robi!
connectyourcharger

Odpowiedzi:


13

Japt , 5 bajtów

Myślę, że to prawda; Pracuję od 16 godzin bez przerwy i ledwo znam swoje imię, więc nie byłbym zaskoczony, gdyby tak nie było!

Õø|io

Spróbuj

Õø|io     :Implicit input
Õ         :Transpose
 ø        :Contains?
  |io     :  "|" prepended with "o"

2
16 godzin? To jest poświęcenie!
connectyourcharger

2
Zaczekaj, więc zapisanie 5 bajtów zajęło Ci 16 godzin? ;-)
Cullub

Wygląda na to, że potrzebujesz przerwy (ta sama rada dotyczy małego Jimmy'ego!).
ihavenoidea

@connectyourcharger, nie, to moje życie! Poświęcenie odbywałoby się bez przerwy. Które zrobiłem!
Kudłaty

1
@ihavenoidea, Pfft! Wyśpię się po śmierci!
Kudłaty

22

Python 2 lub 3 ,  33  30 bajtów

-3 dzięki Maxwell

lambda l:'o'in map(max,l[:-1])

Nienazwana funkcja akceptująca listę linii

Wypróbuj online!

W jaki sposób?

Jimmy musi ukryć odcinek liny, który nie jest dolny.

lambda l:'o'in map(max,l[:-1])
lambda l:                      # a function taking l (the lines as strings)
                       l[:-1]  # strip off the last line
               map(max,      ) # maximum of each line (where '|'>'o'>'\'>'/'>' ')
         'o'in                 # was 'o' one of them? (hence Jimmy obscured all the rope)

Zaoszczędź trzy bajty:lambda l:'o'in map(max,l[:-1])
mprogrammer

Och, bardzo bystry - dzięki!
Jonathan Allan,

To bardzo sprytne użycie wartości ASCII. Ładny.
Pozew Fund Moniki z

16

Python 2, 28 bajtów

lambda x:"o', '|"in`zip(*x)`

Wypróbuj online!

Jak to działa? Pobiera dane wejściowe jako listę ciągów, a zip dołącza do ciągu. Jimmy pozostaje na linie, jeśli jest „|” poniżej „o”, więc ten kod łączy wszystkie wiersze i sprawdza, czy występuje „o”, a po nim „|”.

Kod z adnotacjami:

lambda x: # Creates an anonymous function that takes one argument
  "o', '|" # If this substring is in the zip object, then Jimmy's "o" is above a "|"
    in
    `    # Back quotes change the object into its string representation
    zip(*x)` # Joins the lines together

(Stara odpowiedź) Python 2 lub 3, 39 bajtów

lambda x:1-all("|"in i for i in x[:-1])

Funkcja, która przyjmuje dane wejściowe jako listę ciągów, przy czym każdy ciąg jest inną linią.

-11 bajtów dzięki xnor! -2 bajty dzięki Jonathanowi Allanowi!

Wypróbuj online! (Jeśli chcesz wypróbować więcej przypadków testowych, po prostu wstaw „.” Po każdym zestawie wierszy w polu wprowadzania.)

Jak to działa? Cóż, jeśli Jimmy jest w pełni na linie, to na tej linii nie będzie żadnych „|” postacie. Dlatego możemy sprawdzić każdą linię i jeśli znajdziemy ją bez „|” postaci, to wiemy, że Jimmy może pozostać na linie. Jimmy nie może jednak utrzymać się na dnie liny; dlatego nie uwzględniamy ostatniej linii w naszym czeku. Jeśli ostatnia linia jest tylko kolejną częścią liny, to nie będzie miało znaczenia, ponieważ nadal znajdziemy prawidłowy rząd wyżej, ale jeśli ostatnią linią jest ta z Jimmy, to nie znajdzie linii bez „|” gdziekolwiek, i zwróci False.


Czy możesz to zrobić bez sprawdzenia, czy linia ma znak „/”?
xnor

@xnor Yup! -11 bajtów
mprogrammer

1
Uratuj kilka takich osób:lambda x:1-all("|"in i for i in x[:-1])
Jonathan Allan

1
Ojej, byłeś szybszy :)
Daniil Tutubalin

1
@KlaymenDK Funkcja iteruje przez x [: - 1], a nie x. x [: -1] to wszystkie elementy listy oprócz ostatniego elementu, ponieważ w Pythonie można używać indeksów ujemnych. Dlatego (poprawnie) zwraca wynik fałszowania, jeśli Jimmy znajduje się na dole liny.
mprogrammer

8

Galaretka ,  9 7  6 bajtów

Ṗ<”|ṀẠ

Monadyczny link akceptujący listę linii

Wypróbuj online!

W jaki sposób?

Jimmy musi ukryć odcinek liny, który nie jest dolny.

Ṗ<”|ṀẠ - Main Link: list of lines of characters
Ṗ      - remove last line
  ”|   - pipe character
 <     - less than? (vectorises) - Note that all other characters are
    Ṁ  - maximum
     Ạ - all?

1
Czuję się dziwnie pisząc te wyzwania o Jimmies. Zaczyna ci się dziwnie, gdy wyobrażasz sobie wielu Jimmies wiszących na tej samej linie.
connectyourcharger

1
@connectyourcharger Foreshadowing?
minus siedem,

@negativeseven Ewentualnie. Rozważyłem już wiki społeczności meta do indeksowania wszystkich postów Jimmy'ego.
connectyourcharger

1
Dziewięć bajtów i jeszcze raz dowiadujemy się, jak ktoś może umrzeć.
IMustBeSomeone

1
Note that all other characters are [less than '|']”?
Erik the Outgolfer


5

pieprzenie mózgu, 79 64 bajtów

>>+<<,[----------[<]>>[.-]+<[>-]+[---------<-->]<[<]>>[-]<[>]<,]

Wypróbuj online!

Wysyła bajt 0x01 dla prawdy i nic dla fałszu.

Z: 0
A: input
B: 0
C: has no | been found on this line?

>>+<<                       initialize C to 1
,[                          loop over each char

  ----------                set A to 0 if input was \n
  [<]>>                     move to C if input was \n; B otherwise
  [                         if input was \n and C is true
    .-                      output 1
  ]

  +                         this will reinitialize C to 1 if input was \n
                            but also clobber B with 1 if it wasn't
                            now we have { 0   0   0  (1)} if input was \n;
                                        { 0   _  (1)  _ } otherwise
  <[>-]                     clear own cell if the one to the left is positive
                            this yields { 0   0  (0)  1 } and
                                        { 0   _  (0)  _ } as desired

  +[---------<-->]          set A to 0 if input was |
  <[<]>>                    move to C if input was |; B otherwise
  [-]                       zero out current cell: clears C if input was |
  <[>]<                     realign pointer onto A

,]                          break on end of input


4

05AB1E , 5 bajtów

Çü%àθ

Wypróbuj online!

Ç         # convert the input to a 2D array of codepoints
 ü%       # pairwise modulo (vectorized)
   à      # maximum (*not* vectorized, returns a single number)
    θ     # tail (last digit)

Jedynymi znakami, które mogą pojawić się na wejściu, są \o/ |odpowiednie punkty kodowe 92, 111, 47, 32, 124 (nie ma znaków nowej linii, ponieważ wybraliśmy wejście jako tablicę linii). Możliwe wyniki przez modulowanie dwóch z tych liczb to 0, 13, 15, 17, 19, 28, 30, 32, 45, 47, 92, 111. 111 jest największym z nich, a także jedynym, który kończy się na 1 , więc kod wyświetli prawdę, jeśli i tylko jeśli 111 jest na liście (tylko 1 jest prawdą w 05AB1E). 111 to 111 ( o)% 124 ( |), a więc występuje tylko wtedy, gdy na wejściu jest wartość opowyżej a |.


1
Bardzo fajnie z parami modulo.
Kevin Cruijssen



2

JavaScript, 39 33 bajtów

Dzięki @Daniil Tutubalin za grę w golfa z 2 bajtów

x=>!!x.match(/^( *)\/[^|]*\n/m)

To pasuje do każdej linii, która nie jest linią, na której pokazuje się jego lewe ramię i żadna z lin nie pokazuje.

Wypróbuj online!


Wygląda na to, że zawodzi, jeśli jest on na dnie liny
fəˈnɛtɪk

To powinno zawieść, jeśli on jest na dole, prawda? Ponieważ Jimmy upada, jeśli jest na dnie liny
programista

Mam na myśli to, że kiedy położyłem go na dnie liny, funkcja z jakiegoś powodu wróciła 1
fəˈnɛtɪk

Hm, nieważne.
mprogrammer,

1
Co /^ *.o. *\n/?
tsh

2

/// , 53 50 bajtów

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~.

Wypróbuj online!

Ponieważ nie ma innego sposobu na wejście w ///, jest on zakodowany na stałe:

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~<INPUT HERE>.

Wyjaśnienie:

Ogólne podejście polega na zastąpieniu Jimmy'ego jedną jednostką, a następnie usunięciu go ze wszystkich sytuacji, w których grozi mu niebezpieczeństwo. Jeśli przeżyje, zostanie wyrzucony. Jeśli nie, to nic nie jest. W ~kodzie są zamienniki //, które umożliwiają skrócenie kodu o 3 bajty. Pominięto je w objaśnieniu.

/{/\//
/}/\/\//

          {The top two lines allow me to leave comments without disturbing the code.}

/\/o\\/1/ {Replace Jimmy with a 1.}
/1 /1/    {Get rid of any spaces in front of Jimmy. This moves Jimmy towards the rope from the left.}
/ 1/1/    {Get rid of any spaces after Jimmy. This moves Jimmy towards the rope from the right.}

/|1//     {If Jimmy is touching the rope, remove him and the rope.}
/1|//     {This is based on the observation that in all cases where Jimmy is safe, there is no visible rope on his line.}


/|//      {Remove any remaining rope. If Jimmy was touching a rope, it's already too late for him.}
/1.//     {This handles the case where Jimmy is at the bottom of the rope (hence the period at the end).}


/ //      {The remaining lines clean up the output.}
/.//
/
//

           ||
           ||
           ||
           /o\
           ||.

Wypróbuj online!


2

Ruby 2.5.5, 22 bajty

->x{x.pop;!x.all? /\|/}

Oczekuje tablicy linii. Wymaga co najmniej wersji 2.5.5, ponieważ właśnie wtedy Array#all?(pattern)został dodany.

Ze względu na ograniczenia, że ​​wejście zawsze będzie prawidłową sceną Jimmy'ego i liny, sprowadza się do tego, czy którakolwiek z linii przed ostatnią linią ma zaciemnioną linę.




1

Siatkówka , 9 bajtów

m`^[^|]+^

Wypróbuj online!

Teraz nigdy wcześniej nie programowałem w Retinie, ale o ile wiem, to działa. Jest to wyrażenie regularne, które znajduje ciąg zawierający (1) początek danych wejściowych, (2) brak „|” znaki i (3) nowy wiersz.

Osoby bardziej zaznajomione z wyrażeniami regularnymi lub Retiną zachęcane są do oferowania sugestii. -2 bajty dzięki Neilowi!


Dwie alternatywy: 1) Usuń, \nponieważ nowa linia nie jest a, |a więc i tak będzie pasować, a ostatnia ^wystarcza, aby upewnić się, że faktycznie dopasowałeś nową linię. 2) Użyj pilcrowa zamiast \ni usuń końcowe ^(ponieważ zawsze tak jest po nowej linii w trybie multilinii).
Neil,


1

Befunge-98 (PyFunge) , 26 24 bajtów

]~:a-!#v_' `+
^_-3q#$<
@

Wypróbuj online!

Wyjście z kodem powrotu 3, jeśli \n napotkano, a ostatni wiersz zawierał 3 znaki spacji, w przeciwnym razie wychodzi z kodem powrotu 0 na EOF. Opiera się więc na ostatnim wierszu niezawierającym nowej linii.

Rozcięty

]~                     :a-!#v_                ' `+
 Read character,      Branch downwards if   Increment counter on 
 branch up (and        equal to 10 ('\n')   the stack if greater
 loop around) if                            than 32 (' ') and
 end of stream                              implicitly loop

^_-3q#$<                    <
 Return with code 3
 if counter is equal to 3,
 otherwise reset counter
 and return to beginning

@
 Return with exit
 code 0

1

05AB1E (starsza wersja) , 6 bajtów

ζJ„o|å

Port odpowiedzi Japt Shaggy'ego .

Wprowadź jako listę linii.

Wypróbuj online.

Wyjaśnienie:

ζ       # Zip/transpose the (implicit) strings in the input-list, with space as filler
        # (NOTE: zip/transpose doesn't work on string-list in the new version of 05AB1E,
        #  which is why we use the legacy version)
 J      # Join these zipped/transposed lines together to a single string
  o  # And check if it contains the string "o|"
        # (after which the result is output implicitly)


1

Wiąz 0,19, 68 bajtów

f r=List.any(not<<String.contains"|")(List.take((List.length r)-1)r)

Pobiera dane wejściowe jako listę linii. Pomijając ostatnią linię, sprawdza, czy nie ma '|'w niej żadnej linii - co oznacza, że ​​lina jest w pełni pokryta przez Jimmy'ego.

Zweryfikować wszystkie przypadki testowe tutaj .




0

Pyret, 79 bajtów

{(l):all2({(r,n):string-char-at(n,string-index-of(r,"o") == "|")},l,link(0,l))}

Oczekuje tablicy wierszy jako ciągów. Tworzy kopię, w link(0,l)której wszystkie rzędy przesunęły się o jeden. Przechodzi przez każdy wiersz ri ngdzie n jest rzędem poniżej r. Sprawdza, czy jeśli ciało Jimmy'ego "o"jest w jakiejś pozycji, to w rzędzie pod nim znajduje się rura (tj. Jimmy wisi na linie i nie ma go na dole).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.