Burcun ne?


14

Bir doğum tarihini (ay ve ayın günü) girdi olarak alan ve batı zodyakının ilgili işaretini, öğesini ve kalitesini çıktılayan bir program yazın . Bu zorluğun amaçları için, bunlar tam olarak bağlantılı wikipedia sayfasındaki tabloda olduğu gibi tanımlanır:

Sign           Date Range                    Element    Quality

Aries          March 21 to April 19          Fire       Cardinal
Taurus         April 20 to May 20            Earth      Fixed
Gemini         May 21 to June 21             Air        Mutable
Cancer         June 22 to July 22            Water      Cardinal
Leo            July 23 to August 22          Fire       Fixed
Virgo          August 23 to September 22     Earth      Mutable
Libra          September 23 to October 23    Air        Cardinal
Scorpio        October 24 to November 20     Water      Fixed
Sagittarius    November 21 to December 22    Fire       Mutable
Capricorn      December 23 to January 20     Earth      Cardinal
Aquarius       January 21 to February 21     Air        Fixed
Pisces         February 22 to March 20       Water      Mutable

kurallar

  • İşaret, eleman ve kalite giriş tarihinden tam olarak wikipedia tablosuna göre hesaplanacaktır.
  • Giriş tarihi biçimi üzerinde biraz özgürlük veriyorum (aşağıdaki Giriş bölümüne bakın). Hangi formatta kullandığınızı cevabınızda açıkça belirtmelisiniz.
  • Geçersiz bir tarih belirtilirse (ayrıştırılamayan tarih veya ayın veya ayın günü aralığın dışında), program mesajla birlikte çıkar Invalid date.
  • Program artık yılları doğru şekilde işlemelidir. yani 29 Şubat giriş ise, çıkış doğru olmalıdır Pisces, Water, Mutable.
  • Dilinizin Tarih kitaplıklarına / API'larına izin verilir, ancak özellikle burç belirtilerini hesaplayan API'lere izin verilmez.
  • Artık komik olmayan standart "boşluklar"
  • Bu , bu yüzden bayttaki en kısa cevap kazanır.

Giriş

  • Program, giriş tarihini STDIN, komut satırı, ortam değişkenleri veya seçtiğiniz dil için uygun olan herhangi bir yöntemden okuyabilir.
  • Bu, öncelikle ayrıştırma ayrıştırma alıştırması değildir, bu nedenle, giriş dizesi, diğer değerlerden (yıl veya saat gibi) değil, yalnızca ay ve ayın günü bileşenlerinden oluştuğu sürece, seçtiğiniz herhangi bir biçimde sağlanabilir. . Örneğin, Jul 24veya 24th of Julyveya 7/24veya 24/07herhangi bir format uygundur. Giriş biçimi seçiminizle eşleşmeyen bir girdi girilirse, Invalid datehata atılmalıdır.

Çıktı

  • Program STDOUT, iletişim kutusu veya seçtiğiniz dil için uygun olan herhangi bir görüntüleme yöntemine gönderilecektir.
  • Çıktı biçimi, virgül ve boşlukla ayrılmış işaret, öğe ve kalite olacaktır: Sign, Element, Quality

Örnekler

Input                 Output
1/1                   Capricorn, Earth, Cardinal
2/29                  Pisces, Water, Mutable
7/24                  Leo, Fire, Fixed
13/1                  Invalid date
2/31                  Invalid date
-1/-1                 Invalid date
1st of Golfember      Invalid date

Geçersiz bir tarihin tespiti / uyarısı gerekli mi? Öyleyse, kullanıcı tarafından girilen geçersiz sayıların sıfırdan büyük olacağını varsayabilir miyiz? (Çoğu insanın sayısal bir tarih biçimi kullanacağını tahmin ediyorum.)
Level River St

1
@steveverrill Sanırım bunu kuralların üçüncü maddesinde açıkça belirtmiştim, ancak açıklamak için Giriş bölümünü düzenledim. TLDR geçerli girdi => geçerli çıktı; geçersiz giriş => hata mesajı; herhangi bir girdi için "tanımlanmamış davranış" a izin verilmez.
Dijital Travma

tam bir tarihe izin veriliyor mu? günler, aylar ve yıllar?
Teun Pronk

@TeunPronk Hayır, sadece ay ve ayın günü. Giriş kuralını açıkladım.
Dijital Travma

Yılın günü (ör Jan 21 -> 21. Feb 5 -> 36) Geçerli bir giriş biçimi mi?
Mego

Yanıtlar:


8

JavaScript, 285 bayt

(Burada bir süre dinledikten sonra ilk cevabım)

d=prompt(m=prompt(e='MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAriesTaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g)));alert(m>0&m<13&d>0&d<29-~'202121221212'[--m]?e[n=7+m%12+(d>18-~'121012333413'[m])]+', '+e[n%4+3]+', '+e[n%3]:'Invalid date')

Birincisi prompt()sayısal formdaki ay ve ikincisi prompt()ayın günüdür (Bilgi isteminin metnini yoksay). Baştaki sıfırlar her ikisi için isteğe bağlıdır. Çıktı ile görüntülenir alert(). (Kodu kısaltmaya yardımcı olduğu için bitpwner, Snack, edc65 ve core1024'e teşekkürler.)

Stack Snippet'lerini kullanarak veya http://jsfiddle.net/8vq89/5/ adresinde deneyin .

Beyaz alan kodları ve kafa karıştırıcı parçaları açıklamak için yorumlar eklendi:

var m = prompt(), d = prompt(),
e = 'MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAries\
TaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g);
alert(m > 0 && m < 13 && d > 0
      & d < 29 - ~'202121221212'[--m] /* ~ is bitwise NOT, which yields -(x + 1). It also
                                         converts a string to a number. Subtracting that
                                         number from 29 gives the number of days in the
                                         month given. */
      ? e[n = 7 + // 7 is added to skip over the 7 qualities and elements in array e.
      m % 12 // The modulus allows dates near the end of December to wrap around to January.
      + (d > 18 - ~'121012333413'[m])] + ', ' +
      e[n % 4 + 3] + /* Qualities and elements follow a pattern, so the modulus determines
                        which one it is. 3 is added to skip over the 3 qualities. */
      ', ' + e[n % 3] : 'Invalid date')

1
İçin 'Cardinal0Fixed0Mutable'.split(0)ve 'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']ve ['Earth','Air','Water','Fire']biraz daha kısadır.
Snack

Bir çözüm vardı, ama çok benzer: z='Air9Water9Fire9Earth9Fixed9Mutable9Cardinal9Aquarius9Pisces9Aries9Taurus9Gemini9Cancer9Leo9Virgo9Libra9Scorpio9Sagittarius9Capricorn'.split(9); [m,d]=prompt().split(/\D/); alert([m-->0&m<12&d>0&d<(32-'020101001010'[m])?z[(m+=(18-~'121012333413'[m]<d)+11)%12+7]+', '+z[m%4]+', '+z[m%3+4]:'Invalid date']). Tek bölüme bir göz atın
edc65

@ edc65 Bunu Invalid left-hand side in assignmentçalıştırmaya çalıştığımda bir hata alıyorum, muhtemelen komut istemi ile ilgili
NinjaBearMonkey

grup ataması Ecmascript 6'dır, sadece firefox'ta çalışır. p=prompt().split(/\D/),m=p[0],d=p[1]gerekir (ama çok daha uzun)
edc65

3
Bunun '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)yerine kullanırsanız daha da '...Scorpio0Sagittarius'.split(0)
kısaltabilirsiniz

3

Cı-353 352

Düzelt Hata ve yazım hatası, 1 karakter daha

Sormadan önce: evet, #include olmadan bile geçerli ve çalışan C standardı.
Giriş biçimi: iki sayı, ilk ay, sonra gün.

char*s[]={"Air","Water","Fire","Earth","Fixed","Mutable","Cardinal","Aquarius","Pisces","Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn"};
main(m,d){
  scanf("%d%d",&m,&d);
  m>0&m<13&d>0&d<(32-(4460832>>m>>m&3))
  ?m+=10+(" 121012333413"[m]-29<d),printf("%s, %s, %s\n",s[m%12+7],s[m%4],s[m%3+4])
  :puts("Invalid date");
}

Ölçek

char*s[]={"Air","Water","Fire","Earth","Fixed","Mutable","Cardinal","Aquarius","Pisces","Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn"};
char *test(char *o, int m, int d)
{
  char *result=o;
  m>0&m<13&d>0&d<(32-(4460832>>m>>m&3))
  ?m+=10+(" 121012333413"[m]-29<d),sprintf(o, "%s, %s, %s\n",s[m%12+7],s[m%4],s[m%3+4])
  :(result = 0);
  return result;
}

int main()
{
  char buf[100];
  int m,d;
  for (m=0;m<14;m++)
    for(d=0;d<40;d++)
      if (test(buf, m,d)) printf("%d %d %s", m, d, buf);
  return 0;
}

İyi, Ivalid;-) yazım hatası hariç
Digital Trauma

@DigitalTrauma Çok iyi değil, belki ayırt edici işaret başlangıcında bir hata var (21,20,24 vb.). Hemen şimdi gözden geçiriyorum.
Bizi

2

Perl 287 ( -pbayrak için 286 + 1 )

/\//;$_=32-(26830452>>$`*2&3)<$'|$'<1|$`<1|$`>12?'Invalid date
':qw(Aquarius01 Pisces23 Aries45 Taurus61 Gemini03 Cancer25 Leo41
Virgo63 Libra05 Scorpio21 Sagittarius43
Capricorn65)[$`-1-($'<20+(219503166088>>$`*3&7))].$/;s/\d/', '.qw(Air
Fixed Water Mutable Fire Cardinal Earth)[$&]/eg

Giriş STDIN'den ve çıkış STDOUT'a gidiyor. İşte OP'nin testleri:

1/1
Capricorn, Earth, Cardinal
2/29
Pisces, Water, Mutable
7/24
Leo, Fire, Fixed
13/1
Invalid date
2/31
Invalid date
-1/-1
Invalid date
1st of Golfember
Invalid date

1

Python, 447387 karakter

import sys
try:S=sys.argv[1];a,b=int(S[:2])-1,int(S[3:])
except:a=b=0
print['Invalid date',', '.join((s.split()*5)[a+(b>[20,21,20,19,20,21,22,22,22,23,20,22][a%12])]for s in"Capricorn Aquarius Pisces Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius Capricorn|Earth Air Water Fire|Cardinal Fixed Mutable".split("|"))][-1<a<12and 0<b<[32,30,32,31,32,31,32,32,31,32,31,32][a]]

Girişi MM / DD olarak alır, her zaman iki basamaklı olmalıdır.

$ python zods.py 01/01
Capricorn, Earth, Cardinal
$ python zods.py 02/29
Pisces, Water, Mutable
$ python zods.py 07/24
Leo, Fire, Fixed
$ python zods.py 13/01
Invalid date
$ python zods.py 02/31
Invalid date
$ python zods.py -1/-1
Invalid date
$ python zods.py First of golfember
Invalid date
$ python zods.py
Invalid date

1
Bunları deneyebilirsiniz: [20,21,20,19,20,21,22,22,22,23,20,22][a%12]-> 19+int('121012333413'[a%12]) ve [32,30,32,31,32,31,32,32,31,32,31,32][a]->30+int('202121221212'[a])
Vectorized

1

JavaScript, 403 396 bayt

M=prompt(),D=+prompt(),i=[52,85,117,147,180,213,246,278,310,343,372,406,415];if([0,0,-2,0,1,0,1,0,0,1,0,1,0][M]<D-31||M<1||D<1||M>12)alert("Invalid date");else for(x in i)if(M*32+D<=i[x]){alert("Capricorn0Aquarius0Pisces0Aries0Taurus0Gemini0Cancer0Leo0Virgo0Libra0Scorpio0Sagittarius0Capricorn".split(0)[x]+", "+["Earth","Air","Water","Fire"][x%4]+", "+["Cardinal","Fixed","Mutable"][x%3]);break}

Başka bir yaklaşım. Sanırım daha çok golf oynayabilirim ama sonra.

İlk istemde ay, ikinci istemde tarih girin.


1

PHP - 294 bayt (php etiketleri hariç) *

* Diğer php girişi gibi

Girdi: Month Daytamsayı olarak, baştaki sıfır gerekli değildir.

Örn: php starsign.php <<< "2 29"29 Şubat için.

Golf yapın (doğrudan kopyalamayın, aşağıya bakın):

<?@eval(gzinflate('=Œ1Â0…ÿŠC!Ë
¦q+JQ—
BEq¸¶¡Ô¤^ðç{¤"ï>/Ãò®`³GOBqú7v¥±MP#äpúµ;$:Å€Ý$“g¦Þ³ƒê‘).p¦¥·TL’Œ,ÝѾȑ¬]oëáJ<zh¨c„V3yhq¤VË_ü(²®TZË¥ØêܳÓF_'));die(fscanf(STDIN,'%u%u',$m,$d)/2&$m<13&&$m*$d&&$d<33-$b[$m]?$a[7+$m-=$d<20+$b[$m+9]].$a[$m%4].$a[$m%3+4]:'Invalid date');

Php dosyasının Hexdump:

3f3c 6540 6176 286c 7a67 6e69 6c66 7461
2865 3d27 318c c20b 1030 ff85 438a cb21
a60d 2b71 4a1d 9751 420a 0745 b871 a1b6
d41e 5ea4 f013 7be7 22a4 ef07 1e3e 2f8f
f2c3 60ae 47b3 4f0e 4205 7115 37fa 760c
03a5 4db1 2350 e40f fa70 1fb5 243b c53a
dd80 9324 671a dea6 83b3 1dea 2991 702e
a5a6 0bb7 4c54 1792 2c8c d1dd c8be ac91
6f5d 1a19 e1eb 3c4a 687a 63a8 5684 3304
6879 a471 5610 5fcb 28fc aeb2 5a54 9d1b
a5cb ead8 18dc d3b3 1546 275f 2929 643b
6569 6628 6373 6e61 2866 5453 4944 2c4e
2527 2575 2775 242c 2c6d 6424 2f29 2632
6d24 313c 2633 2426 2a6d 6424 2626 6424
333c 2d33 6224 245b 5d6d 243f 5b61 2b37
6d24 3d2d 6424 323c 2b30 6224 245b 2b6d
5d39 2e5d 6124 245b 256d 5d34 242e 5b61
6d24 3325 342b 3a5d 4927 766e 6c61 6469
6420 7461 2765 3b29

Golf dosyası oluşturmak için aşağıdaki php komut dosyasını çalıştırın (oluşturur starsign.php):

<?php
$a=<<<'NOW'
$a=[', Earth',', Air',', Water',', Fire',', Cardinal',', Fixed',', Mutable',Capricorn,Aquarius,Pisces,Aries,Taurus,Gemini,Cancer,Leo,Virgo,Libra,Scorpio,Sagittarius,Capricorn];$b='1131212112121012333413';
NOW;
$p = '<?@eval(gzinflate(\'';
$s = <<<'NOW'
'));die(fscanf(STDIN,'%u%u',$m,$d)/2&$m<13&&$m*$d&&$d<33-$b[$m]?$a[7+$m-=$d<20+$b[$m+9]].$a[$m%4].$a[$m%3+4]:'Invalid date');
NOW;
file_put_contents('starsign.php',$p . gzdeflate($a) . $s);

Tamamen çözülmemiş versiyon:

<?php
$a=[', Earth',', Air',', Water',', Fire',', Cardinal',', Fixed',', Mutable',Capricorn,Aquarius,Pisces,Aries,Taurus,Gemini,Cancer,Leo,Virgo,Libra,Scorpio,Sagittarius,Capricorn];$b='1131212112121012333413';
if(fscanf(STDIN, '%u%u', $m, $d) == 2
 and $m < 13
 and $m 
 and $d
 and $d < 33-$b[$m]){
    if($d < 20 + $b[$m+9])
        --$m;
    die($a[7+$m] . $a[$m%4] . $a[$m%3+4]);
}else die('Invalid date');

Sonunda ben /etc/php5/cli/php.ini düzenlemek ve short_open_tag = Onbunu işe almak için ayarlamak gerektiğini anladım . Bu cevap için çalışıyor, ancak diğer PHP yanıtı hala hata veriyor. Bunun için +1.
Dijital Travma

1

Python 3-332 bayt

s="Capricorn Aquarius Pisces Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius Earth Air Water Fire Cardinal Fixed Mutable".split()
import sys
try:m,d=map(int,sys.argv[1:]);13>m>0<d<b" 313232332323"[m]-19or E
except:x="Invalid date"
else:i=m-1+(d>b" 121012333413"[m]-29);x=s[i%12]+", "+s[-7+i%4]+", "+s[-3+i%3]
print(x)
  • Girdileri ayrı argümanlar olarak alır (ör. 1 1)

  • Tüm dizeler için bir bölme

  • Py3 dizinindeki bayt dizine ekleme

  • or Ebir istisna oluşturmanın ucuz bir yoludur ( NameError)

  • Dizeleri birleştirmenin daha ucuz bir yolu var mı? +ve değişmez değerlerin daha küçük olduğu ortaya çıktı join.

  • Bir bayt aramasının 1 ve diğeri 0 ile başlaması için iyi bir neden yoktur, 29 günlük Şubat'ı unuttum ve her şeyi yeniden yapmak yerine 0-> 1'i değiştirdim.


0

PHP 548 524 502 419 (php etiketleri olmadan)

PHP gerektirir> = 5.4.0

Girdi: Day Month(1'den başlayan sayısal değer) örneğin 2 32 Mart için.

<?
$x='Invalid date';
@list($d,$m)=split(' ',fgets(STDIN));
if(@$m<1||$m>12||@$d<1)die($x);
$z=['Aquarius','Pisces','Aries','Taurus','Gemini','Cancer','Leo','Virgo','Libra','Scorpio','Sagittarius','Capricorn','Air','Water','Fire','Earth','Fixed','Mutable','Cardinal','121012333413202121221212'];
$m=$m+0;$d<$z[19][--$m]+20&&$m--;$m<0&&$m=11;$d>$z[19][$m+12]+29&&die($x);
echo$z[$m+0],", {$z[$m%4+12]}, {$z[$m%3+16]}";

DÜZENLEME:A non well formed numeric value ihbar ipe bir ön-artırma yapılarak kaynaklanır $m. Bildirimden bağımsız olarak, aşağıdaki çıktı yine de doğru olmalıdır. Bu bildirim, sürümüne göre değişir PHP. Bunu düzeltmek için, ikinci son satırdan önce tamsayıya dönüştürme için basit bir dize yerleştirilmelidir. Kodu dönüşümlerle güncelledim.

Örnek Giriş / Çıkış (Windows'ta):

// March 2nd
Input > echo 2 3 | php star.php
Output > Pisces, Water, Mutable

// Feb. 30th
Input > echo 30 2 | php star.php
Output > Invalid date

// June 30th
Input > echo 30 6 | php star.php
Output > Cancer, Water, Cardinal

Tamam, ben bir php mankenim. Bunu nasıl yürütüyorsun? Denedim echo 2 3 | php -f zod.php, ancak senaryoyu STDOUT'a yansıtıyor
Digital Trauma

1
@DigitalTrauma Tercümanınızda kısa etiketleri etkinleştirmeniz gerektiğini düşünüyorum , aksi takdirde <?phpyerine kullanın <?.
core1024

Bunu denedim, ama şimdi anladım PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Ben Ubuntu 14.04 üzerinde php 5.5.9 çalıştırıyorum
Digital Trauma

Kod düzeltildi. Bkz. Düzenleme.
noahnu
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.