Convertir l'entrée en direction

15

Défi

Étant donné l'entrée sous la forme <n1>, <n2>où le nombre peut être -1, 0 ou 1, retournez la direction cardinale correspondante . Les nombres positifs se déplacent vers l'est sur l'axe des x et le sud sur l'axe des y, les nombres négatifs se déplacent vers l'ouest sur l'axe des x et le nord sur l'axe des y.

Sortie doit être sous la forme South East, North East, North. Il est sensible à la casse.

Si l'entrée est 0, 0, votre programme doit revenir That goes nowhere, silly!.

Exemple d'entrée / sortie:

1, 1 -> South East

0, 1 -> South

1, -1 -> North East

0, 0 -> That goes nowhere, silly!

C'est le , la réponse la plus courte en octets gagne.

Matias K
la source
Lâchement liés
HyperNeutrino
1
Quelques exemples avec W, NW et SW sont nécessaires.
seshoumara
@seshoumara Je suis sur mobile, donc pas de contre-choix, mais NW serait -1, -1
Matias K
1
Les espaces de fin sont-ils autorisés?
Arjun
Euh ... Bien sûr, je suppose. Tant qu'il a la même apparence.
Matias K

Réponses:

12

Japt , 55 51 octets

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

Explication

                      // 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

Essayez-le en ligne!

ETHproductions
la source
Hum ... je ... ??? Comment ça marche? Japt a-t-il des choses fantaisistes qui remplacent les paires de caractères communes?
HyperNeutrino
@HyperNeutrino Oui, Japt utilise la bibliothèque de compression shoco qui remplace les paires courantes de caractères minuscules par un seul octet.
ETHproductions
D'accord, c'est vraiment cool! J'examinerai cela, voir si je peux en faire usage.
HyperNeutrino
9

Python, 101 87 octets

Solution vraiment naïve.

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

Merci à @Lynn pour avoir économisé 14 octets! Modifications: l'utilisation de la méthode string.split allonge la durée; _; Et aussi, des indices négatifs existent en python.

HyperNeutrino
la source
5
Vous pouvez le réduire à 87 comme ceci:lambda x,y:('','South ','North ')[y]+('','East','West')[x]or'That goes nowhere, silly!'
Lynn
2
J'ai trouvé un bon moyen d'obtenir des indications, mais malheureusement, il ne semble pas que cela fonctionnera pour ce défi. Figured Je le partager de toute façon (peut - être quelqu'un rusée que je ne peux comprendre comment faire face à ses problèmes, comme lorsque x ou y = 0): lambda x,y:'North htuoS'[::x][:6]+'EastseW'[::y][:4]Edit: il est probable maintenant trop long, mais vous pouvez faire le second découpage en tranches [:6*x**2], de même pour la chaîne Est / Ouest, si vous pouvez contourner l'erreur lors du premier découpage.
cole
@Lynn lambda x,y:('North ','South ')[y+1]+('West','East')[x+1]or'That goes nowhere, silly!'est plus court de 2 octets
Dead Possum
@Lynn Oh, merci! (J'ai oublié les indices négatifs!)
HyperNeutrino
@DeadPossum Cela ne fonctionnera pas parce qu'il sera de retour South Eastpour (0, 0). Merci quand même!
HyperNeutrino
6

PHP, 101 octets

[,$b,$a]=$argv;echo$a|$b?[North,"",South][1+$a]." ".[West,"",East][1+$b]:"That goes nowhere, silly!";
Jörg Hülsermann
la source
Cela fait longtemps que je n'ai pas programmé en PHP, mais comment sait-il que le Nord, le Sud, l'Ouest et l'Est sont des chaînes sans guillemets autour d'eux? Est-ce à cause de la chaîne vide qui partage le même tableau? Si oui, cela signifie-t-il également que vous ne pouvez pas avoir un tableau avec différents types à la fois (comme un tableau avec une chaîne et un entier)?
Kevin Cruijssen
1
@KevinCruijssen North est une constante php.net/manual/en/language.constants.php Si la constante n'existe pas, elle sera interprétée comme une chaîne. Un tableau en PHP peut contenir différents types. les chaînes peuvent être spécifiées de quatre manières php.net/manual/en/language.types.string.php
Jörg Hülsermann
6

Perl 6 , 79 octets

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

Essayez-le

Étendu:

{ # 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
la source
6

JavaScript (ES6), 106 100 97 93 octets

C'est une approche très simple. Il se compose de quelques opérateurs ternaires imbriqués ensemble -

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

Cas de test

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
la source
a!=0peut être remplacé par juste a, car 0 est faux et toutes les autres valeurs sont vraies. En outre, la saisie de la syntaxe de curry est plus courte et l'approche du tableau est également plus courte.
Luke
@Luke Merci pour la suggestion! J'ai édité la réponse. Maintenant, je bat les solutions PHP et Python! Tout ça à cause de toi!!! Merci!
Arjun
Enregistrez un autre octet en faisant f=a=>b=>et en appelant la fonction comme f(1729)(1458); qui est ce currying syntaxque @Luke a mentionné.
Tom
Vous pouvez utiliser en toute sécurité a|bau lieu de a||b. En supposant que l'entrée se compose uniquement de -1, 0 ou 1 (ce qui n'est pas clair pour moi), vous pouvez remplacer a>0et b>0par ~aet ~b.
Arnauld
De plus, vous n'avez pas besoin de ces parenthèses: a?(...):""/b?(...):""
Arnauld
4

Lot, 156 octets

@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%

La forboucle agit comme une table de recherche pour filtrer lorsque le paramètre (éventuellement annulé) est égal à -1 et concaténer les mots correspondants. Si rien n'est sélectionné, le message stupide est imprimé à la place.

Neil
la source
4

JavaScript (ES6), 86 octets

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

Explication

Appelez-le avec currying syntax ( f(a)(b)). Cela utilise des indices de tableau. Si les deux aet bsont 0, le résultat est une chaîne vide falsifiée. Dans ce cas, la chaîne après le ||est retournée.

Essayez-le

Essayez tous les cas de test ici:

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)}`);
    }
}

Luc
la source
3

GNU sed , 100 + 1 (drapeau r) = 101 octets

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

De par sa conception, sed exécute le script autant de fois qu'il y a de lignes d'entrée, donc on peut faire tous les cas de test en une seule fois, si nécessaire. Le lien TIO ci-dessous fait exactement cela.

Essayez-le en ligne!

Explication:

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

L'espace de motif restant à la fin d'un cycle est imprimé implicitement.

seshoumara
la source
2

05AB1E , 48 45 43 octets

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

Essayez-le en ligne!

Explication

õ'†Ô'…´)                                       # 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
la source
2

Gelée , 40 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
2

Japt , 56 octets

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

Essayez-le en ligne! |Suite de tests

Explication:

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
la source
Astuce: 00est exactement le même que 0lorsque le chiffre supplémentaire est supprimé;)
ETHproductions
1
La deuxième meilleure solution mais pas de vote positif. Je vote pour toi.
Arjun
1

Rétine , 84 82 81 octets

1 octet enregistré grâce à @seshoumara pour avoir suggéré 0...?au lieu de0\w* ?

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

^$
That goes nowhere, silly!

Essayez-le en ligne!

Kritixi Lithos
la source
La sortie est incorrecte. OP veut que les nombres positifs déplacent S dans l'axe des y et les nombres négatifs pour déplacer N.
seshoumara
@seshoumara Droite, corrigé pour le même bytecount (juste eu à échanger Noret Sou)
Kritixi Lithos
D'accord. Vous pouvez également raser 1 octet en utilisant 0...?.
seshoumara
@seshoumara Merci pour le conseil :)
Kritixi Lithos
1

Swift 151 octets

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
la source
1

PHP, 95 octets.

Cela affiche simplement l'élément du tableau, et s'il n'y a rien, affiche simplement le message "par défaut".

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

Ceci est destiné à fonctionner avec le -rdrapeau, recevant les coordonnées comme 1er et 2e arguments.

Ismael Miguel
la source
1

C # , 95 102 octets


Golfé

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

Non golfé

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

Non lisible non lisible

// 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" : "" );

Code complet

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();
        }
    }
}

Communiqués

  • v1.1 -+ 7 bytes - Extrait enveloppé dans une fonction.
  • v1.0 -  95 bytes- Solution initiale.

Remarques

Je suis un fantôme, boo!

auhmaan
la source
1
C'est un extrait de code dont vous avez besoin pour l'envelopper dans une fonction, c'est-à-dire ajouter le (a,b)=>{...}bit
TheLethalCoder
Vous pouvez utiliser le curry pour enregistrer un octet a=>b=>, vous n'aurez peut-être pas besoin de ()autour de a|b, vous pourriez également utiliser des chaînes interpolées pour obtenir une chaîne mieux construite
TheLethalCoder
J'ai complètement oublié d'envelopper une fonction: S. Pour les ()alentours a|b, j'en ai besoin, sinon Operator '|' cannot be applied to operands of type 'int' and 'bool'. J'ai également essayé les chaînes interpolées, mais je n'ai pas donné grand-chose à cause des ""erreurs qui m'ont été commises.
auhmaan
1

Scala, 107 octets

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

Essayez-le en ligne

Pour l'utiliser, déclarez-le en tant que fonction et appelez-le:

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

Comment ça fonctionne

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
la source
1

C, 103 octets

f(a,b){printf("%s%s",b?b+1?"South ":"North ":"",a?a+1?"East":"West":b?"":"That goes nowhere, silly!");}
Steadybox
la source
0

Java 7, 130 octets

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];}

Explication:

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

Code de test:

Essayez-le ici.

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));
  }
}

Production:

South East
South 
North East
That goes nowhere, silly!
Kevin Cruijssen
la source
0

CJam , 68 octets

"
South 
North 

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

Essayez-le en ligne! ou vérifier tous les cas de test

Imprime un espace de fin sur [0 -1]ou [0 1]( Northou South).

Explication

"\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!"
Chat d'affaires
la source
0

Röda , 100 octets

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

Essayez-le en ligne!

Il s'agit d'une solution triviale, similaire à certaines autres réponses.

fergusq
la source