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.



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!


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.


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!";

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!'
}

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


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.


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


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.


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"


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

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!


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" : ""))}

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.


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!


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

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

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!

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!"

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.