Konwertuj dane wejściowe na kierunek

15

Wyzwanie

Biorąc pod uwagę dane wejściowe w postaci, <n1>, <n2>gdzie liczba może wynosić -1, 0 lub 1, zwraca odpowiedni kierunek kardynalny . Liczby dodatnie przesuwają się na wschód na osi x i południe na osi y, liczby ujemne przesuwają się na zachód na osi x i północ na osi y.

Wyjście musi być w formie South East, North East, North. Rozróżnia małe i wielkie litery.

Jeśli wartością wejściową jest 0, 0, twój program musi powrócić That goes nowhere, silly!.

Przykładowe dane wejściowe / wyjściowe:

1, 1 -> South East

0, 1 -> South

1, -1 -> North East

0, 0 -> That goes nowhere, silly!

To jest , wygrywa najkrótsza odpowiedź w bajtach.

Matias K
źródło
Luźno spokrewniony
HyperNeutrino
1
Potrzebne są niektóre przykłady z W, NW i SW.
seshoumara
@seshoumara Jestem na telefonie komórkowym, więc nie mam odwrotu, ale NW będzie wynosić -1, -1
Matias K
1
Czy dozwolone są spacje końcowe?
Arjun
Uhh ... Pewnie. Tak długo, jak wygląda tak samo.
Matias K

Odpowiedzi:

12

Japt , 55 51 bajtów

`
SÆ 
NÆ° `·gV +`
E†t
Wƒt`·gU ª`T•t goƒ Í2€e, Ðéy!

Wyjaśnienie

                      // Implicit: U, V = inputs
`\nSÆ \nNÆ° `       // Take the string "\nSouth \nNorth ".
·                     // Split it at newlines, giving ["", "South ", "North "].
gV                    // Get the item at index V. -1 corresponds to the last item.
+                     // Concatenate this with
`\nE†t\nWƒt`·gU       // the item at index U in ["", "East", "West"].
ª`T•t goƒ Í2€e, Ðéy!  // If the result is empty, instead take "That goes nowhere, silly!".
                      // Implicit: output result of last expression

Wypróbuj online!

ETHprodukcje
źródło
Um ... ja ... ??? Jak do diabła to działa? Czy Japt ma jakieś wymyślne rzeczy, które zastępują typowe pary postaci?
HyperNeutrino
@HyperNeutrino Tak, Japt używa biblioteki kompresji shoco, która zastępuje popularne pary małych liter jednym bajtem.
ETHprodukcje
Okej, to naprawdę fajne! Przyjrzę się temu i sprawdzę, czy mogę z tego skorzystać.
HyperNeutrino
9

Python, 101 87 bajtów

Naprawdę naiwne rozwiązanie.

lambda x,y:['','South ','North '][y]+['','West','East'][x]or'That goes nowhere, silly!'

Dzięki @Lynn za zapisanie 14 bajtów! Zmiany: użycie metody string.split wydłuża ją; _; Ponadto w Pythonie istnieją ujemne indeksy.

HyperNeutrino
źródło
5
Możesz go zmniejszyć do 87 w następujący sposób:lambda x,y:('','South ','North ')[y]+('','East','West')[x]or'That goes nowhere, silly!'
Lynn
2
Znalazłem dobry sposób na uzyskanie wskazówek, ale niestety nie wygląda na to, aby zadziałało w tym wyzwaniu. Pomyślałem, że i tak go podzielę (być może ktoś bardziej sprytny niż ja potrafię wymyślić, jak poradzić sobie z jego problemami, na przykład gdy x lub y = 0): lambda x,y:'North htuoS'[::x][:6]+'EastseW'[::y][:4]Edytuj: prawdopodobnie będzie teraz za długi, ale możesz zrobić drugie cięcie [:6*x**2], podobnie dla łańcucha Wschód / Zachód, jeśli można obejść błąd przy pierwszym krojeniu.
cole
@ Lynn lambda x,y:('North ','South ')[y+1]+('West','East')[x+1]or'That goes nowhere, silly!'jest krótszy o 2 bajty
Dead Possum
@Lynn Oh, dzięki! (Zapomniałem o indeksach ujemnych!)
HyperNeutrino
@DeadPossum która będzie działać, ponieważ będzie to powrót South Eastdo (0, 0). Ale dziękuję!
HyperNeutrino
6

PHP, 101 bajtów

[,$b,$a]=$argv;echo$a|$b?[North,"",South][1+$a]." ".[West,"",East][1+$b]:"That goes nowhere, silly!";
Jörg Hülsermann
źródło
Dawno nie programowałem w PHP, ale skąd wie, że Północ, Południe, Zachód i Wschód to ciągi bez podwójnych cudzysłowów? Czy to z powodu pustego ciągu, który dzieli tę samą tablicę? Jeśli tak, czy oznacza to również, że nie możesz mieć jednocześnie tablicy różnych typów (takiej jak tablica z ciągiem i liczbą całkowitą)?
Kevin Cruijssen
1
@KevinCruijssen North jest stałą php.net/manual/en/language.constants.php Jeśli stała nie istnieje, będzie interpretowana jako ciąg znaków. Tablica w PHP może zawierać różne typy. ciągi znaków można określić na cztery sposoby php.net/manual/en/language.types.string.php
Jörg Hülsermann
6

Perl 6 , 79 bajtów

{<<'' East South North West>>[$^y*2%5,$^x%5].trim||'That goes nowhere, silly!'}

Spróbuj

Rozszerzony:

{ # bare block lambda with placeholder parameters 「$x」 and 「$y」

  << '' East South North West >>\ # list of 5 strings
  [                               # index into that with:

    # use a calculation so that the results only match on 0
    $^y * 2 % 5, # (-1,0,1) => (3,0,2) # second parameter
    $^x % 5      # (-1,0,1) => (4,0,1) # first parameter

  ]
  .trim  # turn that list into a space separated string implicitly
         # and remove leading and trailing whitespace

  ||     # if that string is empty, use this instead
  'That goes nowhere, silly!'
}
Brad Gilbert b2gills
źródło
6

JavaScript (ES6), 106 100 97 93 bajtów

To bardzo proste podejście. Składa się z kilku zagnieżdżonych ze sobą operatorów trójskładnikowych -

f=a=>b=>a|b?(a?a>0?"South ":"North ":"")+(b?b>0?"East":"West":""):"That goes nowhere, silly!"

Przypadki testowe

f=a=>b=>a|b?(a?a>0?"South ":"North ":"")+(b?b>0?"East":"West":""):"That goes nowhere, silly!"

console.log(f(1729)(1458));
console.log(f(1729)(-1458));
console.log(f(-1729)(1458));
console.log(f(-1729)(-1458));
console.log(f(0)(1729));
console.log(f(0)(-1729));
console.log(f(1729)(0));
console.log(f(-1729)(0));

Arjun
źródło
a!=0można zastąpić przez just a, ponieważ 0 jest fałszem, a wszystkie inne wartości są prawdziwe. Również przyjmowanie danych wejściowych w składni curry jest krótsze, a podejście do macierzy jest również krótsze.
Łukasz
@Luke Dzięki za sugestię! Zredagowałem odpowiedź. Teraz biję rozwiązania PHP i Python! Wszystko przez ciebie!!! Dzięki!
Arjun
Zapisz kolejny bajt, wykonując f=a=>b=>i wywołując funkcję jak f(1729)(1458); o którym currying syntaxwspomniał @Luke.
Tom
Możesz bezpiecznie używać a|bzamiast a||b. Zakładając, że wejście składa się tylko z -1, 0 lub 1 (co jest jasne dla mnie), można zastąpić a>0i b>0z ~aa ~b.
Arnauld
Ponadto nie potrzebujesz tych nawiasów: a?(...):""/b?(...):""
Arnauld
4

Partia, 156 bajtów

@set s=
@for %%w in (North.%2 South.-%2 West.%1 East.-%1)do @if %%~xw==.-1 call set s=%%s%% %%~nw
@if "%s%"=="" set s= That goes nowhere, silly!
@echo%s%

forPętla działa jako tablicy przeglądowej do filtra, (możliwie zanegowany) Parametr ten jest równy 1, a złączenie pasujące słowa. Jeśli nic nie zostanie wybrane, zamiast tego zostanie wydrukowana głupia wiadomość.

Neil
źródło
4

JavaScript (ES6), 86 bajtów

a=>b=>["North ","","South "][b+1]+["West","","East"][a+1]||"That goes nowhere, silly!"

Wyjaśnienie

Wywołaj to za pomocą curry syntax ( f(a)(b)). To używa indeksów tablicowych. Jeśli oba ai bsą 0, wynik jest falsy pusty ciąg. W takim przypadku ciąg po|| zwracany jest .

Spróbuj

Wypróbuj wszystkie przypadki testowe tutaj:

let f=
a=>b=>["North ","","South "][b+1]+["West","","East"][a+1]||"That goes nowhere, silly!"

for (let i = -1; i < 2; i++) {
    for (let j = -1; j < 2; j++) {
        console.log(`${i}, ${j}: ${f(i)(j)}`);
    }
}

Łukasz
źródło
3

GNU sed , 100 + 1 (flaga r) = 101 bajtów

s:^-1:We:
s:^1:Ea:
s:-1:Nor:
s:1:Sou:
s:(.*),(.*):\2th \1st:
s:0...?::
/0/cThat goes nowhere, silly!

Z założenia sed wykonuje skrypt tyle razy, ile jest linii wejściowych, więc w razie potrzeby można wykonać wszystkie przypadki testowe za jednym razem. Poniższy link TIO właśnie to robi.

Wypróbuj online!

Wyjaśnienie:

s:^-1:We:                         # replace '-1' (n1) to 'We'
s:^1:Ea:                          # replace '1' (n1) to 'Ea'
s:-1:Nor:                         # replace '-1' (n2) to 'Nor'
s:1:Sou:                          # replace '1' (n2) to 'Sou'
s:(.*),(.*):\2th \1st:            # swap the two fields, add corresponding suffixes
s:0...?::                         # delete first field found that starts with '0'
/0/cThat goes nowhere, silly!     # if another field is found starting with '0',
                                  #print that text, delete pattern, end cycle now

Pozostała przestrzeń wzoru na końcu cyklu jest drukowana niejawnie.

seshoumara
źródło
2

05AB1E , 48 45 43 bajtów

õ'†Ô'…´)èUõ„ƒÞ „„¡ )èXJ™Dg_i“§µ—±æÙ,Ú¿!“'Tì

Wypróbuj online!

Wyjaśnienie

õ'†Ô'…´)                                       # push the list ['','east','west']
        èU                                     # index into this with first input
                                               # and store the result in X
          õ„ƒÞ „„¡ )                           # push the list ['','south ','north ']
                    èXJ                        # index into this with 2nd input
                                               # and join with the content of X
                       ™                       # convert to title-case
                        Dg_i                   # if the length is 0
                            “§µ—±æÙ,Ú¿!“       # push the string "hat goes nowhere, silly!"
                                        'Tì    # prepend "T"
Emigna
źródło
2

Galaretka , 40 bajtów

Ṛị"“¡ƘƓ“¡+9“»,“wµ“¡ḳ]“»Kt⁶ȯ“¬ɼ¬<¬O÷ƝḤẎ6»

Wypróbuj online!

Erik the Outgolfer
źródło
2

Japt , 56 bajtów

N¬¥0?`T•t goƒ Í2€e, Ðéy!`:` SÆ NÆ°`¸gV +S+` E†t Wƒt`¸gU

Wypróbuj online! | Pakiet testowy

Wyjaśnienie:

N¬¥0?`Tt go Í2e, Ðéy!`:` SÆ NÆ°`¸gV +S+` Et Wt`¸gU
Implicit U = First input
         V = Second input

N´0?`...`:` ...`qS gV +S+` ...`qS gU
N¬                                                     Join the input (0,0 → "00")
  ¥0                                                   check if input is roughly equal to 0. In JS, "00" == 0
    ?                                                  If yes:
      ...                                               Output "That goes nowhere, silly!". This is a compressed string
     `   `                                              Backticks are used to decompress strings
          :                                            Else:
           ` ...`                                       " South North" compressed
                 qS                                     Split on " " (" South North" → ["","South","North"])
                   gV                                   Return the string at index V
                     +S+                                +" "+ 
                        ` ...`                          " East West" compressed
                              qS gU                     Split on spaces and yield string at index U
Oliver
źródło
Podpowiedź: 00jest dokładnie taka sama 0, jak po usunięciu dodatkowej cyfry;)
ETHprodukcje
1
Drugie najlepsze rozwiązanie, ale bez aprobaty. Głosuję za tobą.
Arjun,
1

Retina , 84 82 81 bajtów

1 bajt zapisany dzięki @seshoumara za sugerowanie 0...?zamiast0\w* ?

(.+) (.+)
$2th $1st
^-1
Nor
^1
Sou
-1
We
1
Ea
0...?

^$
That goes nowhere, silly!

Wypróbuj online!

Kritixi Lithos
źródło
Dane wyjściowe są nieprawidłowe. PO chce liczby dodatnie przenieść S w liczbie od osi Y i ujemnych przejść N.
seshoumara
@seshoumara Racja, naprawiono to na tę samą liczbę bajtów (wystarczyło zamienić Nori Sou)
Kritixi Lithos
Dobrze. Możesz także ogolić 1 bajt za pomocą 0...?.
seshoumara
@seshoumara Dzięki za podpowiedź :)
Kritixi Lithos
1

Szybkie 151 bajtów

func d(x:Int,y:Int){x==0&&y==0 ? print("That goes nowhere, silly!") : print((y<0 ? "North " : y>0 ? "South " : "")+(x<0 ? "West" : x>0 ? "East" : ""))}
Stephen
źródło
1

PHP, 95 bajtów.

To po prostu wyświetla element tablicy, a jeśli nic nie ma, wyświetla tylko komunikat „domyślny”.

echo['North ','','South '][$argv[1]+1].[East,'',West][$argv[2]+1]?:'That goes nowhere, silly!';

Ma to działać z -rflagą, przyjmując współrzędne jako pierwszy i drugi argument.

Ismael Miguel
źródło
1

C # , 95 102 bajtów


Grał w golfa

(a,b)=>(a|b)==0?"That goes nowhere, silly!":(b<0?"North ":b>0?"South ":"")+(a<0?"West":a>0?"East":"");

Nie golfił

( a, b ) => ( a | b ) == 0
    ? "That goes nowhere, silly!"
    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
      ( a < 0 ? "West" : a > 0 ? "East" : "" );

Nieczytelny czytelny

// A bitwise OR is perfomed
( a, b ) => ( a | b ) == 0

    // If the result is 0, then the 0,0 text is returned
    ? "That goes nowhere, silly!"

    // Otherwise, checks against 'a' and 'b' to decide the cardinal direction.
    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
      ( a < 0 ? "West" : a > 0 ? "East" : "" );

Pełny kod

using System;

namespace Namespace {
    class Program {
        static void Main( string[] args ) {
            Func<Int32, Int32, String> f = ( a, b ) =>
                ( a | b ) == 0
                    ? "That goes nowhere, silly!"
                    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
                      ( a < 0 ? "West" : a > 0 ? "East" : "" );

            for( Int32 a = -1; a <= 1; a++ ) {
                for( Int32 b = -1; b <= 1; b++ ) {
                    Console.WriteLine( $"{a}, {b} = {f( a, b )}" );
                }
            }

            Console.ReadLine();
        }
    }
}

Wydawnictwa

  • v1.1 - + 7 bytes- Zawijany urywek do funkcji.
  • v1.0 -  95 bytes- Wstępne rozwiązanie.

Notatki

Jestem duchem, boo!

auhmaan
źródło
1
To jest fragment kodu, który musisz zawinąć w funkcję, tj. Dodać (a,b)=>{...}bit
TheLethalCoder
Możesz użyć curry, aby zapisać bajt a=>b=>, możesz nie potrzebować ()wokół niego a|b, możesz być w stanie użyć interpolowanych ciągów, aby również ładniej zbudować ciąg
TheLethalCoder
Całkowicie zapomniałem owinąć funkcję: S. Dla ()okolice a|b, robię to potrzebne, w przeciwnym razie Operator '|' cannot be applied to operands of type 'int' and 'bool'. Próbowałem również interpolowanych ciągów, ale nie dawałem wiele ze względu na ""błędy.
auhmaan
1

Scala, 107 bajtów

a=>b=>if((a|b)==0)"That goes nowhere, silly!"else Seq("North ","","South ")(b+1)+Seq("West","","East")(a+1)

Wypróbuj online

Aby użyć tego, zadeklaruj to jako funkcję i wywołaj:

val f:(Int=>Int=>String)=...
println(f(0)(0))

Jak to działa

a =>                                // create an lambda with a parameter a that returns
  b =>                              // a lambda with a parameter b
    if ( (a | b) == 0)                // if a and b are both 0
      "That goes nowhere, silly!"       // return this string
    else                              // else return
      Seq("North ","","South ")(b+1)    // index into this sequence
      +                                 // concat
      Seq("West","","East")(a+1)        // index into this sequence
corvus_192
źródło
1

C, 103 bajty

f(a,b){printf("%s%s",b?b+1?"South ":"North ":"",a?a+1?"East":"West":b?"":"That goes nowhere, silly!");}
Steadybox
źródło
0

Java 7, 130 bajtów

String c(int x,int y){return x==0&y==0?"That goes nowhere, silly!":"North xxSouth ".split("x")[y+1]+"WestxxEast".split("x")[x+1];}

Wyjaśnienie:

String c(int x, int y){               // Method with x and y integer parameters and String return-type
  return x==0&y==0 ?                  //  If both x and y are 0:
     "That goes nowhere, silly!"      //   Return "That goes nowhere, silly!"
    :                                 //  Else:
     "North xxSouth ".split("x"[y+1]  //   Get index y+1 from array ["North ","","South "] (0-indexed)
     + "WestxxEast".split("x")[x+1];  //   Plus index x+1 from array ["West","","East"] (0-indexed)
}                                     // End of method

Kod testowy:

Wypróbuj tutaj.

class M{
  static String c(int x,int y){return x==0&y==0?"That goes nowhere, silly!":"North xxSouth ".split("x")[y+1]+"WestxxEast".split("x")[x+1];}

  public static void main(String[] a){
    System.out.println(c(1, 1));
    System.out.println(c(0, 1));
    System.out.println(c(1, -1));
    System.out.println(c(0, 0));
  }
}

Wynik:

South East
South 
North East
That goes nowhere, silly!
Kevin Cruijssen
źródło
0

CJam , 68 bajtów

"
South 
North 

East
West"N/3/l~W%.=s_Q"That goes nowhere, silly!"?

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe

Drukuje jedno końcowe miejsce na [0 -1]lub [0 1]( Northlub South).

Wyjaśnienie

"\nSouth \nNorth \n\nEast\nWest"  e# Push this string
N/                                e# Split it by newlines
3/                                e# Split the result into 3-length subarrays,
                                  e#  gives [["" "South " "North "]["" "East" "West"]]
l~                                e# Read and eval a line of input
W%                                e# Reverse the co-ordinates
.=                                e# Vectorized get-element-at-index: accesses the element
                                  e#  from the first array at the index given by the 
                                  e#  y co-ordinate. Arrays are modular, so -1 is the last
                                  e#  element. Does the same with x on the other array.
s                                 e# Cast to string (joins the array with no separator)
_                                 e# Duplicate the string
Q"That goes nowhere, silly!"?     e# If it's non-empty, push an empty string. If its empty, 
                                  e#  push "That goes nowhere, silly!"
Business Cat
źródło
0

Röda , 100 bajtów

f a,b{["That goes nowhere, silly!"]if[a=b,a=0]else[["","South ","North "][b],["","East","West"][a]]}

Wypróbuj online!

To trywialne rozwiązanie, podobne do niektórych innych odpowiedzi.

fergusq
źródło