Motosiklet dişli kontrolü!


36

Bazılarınız bir motosikletin kayar şeklini biliyor olabilirsiniz. Ama yapmayanlar için, Şuna benziyor

6

5

4

3

2

N-

1

Şimdi birkaç vites değiştirdikten sonra hangi viteste olduğumu bilmek istiyorum. Program tarafsız çalışmalıdır.

Örnek giriş:

V^^

Örnek çıktı:

2

Gördüğünüz gibi, bir kez N'den 1'e düşürdüm ve iki kez 2. vitese değiştirildim.

Bu bir kod golfü. Bayt cinsinden en kısa cevap kazanır.

Not: Giriş, herhangi bir 2 karakter olabilir. Yukarı ve aşağı için U ve D olabilir veya istediğiniz herhangi bir dize olması gerekir . 1. veya 6. vitese geçemezsiniz. Eğer 6'ncı sıradaysanız ve yine vites küçültüyorsanız, 6'da kalacak. İyi şanslar!


5
Bir dahaki sefere, lütfen ana
merkeze

1
@seshoumara sadece iki gereksinim bunun bir dize olması gerektiği ve sadece 2 karakter girebileceğinizdir. Böylece bir newline'ı karakter olarak kullanabilir. ama başka bir sebepten kullanırsanız, gerçekten umursamıyorum. Aklında ne olduğunu görmek ilginç olurdu. ancak neden böyle yaptığınızı açıklarsınız. GL!
Martijn Vissers

4
Bu 1 ve N arasında yarım adım vardiya dikkate almaz bir utanç 2 adet 1 N 2 3 sadece 2 N 1 N 2 3 gitmek edebilmek için düzgün olması değil, aynı zamanda gider var
Cort Ammon

2
@CortAmmon'a katılıyorum - 1 ile 2 arasında tek bir vardiya var. Nötrün olduğu yerde yarı vardiya var.
Džuris

2
tüm motosikletler böyle değişmez. Debriyajsız motosikletlerin çoğu N-1-2-3-4 (veya çok eski bazı araçlarda N-1-2-3) olarak değişir. 5 veya 6 dişli takımı yok ve yuvarlak bir dişli kullanıyorlar, yani 4 yaşındayken dişliyi
arttırıp

Yanıtlar:


15

JavaScript (ES6), 49 48 47 46 bayt

bekler:

  • 1 aşağı için
  • 7 yükselmek için
f=([c,...s],g=2)=>c?f(s,g-c&7||g):'1N'[--g]||g

Biçimlendi ve yorumlandı

f = (                   // f is a recursive function which takes:
  [c,                   // - c = next character in input string
      ...s],            // - s = remaining characters
  g = 2                 // - g = current gear, with default = neutral = 2
) =>                    //
  c ?                   // if there's still a character to process:
    f(                  //   do a recursive call with:
      s,                //     - the remaining characters
      g - c & 7 ||      //     - the updated gear if it is valid
      g                 //       or the previous gear if not
    )                   //
  :                     // else:
    '1N'[--g] ||        //   decrement g and output '1' for g = 0, 'N' for g = 1,
    g                   //   or simply the corresponding digit for other values

Dişliler aşağıdaki gibi haritalanır:

g MOD 8 = 0 1 2 3 4 5 6 7
          ---------------
gear    = X 1 N 2 3 4 5 6       (where 'X' is an invalid state)

Bu, şu andaki donanımın geçerliliğini kolayca kontrol etmemizi sağlar:

(g & 7) != 0

gösteri


7

05AB1E , 22 20 bayt

Îvy<+®‚Z5‚W}6LÀ'N¸ìè

Çevrimiçi deneyin!

açıklama

Î                      # push 0 (accumulator) and input
 v         }           # for each in input
  y<+                  # decrement current element and add to accumulator
     ®‚Z               # take maximum of current value and -1
        5‚W            # take minimum of current value and 5
            6L         # push the range [1 ... 6]
              À        # rotate left
               'N¸ì    # prepend the letter "N" producing the list [N, 2, 3, 4, 5, 6, 1]
                   è   # index into this list with the value produced by the loop

6

MATL, 32 28 23 bayt

@Luis sayesinde 5 bayt kaydedildi

'234561N'j!Uq[aA]&Ys0))

Bu çözüm, '2'vites büyütme ve vites '0'küçültme için kullanır .

MATL Online'da deneyin

açıklama

'234561N'   % Push the string literal to the stack
j           % Grab the input as a string
!U          % Convert the input to a numeric array based on the characters.
q           % Subtract 1 to turn '2' into 1 and '0' into -1
[aA]        % Push the array [-1 5] to the stack
&Ys         % Compute the cumulative sum using the array [-1, 5] as
            % the upper and lower limits at each point
0)          % Get the last value from the cumulative sum
)           % Use this to index into the initial string literal.
            % Implicitly display the result

@Lifeless Bir açıklama ile güncellendi
Suever

Çok hoş! dize neden 1n23456 veya 65432n1 yerine 234561N olduğunu sorabilir miyim? Ben de bir kusur buldum! Eğer vites değiştirmeye devam edersen 6. viteste kalmalı, ancak N
Martijn Vissers

1
Güzel! Cumsum limitleri hilesi bilmiyordum
B. Mehta

1
@ B.Mehta Me de! Luis bunu tavsiye etti
Suever

1
@ B.Mehta Ayrıca, MATL sohbet odasında bize katılmaktan çekinmeyin !
Suever

6

V , 20 , 15 bayt

:sil!î¬61énÀxVp

Çevrimiçi deneyin!

Giriş h(yukarı) ve l(aşağı) karakterlerden oluşan bir dizedir .

5 byte'lık tasarruf sağladığı ve bana hiç bilmediğim bir vim özelliğini öğrettiği için @ nmjcman'e teşekkürler!

Girdilerin sınırların dışına çıkmadığını varsayabilirsek, 9 bayt olacaktır:

¬61énÀxVp

Fakat ne yazık ki buna izin verilmiyor.

Açıklama:

:sil!           " If the cursor goes out of bounds, ignore it and continue
     î          " Run the following keystrokes as V code, rather than vimscript:
      ¬61       "   Insert the string "654321". This will leave the cursor on the '1'
         én     "   Insert an 'n'
           À    "   Run the first arg as V code. This will move left and right a bunch of times
            x   "   Delete whatever character we ended up on
             V  "   Select this whole line,
              p "   And replace it with the character we just deleted

2
Ayrıca, çevrimiçi deneyin! V sıkıştırma. Çok havalı.
nmjcman101

Aslında, bunun işe yaramadığını düşünüyorum çünkü 1/6 ya da altına
inmek

9 byte cevabına neden izin verilmiyor?
Albert Renshaw

@AlbertRenshaw 1. veya 6. vitese geçmeye kalkarsanız başarısız olur. Örneğin , çevrimiçi deneyin! çıkmalı n, değil 1.
DJMcMayhem

Oh, görüyorum ki, girişte her zaman geçerli olduğunu düşündüm, kaymayan karakterler. Geçersiz olsa bile yine de güzel bir cevap
Albert Renshaw 19

6

Java 7, 106 105 103 bayt

char c(String s){int r=1;for(int c:s.toCharArray())r+=c<99?1:-1;return"1N23456".charAt(r<0?0:r>6?6:r);}

Açıklama:

char c(String s){                // Method with String input and character return-type
  int r = 1;                     // Result-index (0-indexed and starting at 1)
  for(int c : s.toCharArray()){  // Loop over all characters in the input String
    r += c < 99 ?                //  If the current character is '^':
           1                     //   Raise the result-index by 1
         :                       //  If it is 'v' instead:
           -1;                   //   Decrease the result-index by 1
  }
  return "1N23456".charAt(       // Return the character based on the return-index:
           r < 0 ?               //  If the result-index is below 0
                  0              //   Use 0 instead
                 : r > 6 ?       //  Else-if the result-index is above 6
                          6      //   Use 6 instead
                         :       //  Else
                          r);    //   Use the result-index
}

Test kodu:

Burada dene.

class M{
  static char c(String s){int r=1;for(int c:s.toCharArray())r+=c<99?1:-1;return"1N23456".charAt(r<0?0:r>6?6:r);}

  public static void main(String[] a){
    System.out.println(c("v^^"));
    System.out.println(c("^^^^^^^^"));
    System.out.println(c("vvvv^^^vvvv"));
    System.out.println(c("^v^v^v^v"));
  }
}

Çıktı:

2
6
1
N

5

Haskell, 59 53 51 Bayt

("1N23456"!!).foldl(\l c->max 0$min 6$l+read[c]-1)1

0Aşağı ve 2yukarı için kullanır . Kullanım örneği:

(("1N23456"!!).foldl(\l c->max 0$min 6$l+read[c]-1)1) "0002"

6 bayt ayırdığınız için @xnor'a teşekkürler! Ayrıca, bir işlev adına veya paranteze ihtiyacım olmadığından ortaya çıktı ki 2 bayt daha var.


Giriş karakterlerini 0 ve 2 olarak alırsanız, yapabilirsiniz read[c]-2.
xnor

PPCG'ye Hoşgeldiniz! Anonim işlevler de iyi, bu yüzden gerek yok g=.
Laikoni

@Likonik onu parantez içine almak zorunda kaldım, değil mi? Bu, bayt sayısını değiştirmez, bu yüzden g=açık bırakacağımı düşündüm, çünkü daha net
user1472751

@ user1472751 Parene ihtiyacınız yok.
Esolanging Fruit

4

JavaScript (ES6), 48 58 bayt

s=>"1N23456"[[1,...s].reduce((a,b)=>a?a<6?+b?a+1:a-1:6:0)]

kullanım

Bir işleve atayın ve sonra çağırın. Giriş, 1yukarı 0kaydırma için a ve aşağı kaydırma için a içeren bir dizedir .

f=s=>"1N23456"[[1,...s].reduce((a,b)=>a?a<6?+b?++a:a--:6:0)]
f("011")
-> "2"
f("0")
-> "1"
f("01")
-> "N"

f (0) N değil 1 döndürür ... ve 6'dan 1'den aşağıya çıkarsanız kodunuz undef değerini döndürür
fəˈnɛtɪk

İyi yakalama. İki byte pahasına sabit
Luke

N (1'e kadar dişli, 1'de kalma dişli, N'e kadar dişli)f("001")
N'ye

Dönmemelisin. 6'dan kalkmışsa 6'da kalmalı ve 1'den aşağıdan kaldırılmışsa 1'de kalmalıdır. Ayrıca 1'den
aşağıya düştüğünüzde

4

PHP 7.1, 71 bayt

for(;$c=$argv[1][$i++];))$g=max(-1,min($g+=$c<=>X,5));echo N234561[$g];

kaymalar $g-1 5'e kadar birinci dişli için ofset negatif dizesini kullanır.
Çalıştır -nr, değişen dizge komut satırı argümanı


4

Jöle , 17 14 bayt

1;r2ị$¥/CỊ¡o”N

6Yukarı ve 0aşağı için kullanır .

Çevrimiçi deneyin!

Nasıl çalışır

1;r2ị$¥/CỊ¡o”N  Main link. Argument: s (string of 6's and 0's)

1;              Prepend a 1 (integer) to the string/character array s.
       /        Reduce the result by the following dyadic link.
                Let's call the arguments x and y.
      ¥           Create a dyadic chain of 2 links:
  r                 Construct the range [x, ..., y] (increasing or decreasing).
                    y will be a character, but 'r' casts both argument to int.
                    This is intended for use with floats, but it works just as well
                    when the argument is a digit.
     $              Create a monadic chain of two links:
   2ị                 Take the second element of the constructed range.
                  When y = 6 > x, this gives x + 1.
                  When y = 0 < x, this gives x - 1.
                  When y = x, the range is a singleton array, so this gives x.
          ¡     Conditional application:
         Ị        If the previous result is insignificant (0 or 1):
        C           Subtract it from 1.
                This swaps 0 and 1 without affecting the other potential outcomes.
           o”N  Logical OR with 'N', replacing 0 with that character.

2

Ruby, 58 bayt

->s{a=1;s.chars{|b|a-=[a<=>0,a<=>6][b<=>?v]};"1N23456"[a]}

Beklenen girdi bir vites küçültme için 'v' ve vites büyütme için '^'


2

JS işleme (değiştirilmiş) 121 bayt

var g="1N23456",a="",c=0; for(var i=0;i<a.length;i++){if(a[i]==="d"&&c>0){c--;}else if(c<6&&a[i]==="u"){c++;}}println(g[c]);

Ungolfed

var g=[1,"N",2,3,4,5,6],a="",c=0;
for(var i=0;i<a.length;i++)
{if(a[i]==="d"&&c>0)
{
    c--;

}else if(c<6&&a[i]==="u")
{
    c++;

}

}
println(g[c]);

Çevrimiçi deneyin!

İyi bildiğimden beri PJ'lerle gittim. Tek sorun sürüm I kullanımı olduğunu çok sıkı yazdınız. Parantez ve diğer pek çok numarayı bırakamam. Bu oldukça basit. Girdi değişkene girmeli ave küçük harf almalıdır u d. Program, dizenin sonuna gelinceye ve döngüsünün au veya d olup olmadığını görmek için kontrol ettiği her yinelemeye kadar döngüler. Eğer öyleyse ve denemeyecek ve "kaymaya" deneyebileceğiniz bir yer. Sonunda sonuçları basarım!


Sürümünüz üçlü operatörlere izin veriyorsa, if'lerinizi çok daha kısa bir şekilde yeniden yazabilirsiniz.
Bojidar Marinov

The input should go into the variable aSabit kodlanmış giriş kullanmak varsayılan giriş yöntemi değildir, buraya bakın .
Laikoni

@Likonik gerçekten mi? Bu aptalca. Daha iyi bir yolum yok. Bunu tekrar yapmak zorunda kalırsam, bu ~ 100 byte daha uzun olacak
Christopher

Kodunuzu sadece bir fonksiyona saramaz mısınız? Örneğin. void f(String[] a){...}Bu neredeyse 100 bayt değil.
Laikoni

@Likonik Khan Academy ProcessingJS'de saf JS'dir ve bu nedenle String veya geçersizdir. Ama haklısın, bir işlev çok daha kısa olurdu
Kritixi Lithos

2

k, 25 bayt

"1N23456"@{6&0|x+y-92}/1,

Girdiyi bir dizge olarak alır ve [vites küçültme ve ]vites büyütme için kullanır , çünkü bunlar uygun bir konumdadır.

"1N23456"@                / the numbers 0 to 6 are used for the gears,
                          / this turns them into the correct number/letter
                       1, / prepend 1 because this is our initial gear
          {          }/   / fold the function through the list
                          / x is before, y is the next character
                 y-92     / subtract 92, which is between "[" and "]"
                          / "[" becomes -1 and "]" becomes 1
               x+         / add it to what we had before
           6&0|           / use max and min to set boundaries 6 and 0

Örnekler:

 shift:"1N23456"@{6&0|x+y-92}/1,
 shift"[]]"
"2"
 shift"]]]]]]]]"
"6"
 shift"[[[[]]][[[["
"1"
 shift"[][][][]"
"N"
 shift"[[[[[[[[]"
"N"
 shift"]]]]]]]]["
"5"

2

GNU sed , 89 87 + 1 (r bayrağı) = 88 bayt

Sed'nin tamsayı türleri veya aritmetik işlemleri olmadığından, çözüme yalnızca normal ifadeler kullanarak ulaşılır.

s:$:65432Nx1:
:
/6x/!s:^U(.*)(.)x:\1x\2:
s:^D(.*)x(.):\1\2x:
t
s:U|D::
t
s:.*(.)x.*:\1:

İşaretçiyi x, her hücreye kaymaya, sola ( Up için) veya sağa ( Dkendi için), yalnızca hücreleri içeren bir sarma bandı boyunca kaydırarak çalışır 65432N1. Sonundaki cevap, işaretçinin solundaki hücrede bulunan değerdir.

Örnek çalıştırma: veya Çevrimiçi deneyin!

sed -rf gear.sed <<< "UUUUUUD"
5

Açıklama:

s:$:65432Nx1:              # assign initial tape and pointer
:                          # start loop
/6x/!s:^U(.*)(.)x:\1x\2:   # if shift 'U', slide `x` to left, but not past the edge
s:^D(.*)x(.):\1\2x:        # if shift 'D', slide `x` to right, -||-
t                          # repeat
s:U|D::                    # if a shift couldn't be applied, delete it "manually",
t                          # and jump to the start of the loop again
s:.*(.)x.*:\1:             # print value left of pointer `x` (answer)

İşte 76 bayt , ancak tekdüze çıktılar.
Riley,

Tabii @Riley Unary! Çözümünüz farklı, öyleyse neden göndermiyorsunuz?
seshoumara

Seninki bana ilham verdi. İstersen kullanmana izin vereceğimi düşündüm.
Riley,

@Riley O zaman sürümünle ayrı bir bölüm yapacağım ve sana kredi vereceğim.
seshoumara

Sadece kendimden gönderirim :)
Riley

2

GNU sed , 76 73 bayt

İçin +1 içerir -r

s/$/1/
:
/1{6}/!s/^U(.*)/\11/
s/^D(.*)1/\1/
t
s/U|D//
t
s/^1$/N/
s/^$/1/

Çıktı hala nötr dışında, aynı durumda N( bu fikir birliğine bakınız ).

Çevrimiçi deneyin!

Bu temelde birleşik olarak yukarı ve aşağı sayar, sonra 1'den N'ye ve 0'dan 1'e dönüştürür.

s/$/1/               # add 1 to the end (the starting value)
:                    # loop start
/1{6}/!s/^U(.*)/\11/ # If the string starts with 'U' and doesn't have 6 ones, increment
s/^D(.*)1/\1/        # If the string starts with 'D' decrement (but not past 0)
t                    # if something changed loop back
s/U|D//              # if the U or D couldn't be applied, remove it.
t                    # if something changed loop back
s/^1$/N/             # replace 1 with N
s/^$/1/              # if "0", replace with 1

Sed sürümünüz 4 byte daha kısa olabilir bence, 1başlangıç ​​değeri olarak çalışıyorsanız, gibi Nve hiçbir şey olarak 1. s/$/1/;:;/1{6}/!s/^U(.*)/\11/;s/^D(.*)1/\1/;t;s/U|D//;t;s/^1$/N/;s/^$/1/
seshoumara

2

Rebol, 96 93 bayt

f: func[s][g: next"1N23456"parse s[any["D"(g: back g)|"U"(unless tail? x: next g[g: x])]]g/1]

Ungolfed:

f: func [s] [
    g: next "1N23456"
    parse s [
        any [
              "D" (g: back g)
            | "U" (unless tail? x: next g [g: x])
        ]
    ]
    g/1
]

Örnek kullanım (Rebol konsolunda):

>> print f "DUU"         
2

>> print f "DDDUU"
2

>> print f "UUUUUUUUU"  
6

>> print f "UUUUUUUUUD"
5

2

> <> , 35 bayt

Hız sınırını aşmanızı teşvik eden coşkulu bir kod parçası.

Örneğin Kodu, modülo 3 0 ve 2 olan bir iki girişi, kabul eder 0ve 2.
Ekstra fishiness için, ben kullanılmasını tavsiye <ve >.

1i:0(?;3%1-+:0(?0:6)?6:1go!
1N23456

Açıklama:

1i:0(?;3%1-+:0(?0:6)?6:1go!
1                             # initial position
 i                            # read the next char
  :0(?;                       # copies it, test copy against 0, if lower stops (EOF detection)
       3%1-                   # map the char to -1 or 1
           +                  # add it to the position
            :0(?0             # if the new position is lower than 0, set to 0
                 :6)?6        # if the new position is greater than 6, set to 6
                      :1go    # output a character from line 1 at the position
                          !   # loops and skip the position initialisation

Sen edebilirsiniz burada deneyin !


1

SpecBAS - 102

1 g=2: INPUT s$
2 FOR i=1 TO LEN s$
3 g+=(s$(i)="^" AND g<7)-(s$(i)="v" AND g>1)
4 NEXT i
5  ?"1N23456"(g)

Girdiye bağlı olarak dizenin dizinini hareket ettirir ve ilgili karakteri yazdırır.


1

Pyth, 32 bayt

J1VQ=JhtS[06+J-qNbqNd;?qJ1\N?JJ1

Aşağı ve yukarı için boşluk ve yeni satır kullanır.

açıklama

J1VQ=JhtS[06+J-qNbqNd;?qJ1\N?JJ1
J1                                 Initialize J to 1
  VQ                 ;             For each character in the input
            +J-qNbqNd              Increment or decrement J
      htS[06                       Get the middle sorted value of [0,6,J]
    =J                             Assign it to J
                      ?qJ1\N?JJ1   Change 1 to 'N' and 0 to 1

Artış ve çıktı yapmak için kesinlikle daha iyi bir yol var.


1

CJam , 24 22 bayt

"1N23456"1q{~0e>6e<}/=

(Aşağı ve )yukarı için kullanır .

Çevrimiçi deneyin!

açıklama

"1N23456"               e# Push the string containing all gears
         1              e# Push 1, the initial index
          q             e# Push the input
           {            e# For each character in the input
            ~           e#   Eval that character. ( is decrement and ) is increment.
             0e>        e#   Take the maximum of (0, index)
                6e<     e#   Take the minimum of (6, index)
                   }/   e# (end of block)
                     =  e# Take that index of the string

1

Toplu iş, 144 bayt

@set/ps=
@set g=1
:l
@if %g% neq %s:~,1% set/ag+=%s:~,1%/3-1
@set s=%s:~1%
@if not "%s%"=="" goto l
@if %g%==1 (echo N)else cmd/cset/ag+!g

Daha 0düşük bir vitese 6geçmek ve daha yüksek bir vitese geçmek için STDIN'e giriş yapar . Bu sayılar mevcut vitesi göz ardı etmeyi kolaylaştırmak için seçildi. Son olarak, eğer dişli daha 1sonra basılırsa, Naksi takdirde 0dönüştürülür 1ve dişli yazdırılır.


0

Javascript ES6 nonstrict, 136 120 karakter

136 karakter V^

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})f=s=>eval(s.replace(/(V)|./g,(m,v)=>`x${"-+"[+!v]}=1,`,y=1)+'"1N"[x]||x')

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})
f=s=>eval(s.replace(/(V)|./g,(m,v)=>`x${"-+"[+!v]}=1,`,y=1)+'"1N"[x]||x')
console.log(f("V^^"))

İçin 120 karakter -+

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})f=s=>eval(s.replace(/./g,m=>`x${m}=1,`,y=1)+'"1N"[x]||x')

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})
f=s=>eval(s.replace(/./g,m=>`x${m}=1,`,y=1)+'"1N"[x]||x')
console.log(f("-++"))


0

Retina , 65 bayt

^
1 N23456
+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
 $1$2
.* (.).*
$1

Kullanır uve dyukarı ve aşağı.

Çevrimiçi deneyin!

açıklama

Bu program 1N23456komutların sırasını geride tutarak çalışır . Arkasında bir boşluk bırakarak mevcut dişliyi takip eder. Sonra bir daha bir şey olmaz, bir daha bitene kadar.

^
1 N23456

Girişten 1 N23456önce koyarak başlayın . Önündeki boşluk , o anki dişli Nolduğunu gösterir N.


+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
 $1$2

Bunlar iki değiştirme aşamasıdır, birlikte gruplandırılmış ve dizeyi değiştirmeyi bırakana kadar devam eder:

 (.)?(\w*6)u
$1 $2

İlki, vitesi yukarı kaydırırken işler. Boşluktan sonra herhangi bir sayıda vites arayacak, ardından a 6, ardından takip edecektir u( uvites yükseltme talimatını gösterir). 6'dan önce karakterler varsa, boşluktan hemen sonra karakterin bulunduğu alanı değiştirir, siler uve dizenin geri kalanını bozulmadan bırakır. Yana 6maçında zorunludur, sadece daha önce herhangi bir karakter boşluk takas edecek 6. Asla değişmeyecek 6.

(.)? (\w*6)d
 $1$2

İkinci kademe, vitese geçişi gerçekleştirir ve benzer şekilde çalışır. İsteğe bağlı olarak boşluktan önce bir karakter arar, ardından bittikten sonra diğer bazı dişliler 6ve onu takip eder d. Boşluktan önce karakteriyle değiştirir, siler dve gerisini sağlam bırakır. Boşluk dize başındaysa, boşluktan önce bir karakterle eşleşme olmadığından takas oluşmaz.


.* (.).*
$1

Yukarıdaki değişikliklerin hiçbiri artık yapılamadığında, tüm vites değişimleri tamamlanmıştır. Satır, boşluktan hemen sonra dişli hariç her şeyden temizlenir. Bu son vites.


0

Powershell, 112 87 85 bayt

$i=1;switch([char[]]$args[0]){'^'{if(5-gt$i){$i++}}'v'{if(1-le$i){$i--}}}'1N2345'[$i]

ungolfed

$i=1;                                # index which gear we are in
switch([char[]]$args[0]){            # loop over all elements using a switch
  '^'{if(5-gt$i){$i++}}             # if there is a ^ and we are not in sixth yet, shift up
  'v'{if(1-le$i){$i--}}             # if there is a v and we are not in first, shift down
}
'1N2345'[$i]                         # print the output

powershell codegolf ipuçlarını okuyarak 25 bayt kurtardı

gt / le operatörlerini çevirerek 2 bayt kaydedildi


0

Perl 6, 144 bayt

my enum C <1 N 2 3 4 5 6>;my $n=prompt("");my $p=1;for split("",$n) ->$l {$l eq "u" && $p < 6 ?? ++$p !! 0;$l eq"d"&&$p>0 ?? --$p!!0};say C($p);

Olması gerektiği gibi çalışır, inanıyorum. İyileştirmeler açıktır. Perl'i ilk defa bir şey için kullanırken, dilin düşüncesini sevdim, bu yüzden denemek zorunda kaldım.


0

Clojure, 74 bayt

#((vec "1N23456")(reduce(fn[c s](max 0(min 6((if(= s \^)inc dec)c))))1 %))

Akümülatör olarak bir indeksi koruyarak, kaydırma dizesinin üzerine katlanır. Her yineleme indeksi arttırır veya azaltır, ardından 0-6 aralığına kenetlenir. Son olarak, dişlileri tutan bir dize endekslenir ve döndürülür.

Geçerli vitesi temsil eden bir Clojure karakteri döndürür. Vites 1, iade olarak \1ve 'N' dişli olarak döndürülür \N.

Golf öncesi açıklama. Yukarıdan aşağıya iyi okunmadığından numaraları izleyin.

; Expects ^ for shift-up, and V (or anything else) for shift down
; Returns a character representing the current gear
(defn shift [shift-str]
  ((vec "1N23456") ; 4. Then index the gear list with the calculated index, and return
   (reduce (fn [current-gear s] ; 1. Fold over the shift symbols
             (max 0 (min 6 ; 3. Clamp it to the range 0-6 so we don't overflow
                      ((if (= s \^) inc dec) ; 2. If the shift is up, increase, else decrease
                       current-gear))))
           1
           shift-str)))

0

Python 3, 67 63 bayt

k=1
for i in input():k+=[k<6,-(k>0)][i<'1']
print('1N23456'[k])

Oldukça basit bir çözüm.

@Ovs sayesinde -4 bayt!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.