İşareti çıktı


67

N sayısı göz önüne alındığında , N işaretinin çıktısını alın :

  • N pozitif ise, çıktı 1
  • N negatif ise -1 çıkışı
  • N, 0 ise, 0 çıkışı

N, seçtiğiniz dilde gösterilebilir tam sayı aralığında bir tam sayı olacaktır.


45
Bu, pek çok önemsiz çözümü olan önemsiz bir zorluktur. Bununla birlikte, önemsiz bazı çözümler de var. Seçmenler için: Lütfen yerleşik işlevlerini kaldırmadan önce bu meta gönderinin ilk cümlesini okuyun .
Stewie Griffin

8
Bu muhtemelen büyük bir afiş kullanabilir.
Martin Ender

2
@ MrLister istediğin şeyi oyla, ama gerçekten kod uzunluğu yerine yaratıcılık aramalısın.
FlipTack

3
@FlipTack Oh, onun kodlayıcı olduğunu sanıyordum.
Bay Lister,

3
@ MrLister nesnel kazanan kriter budur. Ancak, syerleşik bir işareti yazmak için gerçekten daha fazla çaba harcıyor mu, yoksa bunu yapmak için akıllıca zekice bitirme / matematik kullanıyor musunuz? Bu meta yazıya
FlipTack

Yanıtlar:


46

Retina , 9 bayt

[1-9].*
1

Çevrimiçi deneyin!

Sıfır olmayan bir rakamı ve ondan sonraki her şeyi değiştirir 1. Bu, potansiyel olarak -sağlam bir potansiyel bırakır ve 0kendisi dışındaki tüm sayıları mutlak değere değiştirir 1.


Bu çok zekice :)
Mego

Tam sayıların bilimsel gösterimi ile mi çalışıyor (örneğin 0.42e2)?
Egor Skriptunoff

@EgorSkriptunoff Hayır, ancak bu bir gereklilik değil.
Martin Ender

9
@EgorSkriptunoff da Romen rakamlarını desteklemiyor. Buradaki zorluk açıkça desteklenmesi gereken standart dışı bir formattan söz etmediği sürece, genel varsayım, seçtiğiniz dilde doğal olan tek bir formatla başa çıkmanın iyi olduğu varsayımıdır.
Martin Ender

3
@EgorSkriptunoff Retina'da herhangi bir sayı kavramı yoktur. Tamamen string tabanlı bir dil.
Martin Ender

42

C (GCC), 24 23 22 18 bayt

Bir bayt tasarrufu için @aross ve @Steadybox teşekkürler!

f(n){n=!!n|n>>31;}

Tüm sistemlerde veya derleyicilerde çalışacağı garanti edilmez , TIO'da çalışır .


7
@ betseg Bunun nedeni, yerleşiklere ilişkin yükseltmelerin artık kaşlarını çatması.
Outgolfer Erik

4
return n>>16|!!n;
Bununla

5
@TR int büyüklüğü muhtemelen 2 (16, x86) veya 4 (32, x86_64) olabilir, ancak unutmayın, gereken tek şey geçerli olduğu bir mimaridir . Bu Stack Overlflow değil, taşınabilirlik önemli değil.
kedi

2
f(n){n=n>>31|!!n;}de çalışır. Ama bu sadece bir derleyici tuhaflığı, dil özelliği değil.
GB

2
@TR Derleyici tuhaflıkları, tuhaflığın çalıştığı bir derleyici olduğu kanıtlandığı sürece tamamen geçerlidir. Neyse ki, Gcc tuhaflığa sahiptir.
Mego

34

Mathematica, 4 bayt

Clip

Yerleşik Signve hala 4 byte puan kullanmamaya ne dersiniz ? ;)

ClipTek bir bağımsız değişken klipleri (ya da kelepçe) arasındaki giriş değeri ile -1ve 1. Girdiler yalnızca tam sayılar olacağından, bu kullanmakla aynıdır Sign.


29

COW, 225 213 201 bayt

oomMOOmoOmoOmoOmoOMoOMoOmOomOomOoMoOMMMmoOMMMMOOMOomOo
mOoMOomoOmoOmoomOomOoMMMmoOmoOmoOMMMMOOOOOmoOMOoMOomOo
mOomOoMoOMMMmoOMMMMOOMOomOomOoMoOmoOmoOmoomoOmoomOomOo
mOomoomoOMOOmoOmoOmoOMOoMMMOOOmooMMMOOM

Çevrimiçi deneyin!

Bu kodun çalışması, daha büyük sayılar ekleyerek ve çıkararak ve en son hangisinin çalıştığını görerek işareti belirlemesidir. Sıfır olmayan bir tamsayı verildiğinde, önce 1'i çıkarın, sonra 2'yi ekleyin, sonra 3'ü vb. Çıkarın. Sonunda 0'a ulaşırsınız. örnek:

-5  - 1  = -6  (current state: 0 + 2 = 2)
-6  + 2  = -4  (current state: 2 - 2 = 0)
-4  - 3  = -7  (current state: 0 + 2 = 2)
-7  + 4  = -3  (current state: 2 - 2 = 0)
-3  - 5  = -8  (current state: 0 + 2 = 2)
-8  + 6  = -2  (current state: 2 - 2 = 0)
-2  - 7  = -9  (current state: 0 + 2 = 2)
-9  + 8  = -1  (current state: 2 - 2 = 0)
-1  - 9  = -10 (current state: 0 + 2 = 2)
-10 + 10 =  0  (current state: 2 - 2 = 0)
value is now at 0.  state - 1 = 0 - 1 = -1
sign of original number is -1

İşiniz bittiğinde, eyaletinizden 1'i çıkarın ve işareti olumlu ya da olumsuz olsun. Orijinal numara 0 ise, bunlardan herhangi birini yaparken zahmet etmeyin ve sadece 0 yazdırın.

Detaylı açıklama:

oom                                        ;Read an integer into [0]
MOO                                        ;Loop while [0] is non-empty
    moOmoOmoOmoOMoOMoOmOomOomOo            ;    Decrement [4] twice
    MoOMMMmoOMMM                           ;    Increment [1], then copy [1] to [2]
    MOO                                    ;    Loop while [2] is non-empty
        MOomOomOoMOomoOmoO                 ;        Decrement [0] and [2]
    moo                                    ;    End loop now that [2] is empty
    mOomOoMMMmoOmoOmoOMMM                  ;    Navigate to [0], and copy to [3]
    MOO                                    ;    Perform the next steps only if [3] is non-zero
        OOOmoOMOoMOomOomOomOoMoOMMMmoOMMM  ;        Clear [3], increment [4] twice, increment [1], and copy it to [2]
        MOO                                ;        Loop while [2] is non-empty
            MOomOomOoMoOmoOmoO             ;            Decrement [2] and increment [0]
        moo                                ;        End loop now that [2] is empty
    moO                                    ;        Navigate back to [3]
    moo                                    ;    End the condition
    mOomOomOo                              ;    Navigate back to [0]
moo                                        ;End loop once [0] is empty.
moO                                        ;Navigate to [1]. If [1] is 0, then input was 0.  Otherwise, [4] contains (sign of [0] + 1)
MOO                                        ;Perform the next steps only if [1] is non-zero
    moOmoOmoOMOoMMMOOO                     ;    Navigate to [4], copy it to the register, and clear [4].
moo                                        ;End condition
MMMOOM                                     ;If the register contains something (which is true iff the condition ran), paste it and print it.  Otherwise, no-op and print 0.

Hala golf oynamayı deniyorum (COW'da golf oynamanın oldukça zor olduğunu keşfedeceğiniz için şoke olacaksınız), bu nedenle gelecekte bir kaç bayt daha azalabilir.


1
Ve bir 'moo' var - dil? ...
Mukul Kumar

1
@MukulKumar Bf'nin yapmadığı bir kaç şeye izin veren COW adında beyin fırtınası bir türev
Gabriel Benamy 24:16

Buna "kötü büyücü" dili de denebilir. OUT OF MANA!!!
Magic Octopus Urn

18

Cubix , 10 bayt

(W0^I?>O2@

Çevrimiçi test edin!

Bu kod aşağıdaki küp ağına sarılır:

    ( W
    0 ^
I ? > O 2 @ . .
. . . . . . . .
    . .
    . .

Kod daha sonra, başlangıç ​​yönünde I, doğuya bakan IP (komut gösterici) ile çalıştırılır . ISTDIN'den işaretli bir tamsayı girerek yığına iter.

Bir sonraki komut, ?üst öğenin işaretine bağlı olarak IP yönünü değiştiren komuttur . Girdi 0 ise, aşağıdaki kodda ilerleyerek aynı yönde ilerlemeye devam eder:

  • >- IP'yi doğuya doğrultun. (Hayır, biz zaten doğuya gittiğimizden beri yok.)
  • O - Üst öğeyi bir tamsayı olarak çıkarın.
  • 2- Yığına 2 basın. Bu pratikte bir ameliyat değil çünkü ...
  • @ - Programı sonlandırır.

Giriş negatifse, IP ?; Bu bir küp olduğu için IP 0, ikinci sıraya doğru ilerleyerek doğuya doğru ilerler . 0değişmez 0 iter, sonra bu kod çalıştırılır:

  • ^ - IP'yi kuzeye doğrultun.
  • W - "Sidestep" IP'yi sola doğru bir nokta.
  • ( - En üstteki öğeyi azalt.

TOS şimdi -1, ve IP, küpün etrafına .değene kadar no-op'lardan oluşan bir demet boyunca sarılıyor >. Bu çıkış yukarıda belirtilen aynı çıkış kodunu çalıştırır -1.

Giriş pozitifse, aynı şey, negatif girişlerde olduğu gibi olur, bir istisna dışında: IP, soldan ziyade sağa döner ?ve küpün etrafına sarılır 2, bu da değişmez 2'yi düşürür. Bu daha sonra 1'e düşürülür. çıktıya gönderildi.


4
Program akışının animasyonu çok güzel!
Luis Mendo

Güzel dil Daha kısa olabilir mi? 4 akış kontrolü çok görünüyor. İşlem sayımında başka bir? Tanıtılarak 8 bayt olabilir, ancak şimdi küpün alt yarısını kullanır: ..1nI? ..> O @ .........?
BlackShift

İlkinden sonra çıktıları yok sayarsak altı olasıdır: / I? NO1 Bu arada, bu işe yarar çünkü online çevirmene 0 yerine 0 yerine 1 değerini veririm.
BlackShift

@ BlackShift İlginiz için teşekkürler! Önerilerinizi beğendim, ancak nasıl geliştirileceğinden emin değilim. Daha az talimat kullanmak kesinlikle mümkün; zor kısmı küpün daha azını kullanıyor ... ;-) Ve -1 böceğine işaret ettiğin için teşekkürler, yakında düzelteceğim.
ETHProductions

@ETHproductions IMO Bir hata değil, Igiriş küçük harfli gibi bittiğinde -1 döndürmek için mantıklı igeliyor.
FlipTack

16

JavaScript (ES6), 9 bayt

Math.sign

Basit.

En kısa olmayan yerleşik 13 bayttır:

n=>n>0|-(n<0)

@Neil sayesinde, bu bir bayt tarafından golf edilebilir, ancak yalnızca 32 bit tamsayılar üzerinde çalışmak pahasına:

n=>n>0|n>>31

Ya da yapabilirsin

n=>n>0?1:!n-1

Bu daha çok golf oynamaktadır gibi görünüyor ama nasıl yapılacağından emin değilim.


2
32 bitlik işaretli tamsayı için 12 bayt olmayan yerleşik n: n=>n>>31|!!n.
Neil

@Neil n>>31gerçekten akıllı, teşekkürler!
ETHProductions

Üçüncü çözümün geçerli olduğunu sanmıyorum, çünkü Javascript sayısal işlemler için çift duyarlıklı kayan nokta kullanıyor. Ama yanılıyor olabilirim.
Mego

@Mego Haklısın. Bu yayında bunu açıklığa kavuşturdum.
ETHProductions

1
@Mego Üzgünüz, yorumunuzu kaçırdım. Bitsel operatörleri kullanırken, JS işlemlerini açık bir şekilde 32-bit tam sayılara dönüştürür, böylece üçüncü çözüm çalışır, ancak yalnızca -2147483648 - 2147483647 arasında çalışır.
ETHproductions

15

APL (Dyalog APL) , 1 bayt

Çok karmaşık sayılar için de çalışır, 1∠ θ döndürür :

×

TryAPL çevrimiçi!


Bu yerleşik olmadan, tamsayılar için (OP uyarınca):

¯11⌊⊢

¯1⌈ negatif olanın en büyüğü ve

1⌊ en küçüğü ve

argüman

TryAPL çevrimiçi!

... ve genel bir:

>∘0-<∘0

>∘0 daha-fazla-sıfır

- eksi

<∘0 Sıfırdan daha az

TryAPL çevrimiçi!


1
Aslında yaptım BİR byte ... Sen efendim, bir efsane vardır. Eminim Jon Skeet gurur duyardı.

@Mango Şaka yapıyorsun, değil mi? Bu zorluğa bir avuç tek baytlık cevap var.
Adám

1
Alaycıydım, ayrıca dedim çünkü bu ilk gördüğüm tek baytlık cevabım.

14

> <> , 9 8 bayt

Bayt tasarrufu için Sp3000'e teşekkürler.

'i$-%n/

0x01Öncesinde baskısız bir şey var /.

Çevrimiçi deneyin!

açıklama

Bu benim karakter kod tabanlı Labyrinth cevabımın bir limanı .

'     Push the entire program (except ' itself) onto the stack, which ends 
      with [... 1 47].
i     Read the first character of the input.
$-    Subtract the 47.
%     Take the 1 modulo this value.
n     Output the result as an integer.
0x01  Unknown command, terminates the program.

Programı doğru bir şekilde sonlandırmak için ;yazdırılamaz yerine bir yasal kullanabileceğinizi düşünüyorum 0x01:)
Outgolfer Erik,

@EriktheOutgolfer ihtiyacım 0x01bir zorlamaya 1neyse.
Martin Ender

2
Görünüşe göre önerimi sadece test ettim 123. Alınan ders: Daha fazla vaka ile test edin.
Outgolfer Erik,

14

Vim, 22 bayt

xVp:s/-/-1^M:s/[1-9]/1^M

@DJMcMayhem sayesinde bir bayt kaydedildi !

İşte, ^Mkelimenin tam anlamıyla bir yeni hat.

As @ nmjcman101 Açıklamalarda belirttiği, tek regex (kullanılabilir :s/\v(-)=[^0].*/\11^M, 20 bayt) yerine, ama bu bir Retina cevap olacağı gibi temelde aynı olduğu için, benim kendi yöntemine yapışmasını ediyorum.

Açıklama:

xVp                        Delete everything except the first character. If the number is negative, this leaves a -, a positive leaves any number between 1 and 9, and 0 leaves 0.
   :s/-/-1^M               Replace a - with a -1
            :s/[1-9]/1^M   Replace any number between 1 and 9 with 1.

İşte negatif bir sayı ile çalışan bir gif (eski versiyon):

Negatif ile koşmak

İşte 0 ile çalışıyor:

Sıfır ile çalışan

Pozitif ile koşmak:

Pozitif ile çalışan


1
:s/\v(-)=[^0].*/\11
Metodunu

Özel konsol GIF'ler ... ??
13’te

12

///, 52 36 bayt

/a/\/1\/\///2a3a4a5a6a7a8a9a10a11/1/

Ungolfed, açıklama:

/2/1/
/3/1/
/4/1/
/5/1/
/6/1/
/7/1/
/8/1/
/9/1/
/10/1/
/11/1/

Temelde bir MapReduce uygulamasıdır, yani iki aşama vardır:

  • Tüm basamak oluşumlarını değiştirin 2- 9ile 1, örneğin 1230405->1110101
  • Çiftleri azaltın 11veya 10hiç 1, örneğin arka arkaya 1110101->1

Bir varsa -başlangıçta önünde olarak kalır ve çıkış olacaktır -1. Bir tek 0asla değiştirilmez, bu da kendi içinde sonuçlanır.

: Güncelleme aliasing ek 16 bayt kaydet //1/ile aMartin Ender sayesinde.

Test durumlarıyla çevrimiçi olarak deneyin


2
Bu son derece zekice!
Mego


11

Labirent , 10 bayt

?:+:)%:(%!

Çevrimiçi deneyin!

açıklama

Labirentin kontrol akışı semantiği aslında bir sayı işaretini belirlemede size "özgür" bir yol sunar, çünkü 3 yönlü bir çatalda seçilen yol, işaretin negatif, sıfır veya pozitif olmasına bağlıdır. Ancak, şu ana kadar bir programı olan 12 bayttan daha azına sığdıramadım (mümkün olsa da).

Bunun yerine, işte herhangi bir dal gerektirmeyen kapalı formlu bir çözüm:

Code    Comment             Example -5      Example 0       Example 5
?       Read input.         [-5]            [0]             [5]
:+      Double.             [-10]           [0]             [10]
:)      Copy, increment.    [-10 -9]        [0 1]           [10 11]
%       Modulo.             [-1]            [0]             [10]
:(      Copy, decrement.    [-1 -2]         [0 -1]          [10 9]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []

Talimat işaretçisi daha sonra bir çıkmaza çarpar, geriye döner ve %şimdi sıfıra bölme girişiminde bulunduğunda sona erer .

Giriş iki katına girişli bu işi yapmak için gerekli olan 1ve -1aksi takdirde iki modül işlemlerinden biri daha önce sıfıra bölmeye girişiminde.


1
Kodunuz mutlu ve hüzünlü oluyor:D
Stefan

2
@Stefan İsterseniz sırasını değiştirebilirsiniz. ;)
Martin Ender

9

PHP, 16 bayt

Yeni uzay gemisi operatörünü kullanır.

<?=$argv[1]<=>0;

Bunun sadece bir PHP7 cevabı olduğunu söylemeyi unutma. Ve kullandığınızdan beri <?=, $_GET[n]daha fazla bayt almayan kullanmalısınız . Kullanmak için <?=, bir web sunucusu içinde (Apache gibi) olmanız gerekir ve orada erişiminiz olmaz $argv. <?php var_dump($argv);Apache üzerinden hesaplanan bir PHP dosyasından çalıştırmayı deneyebilir ve gösterilecektir NULL.
Ismael Miguel,

1
"<? = Kullanmak için, bir web sunucusunun içinde olmanız gerekir (Apache gibi)" Hayır. <?=Operatör komut satırından gayet iyi çalışıyor.
Alex Howansky,

Koşu php -r '<?=1'alıyorum PHP Parse error: syntax error, unexpected '<' in Command line code on line 1. Ancak bir dosyadan iyi çalışıyor gibi görünüyor. Sanırım haklısın.
Ismael Miguel,

-rBayrak bir kod parçacığını çalıştırmaktır. Bu tam bir kaynaktır. Bir dosyaya kaydedin ve sonra çalıştırınphp file.php
Alex Howansky,

Ben zaten anladım. Gerçekten de (implicit) -fparametresini kullanarak bir dosyadan çalıştığını bilmiyordum .
Ismael Miguel,

9

Brain-Flak 74 42 40 Bayt

1000000000 sayesinde 2 bayt kaydedildi

{([({}<([()])>)]<>(())){({}())<>}}{}({})

Çevrimiçi Deneyin!

Açıklama:

{                                }       # if 0 do nothing
   (          )                          # push:                           
    {}<     >                            # the input, after 
       (    )                            # pushing:
        [  ]                             # negative:
         ()                              # 1

 (                    )                  # Then push:
  [            ]                         # the negative of the input
                <>                       # on the other stack with:
                   ()                    # a 1 
                  (  )                   # pushed under it

                       {        }        # while 1: 
                        ({}())           # increment this stack and...
                              <>         # switch stacks

                                 {}      # pop the top (the counter or 0 from input)
                                   (  )  # push:
                                    {}   # the top (this is a no-op, or pushes a 0)


Sıfır monad etrafında(())
0 '


8

C, 24 20 19 18 bayt

Bu golf oynamak için iki C istismar kötüye; Bu, C (GCC) cinsindendir.

f(a){a=a>0?:-!!a;}

Çevrimiçi deneyin!


Revizyon Geçmişi:

1) f(a){return(a>0)-(a<0);}// 24 bayt

2) f(a){a=(a>0)-(a<0);}// 20 bayt

3) f(a){a=a>0?:-1+!a;}// 19 bayt

4) f(a){a=a>0?:-!!a;}// 18 bayt


Revizyon 1: İlk deneme. Basit mantık

2. Revizyon: GCC'de bir bellek / yığın hatasını suistimal ediyor , ki söyleyebildiğim kadarıyla bazı durumlarda geri döndürmeyen bir işlev son ayar değişkenini döndürüyor.

Revizyon 3: Tanımlanmamış sonucun şartlı sonucu getireceği üçlü davranışı kötüye kullanır (bu yüzden benim üçlüsümün gerçek getirisi sıfırdır)

Revizyon 4: Revizyon 2'de referans !!alınan üçlü koşullu sübstitüsyondan bir bool alçı ( ) çıkarın nil.


7

Yakut, 10 bayt

->x{x<=>0}

Çalışır 0.<=>mısın, yoksa Ruby'de buna benzer yöntemlere referans veremez misin?
Nic Hartley

.<=>1 argümanı bekler, böylece 0.<=> xdaha uzun olur.
16'da

@QPaysTaxes, 0.method:<=>çünkü yakut içinde yöntem çağrıları parantez kullanmaz ve 0.<=>çok az argüman içeren bir yöntem çağrısı olarak yorumlanır.
Cyoce

7

Perl, 9 bayt

-EEk ücret ödemeden gerektirir .

say<><=>0

kullanım

perl -E 'say<><=>0' <<< -9999
-1
perl -E 'say<><=>0' <<< 9999
1
perl -E 'say<><=>0' <<< -0
0

Balık işletmecisinden memnunum!


1
Gerçekten "zorunlu" değil -E, sadece bir dosya yerine CLI'den çağırırsanız, bu yüzden sanırım fazladan bir ücret ödemediniz.
nyuszika7h

@ nyuszika7h gerçekten, gerektirir yoluyla test etmenin -eişe yaramayacağı şekilde, ancak -Ebundan daha fazla kabul edilmesini gerektirmiyor -e. Meta üzerinde fikir birliğine göre. Umarım bu biraz yardımcı olur!
Dom Hastings,

Evet, bu komut dosyası bir dosyadan normal bir şekilde yürütüldüğünde gayet iyi çalıştığı için bunun için herhangi bir ek maliyet talep etmiyordum.
nyuszika7h

7

Yığın Kedileri , 6 + 4 = 10 bayt

_[:I!:

​ -nmBayraklar için +4 bayt . nsayısal G / Ç içindir ve Yığın Kedileri, programların palindromik olmasını gerektirdiğinden m, orijinal kaynağı vermek için kaynak kodunu dolaylı olarak yansıtır.

_[:I!:!I:]_

Çevrimiçi deneyin! Temelde tüm iyi Stack Cats golflerinde olduğu gibi, bu kaba kuvvet tarafından bulundu, uzun süreli bir atışla herhangi bir manuel teşebbüsü yendi ve daha büyük bir programa kolayca dahil edilemez.

DAdım adım program izlemesini görmek istiyorsanız bir bayrak ekleyin , örn -nmD. STDERR / debug ile çalıştırın .


Yığın Kedileri, altta sıfırlarla örtülü olarak doldurulmuş bir yığın yığın kullanır. Programın başlangıcında -1, girişi örtük sıfırlardan ayırmak için tüm girişler giriş yığına itilir , tabanda bir a ile birlikte . Programın sonunda, mevcut yığın, -1eğer varsa bir baz dışında çıkar .

Buradaki ilgili komutlar:

_           Perform subtraction [... y x] -> [... y y-x], where x is top of stack
[           Move left one stack, taking top of stack with you
]           Move right one stack, taking top of stack with you
:           Swap top two of stack
I           Perform [ if top is negative, ] if positive or don't move if zero. Then
                negate the top of stack.
!           Bitwise negate top of stack (n -> -n-1)

Tüm bu komutların ters çevrilebildiğine ve tersinin komutun aynası olduğuna dikkat edin. Bu, Stack Cats'in öncülüdür - bütün önemsiz sonlandırma programları, uzunluk programları bile kendiliğinden iptal ettiğinden, tuhaf uzunluklara sahiptir.

İle başlıyoruz

               v
               n
              -1
...  0    0    0    0    0  ...

_, çıkarır üst yapma -1-nve [sonuç bir yığın kalan taşır:

           v
       -1-n   -1
...  0    0    0    0    0  ...

:İlk ikiyi değiştirir ve Ihiçbir şey yapmaz, çünkü yığının tepesi şimdi sıfırdır. !daha sonra bitsel üst sıfır a a olumsuz atar -1ve :ilk iki geriye kaydırır. !Daha sonra bitsel dönüm, üst olumsuzlar -1-ngeri ntekrar:

          v
          n
         -1   -1
...  0    0    0    0    0  ...

Şimdi Iorjinaline uygulanan şube bazında n:

  • Eğer nnegatif olduğu için, bir yığın sol ve sona hareket -nörtülü bir sıfırda. :takaslar, üstüne sıfır koyuyor ve sıfırı ]hareket ettirdik, üstümüze de -1yeni çıktık. _daha sonra çıkarır, son yığını olduğu gibi bırakır ve taban yoksayıldığından [-1 -1]yalnızca bir tanesi çıkarılır .-1-1

  • Eğer nsıfır, biz taşımak ve yok :koyarak takaslarını -1üstünde. ]bu sol hareket -1sağ üst -1ve _benzeri nihai yığın bırakarak çıkarır [-1 0], sıfır çıkış ve baz göz ardı -1.

  • Eğer nolumlu, biz doğru bir yığını ve sonunu taşımak -nbir üstünde -1. :takas, -1üstüne koyarak ve ]bu -1hakkı, üstü kapalı bir sıfırın üstüne götürür . _sonra çıkarır, çıktısı 0 - (-1) = 1gibi olan son yığını verir ve bırakır [1].


7

TI-Basic, 8 bayt

median({1,Ans,~1

Alternatif çözümler (daha fazlasını önermekten çekinmeyin):

max(~1,min(Ans,1               8  bytes
0:If Ans:Ans/abs(Ans           9  bytes
(Ans>0)-(Ans<0                 10 bytes

Ne ~olması gerekiyordu?
Conor O'Brien,

@ ConorO'Brien Negatif sembol, TI-Basic'in çıkartma simgesi arasında ayrım yapmak için. Cemetech SC'nin ~de bu jetonu temsil etmek için kullandığını biliyorum .
Timtech

Oh harika. Hiç bir fikrim yoktu.
Conor O'Brien,

@ ConorO'Brien Eh, şimdi biliyorsun. Sorduğun için teşekkürler :)
Timtech

1
Bu geçerli değil - kullanarak Ansgirdi olarak geçerli varsayılan I / O yöntemi olmaktan kriterlerini karşılamamaktadır (o downvotes iki katı kadar upvotes yok - şu anda + 19 / -12 de var).
Mego

7

MATL , 6 bayt

0>EGg-

Giriş bir sayı veya bir dizi olabilir. Sonuç, sayı veya karşılık gelen değerlere sahip bir dizidir.

Çevrimiçi deneyin! Veya dizi girişini kullanarak birkaç vakayı test edin .

açıklama

Bu, yerleşik işareti işlevini ( ZS) kullanmaktan kaçınır .

0>   % Take input implicitly. Push 1 if positive, 0 otherwise
E    % Multiply by 2
Gg   % Push input converted to logical: 1 if nonzero, 0 otherwise
-    % Subtract. Implicitly display

Matl daha uzundur Matlab ve Octave ?!
Saat

4
Ayrıca ZScevabı yazdığı gibi yerleşik kullanmış olabilir .
Stewie Griffin


6

Mathematica, 4 bayt

Sign

Tam olarak ne kalay yazıyor


Bir baytla kaydedinsgn
Adám

3
WolframAlpha, Mathematica ile aynı değildir; belirsiz / doğal dil girişinin otomatik olarak yorumlanmasını içerir.
Greg Martin

Öyleyse bunu ayrı bir cevap sunmalıyım?
Adam

bana mantıklı geliyor ...
Greg Martin

6

Octave, 26 24 bayt

f=@(x)real(asin(x))/pi*2

Bu benim ilk Octave cevabı, herhangi bir golf ipucu takdir!

Çevrimiçi deneyin!

Gelme fikri, asinsöylediği sorudan geliyor output the sign:)

açıklama

Not: sayıyı bölüp piçarpma , sayının 2tamamını bölüp eşdeğeridir.pi/2

Dava 0:

asin(0)verim 0. Gerçek kısmını almak ve bölüştürmek pi/2çıktıda bir fark yaratmıyor.

Dava positive:

asin(1)verim pi/2. asinherhangi bir sayının + karmaşık sayı 1vereceklerinden daha büyük pi/2. Bunun gerçek bir kısmını verir alarak pi/2ve bölünmesi tarafından değerlendirilmiş pi/2verir1

Dava negative:

asin(-1)verim -pi/2. asinherhangi bir sayının + karmaşık sayı -1vereceklerinden daha küçük -pi/2. Bunun gerçek bir kısmını verir alarak -pi/2ve bölünmesi tarafından değerlendirilmiş pi/2verir-1


@LuisMendo N will be an integerŞanslıyım ki bu soruyu söylüyor :)
Kritixi Lithos

Ah, o bölümü okumamıştım :)
Luis Mendo

1
C l e v e r!
flawr

f=Gerisi geçerli, özyinelemeli olmayan bir işlev ifadesi olup olmadığına ihtiyacınız yoktur .
Cyoce

@Cyoce Üzgünüm, ama adsız işlevleri tercih etmiyorum
Kritixi Lithos

6

Aslında , 1 bayt

s

Çevrimiçi deneyin!

Teneke üzerinde tam olarak söylediklerinin bir başka örneği - sişareti işlevidir.

Yerleşik olmadan (4 bayt):

;A\+

Çevrimiçi deneyin!

;A\girişin mutlak değerini girişe böler. Bu -1, negatif girişler ve 1pozitif girişler için sonuçlanır . Ne yazık ki, Aslında hata işleme (eğer bir şeyler ters giderse, komut yok sayılır) 0nedeniyle girdi 0yığında iki saniye kalıyor. +bunları ekleyerek düzeltir (başka bir şeyde hataya neden olur, bu nedenle dikkate alınmaz).


6

Piet, 188 53 46 41 bayt

5bpjhbttttfttatraaearfjearoaearbcatsdcclq

Çevrimiçi tercüman burada mevcut.

Yerleşik (n>0)-(n<0)işareti denetleme işareti bulunmadığından bu piet kodu standarttır . Aslında, yerleşikten daha az bir şey yoktur, bu nedenle bu yöntemin daha doğru bir açıklaması olacaktır (n>0)-(0>n).

Yukarıdaki metin görüntüyü gösterir. Resmi, yorumlayıcı sayfasındaki metin kutusuna yapıştırarak oluşturabilirsiniz. Kolaylık sağlamak için codel boyutunun 31 piksel olduğu aşağıdaki resmi verdim. Izgara okunabilirlik için orada ve programın bir parçası değil. Ayrıca, bu programın herhangi bir beyaz kodeli geçmediğini unutmayın; programın akışını takip etmek için görüntünün kenarındaki renkli kodelleri takip edin.

açıklama

program

Instruction    Δ Hue   Δ Lightness   Stack
------------   -----   -----------   --------------------
In (Number)    4       2             n
Duplicate      4       0             n, n
Push [1]       0       1             1, n, n
Duplicate      4       0             1, 1, in, in
Subtract       1       1             0, in, in
Duplicate      4       0             0, 0, in, in
Push [4]       0       1             4, 0, 0, in, in
Push [1]       0       1             1, 4, 0, 0, in, in
Roll           4       1             0, in, in, 0
Greater        3       0             greater, in, 0
Push [3]       0       1             3, greater, in, 0
Push [1]       0       1             1, 3, greater, in, 0
Roll           4       1             in, 0, greater
Greater        3       0             less, greater
Subtract       1       1             sign
Out (Number)   5       1             [Empty]
[Exit]         [N/A]   [N/A]         [Empty]

Dosya boyutunu daha da azaltmak için, yaptığım gibi dosyayı sıkıştırmak yerine programı (gasp) değiştirmem gerekiyor . Bu golfü 36 dereceye indirecek bir satırı kaldırmak istiyorum. Ayrıca daha küçük bir giriş formatına sahip olan kendi tercümanımı da geliştirebilirim, çünkü kodu küçültmek için kodun değiştirilmesi aslında kodun ne olduğu ile ilgili değildir.

Mods, genel dosya boyutunun Piet kodu için önemli olduğunu söyledi. Tercüman metni geçerli girdi olarak kabul ettiğinden ve ham metnin herhangi bir görüntüden daha küçük bayt sayısına sahip olması nedeniyle, metin açık bir seçenektir. Bu konuda arsız olduğum için özür dilerim ama kuralları koymuyorum. Bununla ilgili meta tartışma, konu hakkındaki görüşlerimi açıkça ortaya koyuyor.

Bunun Piet'in ruhuna aykırı olduğunu düşünüyorsanız veya herhangi bir nedenle bunu daha fazla tartışmak istiyorsanız, lütfen meta üzerindeki tartışmayı inceleyin .


2
Piet’in konvansiyonunun tüm kodelleri saymak olduğuna inanıyorum .
SuperJedi224

@ SuperJedi224 Bu meta gönderisinde karar verilen şey değil, görüntüdeki bayt sayısı da neye benzeyeceğime benziyor.
Mike Bufardeci,

6

Pushy , 7 bayt

Bu muhtemelen şimdiye kadar yazdığım en garip görünüşlü program.

&?&|/;#

Çevrimiçi deneyin!

Kullanır sign(x) = abs(x) / x, ancak sign(0) = 0sıfır bölme hatasını önlemek için açık bir şekilde kullanılır .

          \ Take implicit input
&?   ;    \ If the input is True (not 0):
  &|      \  Push its absolute value
    /     \  Divide
      #   \ Output TOS (the sign)

Bu çalışır çünkü x / abs(x)olan 1 olduğunda X pozitif olan -1 ne zaman x negatiftir. Girdi 0 ise, program çıkış komutuna atlar.


4 bayt (rekabet etmeyen)

Tatiller ve çok fazla zaman geçirdiğim için, Pushy tercümanını yeniden yazdım. Yukarıdaki program hala çalışır, ancak 0 / 0şimdi varsayılan olarak 0 olduğundan, aşağıdakiler daha kısadır:

&|/#

Çevrimiçi deneyin!


1
Ben de kullanmayı düşünmüştüm abs, ama ne yapacağımı bilemedim 0. Aferin!
Kritixi Lithos

5

R, 25 bayt

'if'(x<-scan(),x/abs(x),0)

Numarayı STDIN'e götürür. Daha sonra sıfır olup olmadığını kontrol eder, eğer değilse, x/|x|her ikisinden 1de döner -1ve eğer 0 ise çıkışı verir x=0.

Bu signelbette yerleşik kullanmadan .


1
Yerleşiğini kullanarak tabii daha kısa, ancak daha az eğlenceli: sign(scan()).
Billywob

Maalesef, yerleşikten kaçınarak açıkça belirtilmesi gerekir
JAD

5

V 14 12 bayt

2 byte için @DJMcMayhem teşekkürler. Değişikliği yapmak için bir reg-ex kullanır. Biraz eğlenceli, çünkü yerleşik değil. Daha eğlenceli bir işleve sahibim, ancak beklediğim gibi çalışmıyor.

ͨ-©½0]/±1

Test Durumlarını Doğrula

Bu sadece çevirir :%s/\v(-)=[^0].*/\11hangi biriyle eşleştiğinde veya daha fazla -bir şey ile herhangi bir kaç kez izledi 0 ama şey tarafından izledi. İlk eşleşmeyle (yani ya bir -ya da hiçbir şey) ve a ile değiştirilir 1. Düzenli ifade 0 ile eşleşmiyor, bu yüzden kendisi kalıyor.

Daha Eğlenceli Bir Yol (21 bayt)

é
Àé12|DkJòhé-òó^$/a

TryItOnline

Bu, girdiyi arabellek yerine bir argüman olarak kabul eder.

é<CR> Yeni bir satır ekle

Àargümanı V kodu olarak çalıştırın. a -, imleci önceki satıra götürür ve herhangi bir sayı bir sonraki komutun sayısı olur.

é1takın (sayım) 1'in

2| ikinci sütuna git

D ikinci sütundan sonraki her şeyi sil (yalnızca bir karakter bırakarak)

kJ İki çizgiyi bir araya getirin.

òhé-òçevirir: " hé-ayrılıncaya kadar koş ". 1 ikinci satırdaysa, bu saat hemen sonra kırılır. İlk satırda olsaydı, -kırmadan önce bir ekleyecektir .

ó^$/aBu gerçeği düzeltir -1, 0, 1boş bırakacak ve argüman kaydı ile boş değiştirir.


Bu sayfayı daha iyi okumam gerektiğini biliyordum. Aslında daha kısa değil - 0 unuttum, ancak sayıyı argüman olarak almaya çalışıyordum Àé1. Olumlu bir sayı, bir sayı dizisi verir, negatif sayı bir satır dizisi verilen bir sayı verir ve 0 hiçbir şey vermez. Negatif sayı biti işe yaramadı À, fakat işe yaradıd$@"
nmjcman101

Ah. İşe yaramazsa nedeni, devam etmesi için başka bir sıranın olmamasıdır. Eğer eklerseniz é<cr>o zaman iki boş hatları ve gerekecek çalışır . Tam bir cevap almak için bunu kullanıp kullanamayacağınızdan emin değilim
DJMcMayhem

Başka bir hattım vardı, yorumumda açıkça söylemedim. Ne var --argüman eklediğiniz?
nmjcman101

1
"Seçeneklerin sonu" anlamına geliyor. -6Bir bayrakla başladığından beri , docopt (komut satırı seçenekleri için python kütüphanesi) bunun bir argümandan ziyade bir komut satırı bayrağı olduğunu düşünüyor. --Sadece ekleme , bunun bir seçenek değil argüman olduğunu gösterir. Aksi takdirde, geçersiz komut satırı çağrısı nedeniyle hiç çalışmaz.
DJMcMayhem

5

C #, 16 15 bayt

Neil sayesinde geliştirilmiş çözüm

n=>n>0?1:n>>31;

Alternatif olarak, yerleşik yöntem 1 byte daha uzundur:

n=>Math.Sign(n);

Test vakaları ile tam program:

using System;

public class P
{
    public static void Main()
    {
        Func<int,int> f =
        n=>n>0?1:n>>31;

        // test cases:
        for (int i=-5; i<= 5; i++)
            Console.WriteLine(i + " -> " + f(i));
    }
}

2
Deneyin n>>31yerine n<0?-1:0.
Neil

1
Yerleşik en kısa çözüm bile değilken biraz üzücü.
Mego

Diyelim ki C # oldukça ayrıntılı olarak biliniyor ...
adrianmp

1
A) ;Lambda ifadesi değil ifadesi olduğu için izine ihtiyacın olduğunu sanmıyorum . B) Math.Signveya Math::Signbenzer bir şey geçerli bir başvuru olur mu? Özellikle C # yöntemlerini nasıl işlediğinden emin değilim. Temel olarak, doğru tür ile başlatılmış x = Math.Sign;olsaydı geçerli bir C # deyimi olurdu x?
Cyoce
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.