Как удержаться от дублирования переменной пути в csh

объявляют функцию, которая генерирует случайную точку для еды, как это

function getFood() {
  // get a random point
  let food = {
    x : Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit,
    y : Math.floor(Math.random()*((cvsH/unit)-1)+1)*unit
  }
  // check if this point is in the snake
  // loop through each point of the snake
  for(let i = 0; i < snake.length; i++) {
    // check if the current snake point equals the generated point
    if(snake[i].x == point.x && snake[i].y == point.x)
      // stop the loop and return getFood() to generate an other point
      return getFood()
  }
  return food
}

, и просто вызываем getFood () всякий раз, когда вы хотите получить позицию еды, которая не находится внутри змеи

[111 ]
9
задан LPL 7 October 2011 в 18:27
поделиться

7 ответов

можно использовать следующий сценарий Perl для сокращения путей дубликатов.


#!/usr/bin/perl
#
# ^^ ensure this is pointing to the correct location.
#
# Title:    SLimPath
# Author:   David "Shoe Lace" Pyke <eselle@users.sourceforge.net >
#   :   Tim Nelson 
# Purpose: To create a slim version of my envirnoment path so as to eliminate
#       duplicate entries and ensure that the "." path was last.
# Date Created: April 1st 1999
# Revision History:
#   01/04/99: initial tests.. didn't wok verywell at all
#       : retreived path throught '$ENV' call
#   07/04/99: After an email from Tim Nelson <wayland@ne.com.au> got it to
#         work.
#       : used 'push' to add to array
#       : used 'join' to create a delimited string from a list/array.
#   16/02/00: fixed cmd-line options to look/work better
#   25/02/00: made verbosity level-oriented
#
#

use Getopt::Std;

sub printlevel;

$initial_str = "";
$debug_mode = "";
$delim_chr = ":";
$opt_v = 1;

getopts("v:hd:l:e:s:");

OPTS: {
    $opt_h && do {
print "\n$0 [-v level] [-d level] [-l delim] ( -e varname | -s strname | -h )";
print "\nWhere:";
print "\n   -h  This help";
print "\n   -d  Debug level";
print "\n   -l  Delimiter (between path vars)";
print "\n   -e  Specify environment variable (NB: don't include \$ sign)";
print "\n   -s  String (ie. $0 -s \$PATH:/looser/bin/)";
print "\n   -v  Verbosity (0 = quiet, 1 = normal, 2 = verbose)";
print "\n";
        exit;
    };
    $opt_d && do {
        printlevel 1, "You selected debug level $opt_d\n";
        $debug_mode = $opt_d;
    };
    $opt_l && do {
        printlevel 1, "You are going to delimit the string with \"$opt_l\"\n";
        $delim_chr = $opt_l;
    };
    $opt_e && do {
        if($opt_s) { die "Cannot specify BOTH env var and string\n"; }
        printlevel 1, "Using Environment variable \"$opt_e\"\n";
        $initial_str = $ENV{$opt_e};
    };
    $opt_s && do {
        printlevel 1, "Using String \"$opt_s\"\n";
        $initial_str = $opt_s;
    };
}

if( ($#ARGV != 1) and !$opt_e and !$opt_s){
    die "Nothing to work with -- try $0 -h\n";
}

$what = shift @ARGV;
# Split path using the delimiter
@dirs = split(/$delim_chr/, $initial_str);

$dest;
@newpath = ();
LOOP: foreach (@dirs){
    # Ensure the directory exists and is a directory
    if(! -e ) { printlevel 1, "$_ does not exist\n"; next; }
    # If the directory is ., set $dot and go around again
    if($_ eq '.') { $dot = 1; next; }

#   if ($_ ne `realpath $_`){
#           printlevel 2, "$_ becomes ".`realpath $_`."\n";
#   }
    undef $dest;
    #$_=Stdlib::realpath($_,$dest);
    # Check for duplicates and dot path
    foreach $adir (@newpath) { if($_ eq $adir) { 
        printlevel 2, "Duplicate: $_\n";
        next LOOP; 
    }}

    push @newpath, $_;
}

# Join creates a string from a list/array delimited by the first expression
print join($delim_chr, @newpath) . ($dot ? $delim_chr.".\n" : "\n");

printlevel 1, "Thank you for using $0\n";
exit;

sub printlevel {
    my($level, $string) = @_;

    if($opt_v >= $level) {
        print STDERR $string;
    }
}

я надеюсь, что это полезно.

3
ответ дан 4 December 2019 в 07:15
поделиться

хорошо, не в csh, но это - то, как я добавляю $HOME/bin к своему пути в ударе...

case $PATH in
    *:$HOME/bin | *:$HOME/bin:* ) ;;
    *) export PATH=$PATH:$HOME/bin
esac

приправить по вкусу...

4
ответ дан 4 December 2019 в 07:15
поделиться

Я использовал следующий (Граница/Korn/POSIX/Bash) сценарий в течение большей части десятилетия:

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp $"
#
#   Print minimal version of $PATH, possibly removing some items

case $# in
0)  chop=""; path=${PATH:?};;
1)  chop=""; path=$1;;
2)  chop=$2; path=$1;;
*)  echo "Usage: `basename $0 .sh` [$PATH [remove:list]]" >&2
    exit 1;;
esac

# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN   {   # Sort out which path components to omit
            chop="'"$chop"'";
            if (chop != "") nr = split(chop, remove); else nr = 0;
            for (i = 1; i <= nr; i++)
                omit[remove[i]] = 1;
        }
{
    for (i = 1; i <= NF; i++)
    {
        x=$i;
        if (x == "") x = ".";
        if (omit[x] == 0 && path[x]++ == 0)
        {
            output = output pad x;
            pad = ":";
        }
    }
    print output;
}'

В оболочке Korn я использую:

export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/extra/bin)

Это оставляет меня с ПУТЕМ, содержащим новые и другие каталоги bin в передней стороне плюс одна копия каждого имени каталога в значении основного тракта, за исключением того, что старым и дополнительным каталогам bin удалили мусорное ведро.

Необходимо было бы адаптировать это к оболочке C (извините - но я - великий сторонник истин, изложенных при Программировании Оболочки C, Продуманном Вредный). Прежде всего, Вы не должны будете играть с разделителем двоеточия, таким образом, жизнь на самом деле легче.

2
ответ дан 4 December 2019 в 07:15
поделиться

Ну, если Вы не заботитесь о том, что приказывает, чтобы Ваши пути были в, Вы могли сделать что-то как:

set path=(`echo $path | tr ' ' '\n' | sort | uniq | tr '\n' ' '`)

Это отсортирует Ваши пути и удалит любые дополнительные пути, которые являются тем же. Если Вы имеете. в Вашем пути можно хотеть удалить его с grep-v и повторно добавить его в конце.

2
ответ дан 4 December 2019 в 07:15
поделиться

Вот длинная острота без сортировки:
установите путь = ( echo $path | tr ' ' '\n' | perl -e 'while (<>) { print $_ unless $s{$_}++; }' | tr '\n' ' ')

2
ответ дан 4 December 2019 в 07:15
поделиться

Я всегда устанавливал свой путь с нуля в .cshrc. Это, я начинаюсь с основным путем, чем-то как:

set path = (. ~/bin /bin /usr/bin /usr/ucb /usr/bin/X11)

(в зависимости от системы).

И затем сделайте:

set path = ($otherPath $path)

добавить больше материала

0
ответ дан 4 December 2019 в 07:15
поделиться

dr_peper,

Я обычно предпочитаю использовать возможности сценариев оболочки, в которой я живу. Делает ее более портативной. Итак, мне понравилось ваше решение с использованием сценариев csh. Я просто расширил его, чтобы он работал с каждым каталогом в localdirs, чтобы он работал на себя.

foreach dir ( $localdirs )
    echo ${path} | egrep -i "$dir" >& /dev/null
    if ($status != 0) then
        set path = ( $dir $path )
    endif
end
2
ответ дан 4 December 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: