Code Golf: Dört sihirdir


88

Bulmaca

Lisedeyken duyduğum küçük bir bilmece şöyle bir şey oldu ...

  • Soru soran kişi benden ona bir numara vermemi isterdi;
  • Numarayı duyduğunda, soru soran kişi, sonunda 4 sayısına ulaşana kadar (bu noktada sihirle bitirirdi ) tekrar tekrar (örneğin, on'un üç olduğunu söyleyebilir ) bir tür dönüşüm gerçekleştirirdi .
  • Ne olursa olsun, herhangi bir sayı sonunda dörde dönüştürülebilir gibi görünüyor.

Amaç, dönüşüm işlevini anlamaya çalışmak ve ardından bu bulmacayı kendiniz güvenilir bir şekilde denetleyebilmekti.

Çözüm

Herhangi bir adımdaki dönüştürme işlevi,

  • Söz konusu numarayı alın,
  • Bir kısa çizgiyi veya boşlukları veya "ve" yi göz ardı ederek İngilizce kelime temsilindeki harflerin sayısını sayın (ör. "On" içinde 3 harf, "otuz dört" içinde 10 harf, "yüz kırk üç" içinde 20 harf vardır).
  • Bu sayıda harfi döndür.

Şimdiye kadar test etmek istediğim tüm sayılar için bu 4'e yakınsıyor. "Dört" de dört harf içerdiğinden, burada sonsuz bir döngü olacaktır; bunun yerine sırayı sona erdirmek için geleneksel olarak sihir olarak anılır .

Meydan okuma

Zorluğunuz, kullanıcıdan bir sayı okuyacak ve ardından "dört sihir" olana kadar dönüşüm işlevinin tekrar tekrar uygulandığını gösteren satırlar yazdıracak bir kod parçası oluşturmaktır.

Özellikle:

  1. Çözümler kendi başlarına eksiksiz programlar olmalıdır. Girişte bir sayı faktörünü alan işlevler olamazlar.
  2. Giriş, standart girişten okunmalıdır. ("Echo" dan borulama veya giriş yeniden yönlendirme kullanmak iyidir, çünkü bu da stdin'den gelir)
  3. Giriş sayısal biçimde olmalıdır.
  4. Dönüşüm işlevinin her uygulaması için, bir satır yazdırılmalıdır: a is b.burada a ve b, dönüşümdeki sayıların sayısal biçimleridir.
  5. Tam duruşlar (dönemler) GEREKLİDİR!
  6. Son satırda doğal olarak, demeli 4 is magic..
  7. Kod, 0'dan 99'a kadar tüm sayılar için doğru çıktı üretmelidir .

Örnekler:

> 4
4 is magic.

> 12
12 is 6.
6 is 3.
3 is 5.
5 is 4.
4 is magic.

> 42
42 is 8.
8 is 5.
5 is 4.
4 is magic.

> 0
0 is 4.
4 is magic.

> 99
99 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.

Kazanan, kaynak kodu karakter sayısına göre en kısa başvurudur ve bu da doğru .

BONUS

Ayrıca, dönüştürme işlevinin her uygulamasında sayılar için İNGİLİZCE İSİMLERİNİ yazdıran kodun bir sürümünü de yazmayı deneyebilirsiniz. Orijinal girdi hala sayısaldır, ancak çıktı satırları sayının kelime biçiminde olmalıdır.

(Kodunuzla şekil çizmek için çift bonus)

(DÜZENLE) Bazı açıklamalar:

  1. Sözcüğün tüm uygulanabilir durumlarda her iki tarafta görünmesini istiyorum, örneğin Nine is four. Four is magic.
  2. Yine de büyük harf kullanımı umrumda değil. Ve kelime jetonlarını nasıl ayırdığınız umurumda değil, ancak birbirlerinden ayrılmaları gerekir: ninety-ninetamam, ninety ninetamam, ninetyninetamam değil.

Bunları, meydan okumayla ilgili olarak bonus yarışması için ayrı bir kategori olarak düşünüyorum, bu nedenle, eğer bunun için giderseniz, kodunuzun sayısal versiyondan daha uzun olması konusunda endişelenmeyin.

Her sürüm için bir çözüm göndermekten çekinmeyin.


1
Ne kadar yüksek bir sayı ile uğraşmalıyız? <100? <1000? <1000000? <2 ** 31?
P Daddy

1
Bunun yalnızca 0'dan 99'a gitmesi gerektiğinden, hızlı ve kısa bir çözümün 0-99 eşlenen değerleri sabit kodlamak ve ardından 4'e ulaşana kadar döngü yapmak olacağından şüpheleniyorum. Bundan sonra mikro zayıflama başlar.
Beska

@P Daddy ... 6. bölüm sadece 0-99 diyor.
Beska


14
4 sadece sihirdir çünkü adil bir zar atma tarafından seçilmiştir.
VirtuosiMedia

Yanıtlar:


57

GolfScript - 101 96 93 92 91 90 94 86 bayt

90 → 94: 10'un katları için sabit çıktı
94 → 86: Yeniden yapılandırılmış kod. Basılamayan karakterleri kaldırmak için 100 tabanını kullanma.
86 → 85: Dizeye daha kısa kullanım.

{n+~."+#,#6$DWOXB79Bd")base`1/10/~{~2${~1$+}%(;+~}%++=" is "\".
"1$4$4-}do;;;"magic."

bu neden bu kadar aşağıda? lisp olandan daha kısa ve yerleşik bir biçimlendirme işlevi kullanmıyor
Claudiu

36
Kodun bitmesini seviyorum "magic.", hemen hemen özetliyor.
Aistina

@Aistina: Bu meydan okumada bunu yapmak çok kolay sanırım. :-)
Platinum Azure

9
@Aistina: haha, bu biraz komik. "mumbo jumbo yada yada..magic"
vol7ron

1
@P Daddy d, )as tarafından çıkarılır 100ve temel dönüştürme için taban olarak kullanılır.
Nabb

85

Perl, yaklaşık 147 karakter

Platinum Azure çözümüne gevşek bir şekilde dayalı:

               chop
              ($_.=
              <>);@
             u="433
            5443554
           366  887
          798   866
         555    766
        "=~     /\d
       /gx      ;#4
      sub       r{4
     -$_        ?$_
    <20         ?$u
   [$_          ]:(
  $'?           $u[
 $']            :0)
+$u[18+$&]:magic}print"
$_ is ",$_=r(),'.'while
                /\d
                /x;
                444

1
@ Platinum Azure, bunun girdisini popherhangi bir argüman olmadan kullanımıyla elde etme şeklidir . Bir alt yordamın dışında , Perl programına argümanların listesi olan popson değeri kaldırır ve döndürür @ARGV. Onunla kolayca değiştirilebilir shift, ancak bu 2 karakter daha ekler. Bakınız: p3rl.org/pop
Brad Gilbert

içinde bir satırsonu karakterine ihtiyacınız var gibi görünüyor '.', bu 2 için \nveya 1'de beyaz '. 'boşluğu sayıyorsanız (boşluk satırsonu değişmezidir)
vol7ron

Biraz daha uzun ama yaratıcılık kitabımda uzun bir yol kat ediyor.
Beska

@ Platinum Azure ve diğerleri: Girişini stdin'den alıyor. Perl'de bunu yapmanın yolu budur. (Belki yorumunuzdan sonra değiştirmiştir?)
Frank

@P Daddy: inilti ama yine de yorumunuz için +1
Platinum Azure

30

Common Lisp 157 Karakter

Yeni, daha uyumlu sürüm, artık standart girdiyi okuyor ve boşlukları ve kısa çizgileri yok sayıyor:

(labels((g (x)(if(= x 4)(princ"4 is magic.")(let((n(length(remove-if(lambda(x)(find x" -"))(format nil"~r"x)))))(format t"~a is ~a.~%"x n)(g n)))))(g(read)))

İnsan tarafından okunabilir biçimde:

 (labels ((g (x)
           (if (= x 4)
            (princ "4 is magic.")
            (let ((n (length (remove-if (lambda(x) (find x " -"))
                                        (format nil "~r" x)))))
               (format t"~a is ~a.~%" x n)
               (g n)))))
    (g (read)))

Ve bazı test çalışmaları:

>24
24 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.

>23152436
23152436 is 64.
64 is 9.
9 is 4.
4 is magic.

Ve bonus versiyonu, 165 karakter:

 (labels((g(x)(if(= x 4)(princ"four is magic.")(let*((f(format nil"~r"x))(n(length(remove-if(lambda(x)(find x" -"))f))))(format t"~a is ~r.~%"f n)(g n)))))(g(read)))

Verme

>24
twenty-four is ten.
ten is three.
three is five.
five is four.
four is magic.

>234235
two hundred thirty-four thousand two hundred thirty-five is forty-eight.
forty-eight is ten.
ten is three.
three is five.
five is four.
four is magic.

5
"Yirmi dört" ün sadece 10 harf olduğunu sanıyordum.
kennytm

1
"Eşittir" den sonraki sayılar da metin olmalıdır.
Mike DeSimone

5
bu neden bu kadar yüksek? diğerleri yerleşik bir format işlevi kullanmıyor ve daha az karakter
içeriyor

3
@Claudiu Çünkü Common Lisp harika.
Mornedhel

3
Topu deliğe sokamazsan kaç vuruş yaptığın önemli değil. İnsanlar yanlış çözümlere oy verdiklerinde bunu unutuyorlar.
Mark Peters

21

Python 2.x, 144 150 154 166 karakter

Bu, sayıyı onlar ve birlere ayırır ve özetler. Sözde üçlü operatörün istenmeyen özellik ise döndürülür 0 Burada istismar olmasıdır.a and b or ccb

n=input()
x=0x4d2d0f47815890bd2
while n-4:p=n<20and x/10**n%10or 44378/4**(n/10-2)%4+x/10**(n%10)%10+4;print n,"is %d."%p;n=p
print"4 is magic."

Önceki saf versiyon (150 karakter). Sadece tüm uzunlukları bir tamsayı olarak kodlayın.

n=input()
while n-4:p=3+int('1yrof7i9b1lsi207bozyzg2m7sclycst0zsczde5oks6zt8pedmnup5omwfx56b29',36)/10**n%10;print n,"is %d."%p;n=p
print"4 is magic."

Üzgünüm, sırf böyle şeyler yüzünden özellikle durmak istedim. :-) Yine de iyi bir giriş! (DÜZENLEME: Python'u bilmiyorum, ama yapabilir misin n,"is",p,"."? Doğru sayıyorsam hala bazı karakterleri kurtaracağını düşünüyorum)
Platinum Azure

2
@Plat: Bu .,.
kennytm

@KennyTM: Oh, ha, bunu pasajdan bile fark etmeliydim. Oops! Her neyse, dediğim gibi, bazı teknik özellikler işleri biraz karmaşıklaştırmak için özel olarak tasarlandı. :-)
Platinum Azure

36'dan daha yüksek bir taban kullanarak bunu kısaltabilir miyiz?
MikeD

@MikeD: Hayır. Python belgelerinden: " Temel parametre, dönüşüm için temel verir (varsayılan olarak 10'dur) ve [2, 36] veya sıfır aralığında herhangi bir tamsayı olabilir." Şimdi belki başka bir işlevi kullanabilmek için int()bir şeyler söylemek structya base64... modüllerin
Mike DeSimone

20

C - sayı kelimelerle

445 431 427 421 399 386 371 359 * 356 354 348 347 karakter

Bu kadar. Bunu daha kısaltabileceğimi sanmıyorum.

Tüm yeni satırlar okunabilirlik içindir ve kaldırılabilir:

Aşağıda, bir şekilde küçültülmemiş, ancak yine de okunması oldukça zor. Daha okunaklı bir sürüm için aşağıya bakın.

Genişletilmiş ve yorumlanmış:

Başına yakın kodlanmış dize hakkında

Sayıların isimleri çok basit bir şema kullanılarak sıkıştırılmıştır. Sık kullanılan alt dizeler, ad dizisine tek karakterli dizinlerle değiştirilir. Ekstra ad girişlerinden oluşan bir "arama tablosu", ilk kümede tamamen kullanılmayan alt dizeler için sona eklenir. Aramalar özyinelemelidir: girişler diğer girişlere başvurabilir.

Örneğin, 11'in sıkıştırılmış adı elM. print()Fonksiyon karakterleri çıktılar eve l(küçük harf 'L', sayısını değil '1') kelimesi kelimesine, ama sonra bulduğu Mo 29 girişi (ASCII 'M' - ASCII '0') endeksi ile kendisini çağıran böylece, arama tablosuna. Bu dize evLçıktı verir eve vdaha sonra arama tablosundaki 28. girdinin dizini ile kendini yeniden çağırır, bu da enaynı çıktıdır ve çıktıdır. Çünkü yararlıdır ende kullanılır eLiçin een(sonrası kullanılan eightolarak eighteen), içinde kullanıldığı tOiçin teen(her için kullanılan -teenisim).

Bu şema, sayı adlarının oldukça önemli bir şekilde sıkıştırılmasına neden olurken, sıkıştırmanın açılması için yalnızca az miktarda kod gerektirir.

Dizenin başındaki ve sonundaki virgüller, bu dizede alt dizelerin bulunmasının basit bir yolunu açıklar. Buraya iki karakter eklemek, daha sonra daha fazla karakter kaydeder.

Suistimali hakkında main()

argvyok sayılır (ve bu nedenle sıkıştırılmış sürümde bildirilmez), argc'nin değeri yok sayılır, ancak depolama mevcut sayıyı tutmak için yeniden kullanılır. Bu beni fazladan bir değişken bildirmekten kurtarıyor.

Eksikliği hakkında #include

Bazıları ihmal etmenin #include <stdio.h>hile yapmaktan şikayet edecek . Hiç de değil. Verilen, bildiğim herhangi bir C derleyicisinde (uyarılarla da olsa) doğru bir şekilde derlenecek tamamen yasal bir C programıdır. Standart işlevler için prototiplerden yoksun olan derleyici, bunların geri dönen cdecl işlevleri olduklarını varsayacak intve hangi argümanları geçireceğinizi bildiğinize güvenecektir. Bu programda dönüş değerleri göz ardı edilir ve hepsi cdecl ("C" çağırma kuralı) fonksiyonlarıdır ve biz gerçekten hangi argümanların geçirileceğini biliyoruz.

Çıktı

Çıktı beklendiği gibidir:

0
sıfır dörttür.
dört sihirdir.
1
biri üç.
üç beştir.
beş, dörttür.
dört sihirdir.
4
dört sihirdir.
20
yirmi altıdır.
altı üçtür.
üç beştir.
beş, dörttür.
dört sihirdir.
21
yirmi bir dokuzdur.
dokuz dörttür.
dört sihirdir.

* Önceki sürüm, spesifikasyonun iki kısmındaki işareti kaçırdı: sıfırı ele almadı ve stdin yerine komut satırında girdi aldı. Sıfırların işlenmesi karakterler ekledi, ancak komut satırı argümanları yerine stdin kullanarak ve birkaç başka optimizasyon aynı sayıda karakteri kaydederek bir yıkamaya neden oldu.

Sayı kelimesinin "eşittir" ifadesinin her iki tarafına da basılması gerektiğini netleştirmek için gereksinimler değiştirildi. Bu yeni sürüm, bu gereksinimi karşılar ve gerekli ekstra boyutu hesaba katmak için (daha fazla) birkaç optimizasyon uygular.


Bu cevaplar arasında en sevdiğim cevaptır ... Bravo, aferin. +1, senin için ve eğer iki onay işareti verebilirsem yapardım.
Platinum Azure

5
Okumak çok eğlenceli, sanırım bundan sonra bu sayıları günlük hayatta kullanacağım. Altı, sem, sekiz, dokuz, tel, elem, on iki, enpee, dört pee, beşli, altı pee, yedi pee, eightoh, ninepee, twelkyu ... =)
deceze

10

J, 107 112 karakter

'4 is magic.',~}:('.',~":@{.,' is ',":@{:)"1]2&{.\.
(]{&(#.100 4$,#:3 u:ucp'䌵䐵吶梇禈榛ꪛ멩鮪鮺墊馊꥘誙誩墊馊ꥺ겻곋榛ꪛ멩鮪鮺'))^:a:

(Yalnızca okunabilirlik için yeni satır)

Kullanım ve çıktı:

    '4 is magic.',~}:('.',~":@{.,' is ',":@{:)"1]2&{.\.(]{&(#.100 4$,#:3 u:ucp'䌵䐵吶梇禈榛ꪛ멩鮪鮺墊馊꥘誙誩墊馊ꥺ겻곋榛ꪛ멩鮪鮺'))^:a:12
12 is 6.    
6 is 3.     
3 is 5.     
5 is 4.     
4 is magic. 

"4 sihirdir" biti nerede? Ortadaki "olan" ne olacak?
Josh K

3
Lütfen Çinli olmayan bir hakem seçin
Dr. belisarius

3
@beli: 멩, 겻, 곋, 멩 Koreli.
kennytm

1
Eşim (anadili Çince olan) bunun Çince ve Korece karışımı olduğunu söylüyor.
Loren Pechtel

3
@belisarius: 1) Korece bilmiyor. 2) Çinliler anlamsızdır.
Loren Pechtel

10

T-SQL, 413 451 499 karakter

CREATE FUNCTION d(@N int) RETURNS int AS BEGIN
Declare @l char(50), @s char(50)
Select @l='0066555766',@s='03354435543668877987'
if @N<20 return 0+substring(@s,@N+1,1) return 0+substring(@l,(@N/10)+1,1) + 0+(substring(@s,@N%10+1,1))END
GO
CREATE proc M(@x int) as BEGIN
WITH r(p,n)AS(SELECT p=@x,n=dbo.d(@x) UNION ALL SELECT p=n,n=dbo.d(n) FROM r where n<>4)Select p,'is',n,'.' from r print '4 is magic.'END

(Cidden bunu yapmanızı önermediğimden değil ... gerçekten sadece bir CTE yazmak istedim)

Kullanmak:

M 95

İadeler

p                n
----------- ---- -----------
95          is   10.
10          is   3.
3           is   5.
5           is   4.
4 is magic.

Bir tabloyu döndürmek yerine tek tek sonuçları yazdıramaz mısınız? Bu, çıktının daha güzel görünmesini sağlar.
Joey

1
Sıfırın düzgün işlediğini sanmıyorum. Bunun gibi bir şeye ne dersiniz:CREATE FUNCTION d(@ int) RETURNS int AS BEGIN Declare @l char(9),@s char(50) Select @l='066555766',@s='03354435543668877987' if @=0 return 4 if @<20 return 0+substring(@s,@+1,1)return 0+substring(@l,@/10,1)+substring(@s,@%10+1,1)END
Gabe

9

(Demirbaş ile) Java 308 290 286 282 280 karakter

class A{public static void main(String[]a){int i=4,j=0;for(;;)System.out.printf("%d is %s.%n",i=i==4?new java.util.Scanner(System.in).nextInt():j,i!=4?j="43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:".charAt(i)-48:"magic");}}

Eminim Groovy bunun çoğundan kurtulacaktır.

Açıklama ve biçimlendirme (tüm yorumlar, yeni satırlar ve baştaki / sondaki boşluklar sayılır):

Oldukça yalındır ama

//boilerplate
class A{
   public static void main(String[]a){
      //i is current/left number, j right/next number.  i=4 signals to start
      //by reading input
      int i=4,j=0;
      for(;;)
         //print in the form "<left> is <right>."
         System.out.printf(
            "%d is %s.%n",
            i=i==4?
               //<left>: if i is 4 <left> will be a new starting number
               new java.util.Scanner(System.in).nextInt():
               //otherwise it's the next val
               j,
            i!=4?
               //use string to map number to its length (:;< come after 9 in ASCII)
               //48 is value of '0'.  store in j for next iteration
               j="43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:".charAt(i)-48:
               //i==4 is special case for right; print "magic"
               "magic");
   }
}

Düzenleme: Artık onaltılık kullanma, bu daha az tuş vuruşu demektir


1
249, ithalat, sınıf tanımı veya ana def.
Mark Peters

1
Bu şeytanca. 16. (+1) tabanını beğendim
Platinum Azure

Sen kullanarak bir boşluk kurtarabilecek String[]ayerine String[] a.
BalusC

Teşekkürler @Balus, ayrıca onaltılık ayrıştırma kullanmak yerine karakter üzerinde basit aritmetik yaparak bir grup ortadan kaldırıldı.
Mark Peters

@Mark Peters: Daha da kötü. Buna kıyasla çok vanilya hissediyorum.
Platinum Azure

9

Windows PowerShell: 152 153 184 bayt

önceki çözüme dayalı olarak, diğer çözümlerden daha fazla etkilenerek

$o="03354435543668877988"
for($input|sv b;($a=$b)-4){if(!($b=$o[$a])){$b=$o[$a%10]-48+"66555766"[($a-$a%10)/10-2]}$b-=48-4*!$a
"$a is $b."}'4 is magic.'

10'un katlarını ("doksan sıfır" yerine "doksan") desteklemek için düzeltildi.
Gabe

Hey @Gabe :), teşekkürler; son zamanlarda golf oynamak için fazla zamanım olmadı. Yine de, $inputbir numaralandırıcıyı doğrudan int; stringilk geçerken işe
Joey

8

C, 158 karakter

main(n,c){char*d="03354435543668877988";for(scanf("%d",&n);n-4;n=c)printf("%d is %d.\n",n,c=n?n<19?d[n]-48:d[n%10]-"_,**+++)**"[n/10]:4);puts("4 is magic.");}

(aslında Vlad'ın Python koduna dayanıyordu, Tom Sirgedas'ın C ++ çözümünden birkaç karakter daha sıkıştırmak için bir numara ödünç aldı)

genişletilmiş sürüm:

main(n, c) {
    char *d = "03354435543668877988";
    for (scanf("%d",&n); n-4; n = c)
        printf("%d is %d.\n", n, c = n ? n<19 ? d[n]-48 : d[n%10] - "_,**+++)**"[n/10]  : 4);
    puts("4 is magic.");
}

Benim için işe yaramıyor gibi görünüyor: ./magic 10 10, -27. Segmentasyon hatası
Casey

@Casey - scanf () çağrısı biraz kabataslaktı. Bir karaktere int okuyordu. OSX'te kaçıyordum ve Windows'ta işe yaradı ama çıkışta çöktü. Böylece tekrar n & c ints yaptım. İnt anahtar kelimesini K&R gösterimini kullanarak parametreler yaparak bırakabileceğimi fark ettim. Sonuç daha güvenli ve bir karakter daha kısadır.
Ferruccio

" 466555766" [n / 10] + d [n% 10] -96'yı d [n% 10] - " , +++) " [n / 10] ile değiştirerek 3 karakter kaydedebilirsiniz
Tom Sirgedas

6

Python, 129 133 137 148 karakter

Bir ısınma olarak, işte ilk sürümüm (önceki en iyi Python'a göre birkaç karakter geliştiriyor).

PS. Birkaç redaksiyondan sonra şimdi yaklaşık yirmi karakter daha kısadır:

n=input()
while n-4:p=(922148248>>n/10*3&7)+(632179416>>n%10*3&7)+(737280>>n&1)+4*(n<1);print n,'is %d.'%p;n=p
print'4 is magic.'

6

C #: 210 Karakter.

Ezilmiş:

using C=System.Console;class B{static void Main(){int
x=0,y=int.Parse(C.ReadLine());while(x!=4)C.Write((x=y)+" is {0}.\n",x==4?"magic":""+(y=x==0?4:"03354435543668877988"[x<20?x:x%10]+"0066555766"[x/10]-96));}}

Genişletilmiş:

using C=System.Console;
class B
{
    static void Main()
    {
        int x=0,y=int.Parse(C.ReadLine());
        while(x!=4)
            C.Write((x=y)+" is {0}.\n",
                x==4?
                     "magic":
                     ""+(y= x==0?
                                4:
                                "03354435543668877988"[x<20?x:x%10]+
                                "0066555766"[x/10]-96)
                   );
    }
}

Bu yaklaşımın kullandığı püf noktaları:

  • Numarada görünen rakamlara göre numara adı uzunlukları için bir arama tablosu oluşturun.
  • Bir dizede karakter dizisi aramasını ve sayısal dizi yerine karakter aritmetiğini kullanın.
  • Sınıf adı takma adını kısaltmak Console.için kullanınC.
  • ?:Bunun yerine koşullu (üçlü) operatörü ( ) kullanın if/else.
  • Kullanım \nile Writeçıkış kodu yerineWriteLine
  • C # 'ın tanımlı bir değerlendirme sırasına sahip olduğu gerçeğini kullanarak Writeİşlev çağrısı
  • Ekstra ifadeleri ve dolayısıyla fazladan kaşlı ayraçları ortadan kaldırmak için atama ifadelerini kullanın

int[] zihtiyacı olmadığı için daha kısa olacaktırnew[]
Joey

Dizi araması yerine karakter aritmetiği kullanılacak şekilde revize edildi.
LBushkin

@ mdm20: Haklısın. Arama tablosunda bir hata yaptım. Şimdi düzeltildi.
LBushkin

On ikinci kez cazibe: * D
LBushkin

Bir Hızlıca 5 karakterleri kaydetmek için: döküm daha kısa "magic"etmek object, olacaktır örtülü çağrı ToString()üzerine yekleyerek "". Çünkü, +daha yüksek önceliğe sahiptir ?:, içeri koymak zorunda gerçek yerine bir parçası yanlış parçası: x!=4?y+"":"magic".
P Daddy

6

Perl: 148 karakter

(Perl: 233 181 212 206 200 199 198 185 179 149 148 karakter)

  • İstisnalar karması birim dizisine taşındı. Bu benim çok sayıda karakteri kesebilmeme neden oldu :-)
  • mobrule kötü bir hataya işaret etti. Hızlı düzeltme 31 karakter ekler, ah!
  • Sıfır özel durum için yeniden düzenlendi, hafif golf de yapıldı.
  • Diziye depolamak yerine tek kullanımlık doğrudan liste erişimi? Tabi lan!
  • Sadece bir kanlı karakter için ÇOK ÇOK REFAKTÖR. Bu gerçekten bir golfçünün hayatıdır. :-(
  • Hata! Beyaz boşluk düzeltmesi kolay. 198 şimdi.
  • Bazı gereksiz kodlar yeniden düzenlendi.
  • İçindeki son dönen anahtar kelime rİçindeki gereksiz, biraz daha kesildi.
  • Yorum başına kapsamlı yeniden düzenleme; ne yazık ki sadece 149'a ulaşabildim çünkü hem önceki kodumda hem de yorum yapanların sürümlerinde mevcut olan bir hatayı düzeltmem gerekiyordu.
  • Yalancı kelime "sihri" deniyor.

Perl'de mütevazı bir girişimle bu topu yuvarlayalım.

@u=split'','4335443554366887798866555766';$_=<>;chop;print"$_ is ".($_=$_==4?0:$_<20?$u[$_]:($u[$_/10+18]+($_%10&&$u[$_%10]))or magic).".
"while$_

Hileler:

Çok fazla!


ACK! Asla bilemeyeceğim nasıl asla test etmedim.
Platinum Azure

Orada ölü kodunuz var mı? $ U [0] 4 olduğunda, sıfır için özel durumun nasıl gerekli olduğunu anlamıyorum. Kodunuzun 166 karakterlik görünüşte çalışan bir versiyonuna sahibim ve bence bundan biraz daha kısaltmak için yer var.
hobbs

@hobbs: İyi nokta, tekrar bakacağım. Hikaye şu ki, birkaç revizyonun yarısını aldım ve aniden bazı şeyler kırıldı (yaklaşık 4 -> 0 yapmayı seçtiğim noktada). Sanırım bu noktada haklısın :-)
Platinum Azure

Kendimi harika bir Perl programcısı olarak görmüyorum, ancak bazı karakterleri azaltabilirsiniz: @u=split$x,'43350435543668877988';virgülleriniz gereksiz 19 karakter kullanıyor, undefher karakterde bölmelerde bölünüyor, $xtanımsız bir değişken olarak "undef" yerine kullanıyorum - toplam tasarruf: 11 karakter. Ayrıca, mgirişi çıkarın ve chomppuanınızdan başka bir karakterin traş olmasını sağlayın.
vol7ron

Daha iyi yapmak, ama yine kaybederek daha kaydedebilir sub rtamamen - sadece onu bir kez kullanın ve yapabilirsiniz hatta Pars olmadan tek iç içe üçlü tarafından hepsini yerine. : My versiyonu şu anda 144 karakter olan gist.github.com/473289
Hobbs

5

JavaScript 1.8 (SpiderMonkey) - 153 Karakter

l='4335443554366887798866555766'.split('')
for(b=readline();(a=+b)-4;print(a,'is '+b+'.'))b=a<20?l[a]:+l[18+a/10|0]+(a%10&&+l[a%10])
print('4 is magic.')

Kullanım: echo 42 | js golf.js

Çıktı:

42 is 8.
8 is 5.
5 is 4.
4 is magic.

Bonus ile - 364 karakter

l='zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty thirty fourty fifty sixty seventy eighty ninety'.split(' ')
z=function(a)a<20?l[a]:l[18+a/10|0]+(a%10?' '+l[a%10]:'')
for(b=+readline();(a=b)-4;print(z(a),'is '+z(b)+'.'))b=z(a).replace(' ','').length
print('four is magic.')

Çıktı:

doksan dokuz on eder.
on üçtür.
üç beştir.
beş, dörttür.
dört sihirdir.

4

Haskell, 224 270 karakter

o="43354435543668877988"
x!i=read[x!!i]
n x|x<20=o!x|0<1="0066555766"!div x 10+o!mod x 10
f x=zipWith(\a b->a++" is "++b++".")l(tail l)where l=map show(takeWhile(/=4)$iterate n x)++["4","magic"]
main=readLn>>=mapM putStrLn.f

Ve biraz daha okunaklı -

ones = [4,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8]
tens = [0,0,6,6,5,5,5,7,6,6]

n x = if x < 20 then ones !! x else (tens !! div x 10) + (ones !! mod x 10)

f x = zipWith (\a b -> a ++ " is " ++ b ++ ".") l (tail l)
    where l = map show (takeWhile (/=4) (iterate n x)) ++ ["4", "magic"]
    
main = readLn >>= mapM putStrLn . f

4

C ++ Stdio sürümü, küçültülmüş: 196 karakter

#include <cstdio>
#define P;printf(
char*o="43354435543668877988";main(int p){scanf("%d",&p)P"%d",p);while(p!=4){p=p<20?o[p]-48:"0366555966"[p/10]-96+o[p%10]P" is %d.\n%d",p,p);}P" is magic.\n");}

C ++ Iostreams sürümü, küçültülmüş: 195 karakter

#include <iostream>
#define O;std::cout<<
char*o="43354435543668877988";main(int p){std::cin>>p;O p;while(p!=4){p=p<20?o[p]-48:"0366555966"[p/10]-96+o[p%10]O" is "<<p<<".\n"<<p;}O" is magic.\n";}

Orijinal, küçültülmemiş: 344 karakter

#include <cstdio>

int ones[] = { 4, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8 };
int tens[] = { 0, 3, 6, 6, 5, 5, 5, 9, 6, 6 };

int n(int n) {
    return n<20 ? ones[n] : tens[n/10] + ones[n%10];
}

int main(int p) {
    scanf("%d", &p);
    while(p!=4) {
        int q = n(p);
        printf("%i is %i\n", p, q);
        p = q;
    }
    printf("%i is magic\n", p);
}

Sabit. Biraz da kısalttı.
Mike DeSimone

Güzel yapılmış. (20 karakterlik std bilmecesine çok güldüm!)
Platinum Azure

Evet, bu gerçek bir kafa vurucuydu, ta ki #definebirkaç jetonun yerini alabileceği için daha da kısa olacaktı.
Mike DeSimone

printf("is magic".\n)=> puts. printf("%d",p)=> puts(atoi(p)). Sadece daha kısa değil, aynı zamanda daha hızlı.
Ben Voigt

2
@Mike DeSimone: while(p!=4)Kısaltılabileceğini düşünüyorum while(p-4). Bütün bir karakter biliyorum ama yine de. :-)
Platinum Azure

3

Delphi: 329 karakter

Tek Satır Versiyonu:

program P;{$APPTYPE CONSOLE}uses SysUtils;const S=65;A='EDDFEEDFFEDGGIIHHJII';B='DGGFFFJGG';function Z(X:Byte):Byte;begin if X<20 then Z:=Ord(A[X+1])-S else Z:=(Ord(B[X DIV 10])-S)+Z(X MOD 10)end;var X,Y:Byte;begin Write('> ');ReadLn(X);repeat Y:=Z(X);WriteLn(Format('%d is %d.',[X,Y]));X:=Y;until X=4;WriteLn('4 is magic.');end.

Biçimlendirilmiş:

program P;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  S = 65;
  A = 'EDDFEEDFFEDGGIIHHJII';
  B = 'DGGFFFJGG';

function Z(X:Byte):Byte;
begin
  if X<20
  then Z := Ord(A[X+1])-S
  else Z := (Ord(B[X DIV 10])-S) + Z(X MOD 10);
end;

var
  X,Y: Byte;

begin
  Write('> ');
  ReadLn(X);

  repeat
    Y:=Z(X);
    WriteLn(Format('%d is %d.' , [X,Y]));
    X:=Y;
  until X=4;

  WriteLn('4 is magic.');
end.

Muhtemelen biraz daha sıkmak için yer var ... :-P


3

C # 314 286 283 274 289 273 252 karakter.

Ezilmiş:

252 

Normal:

using C = System.Console;
class P
{
    static void Main()
    {
        var x = "4335443554366877798866555766";
        int m, o, v = int.Parse(C.ReadLine());
        do {
            C.Write("{0} is {1}.\n", o = v, v == 4 ? (object)"magic" : v = v < 20 ? x[v] - 48 : x[17 + v / 10] - 96 + ((m = v % 10) > 0 ? x[m] : 48));
        } while (o != 4);
        C.ReadLine();
    }
}

Edit Dykam: Oldukça dikkatli eklemeler ve değişiklikler yaptı:

  • Bir döküm içine l.ToString () değiştirildi objectarasında string "magic".
  • Geçici bir değişken oluşturdu o, böylece döngünün breakdışına çıkabilecektim for, yani bir do-while.
  • Atamayı satır içine aldı, oatamayı da yap, vhesaplamayı lfonksiyon argümanlarına eklemeye devam ederek ihtiyacını ortadan kaldır l. Ayrıca ödevini de satır içine aldı m.
  • İçinde bir boşluk kaldırıldı int[] x, int[]xaynı zamanda okunaklı.
  • Diziyi bir dizi dönüşümüne dönüştürmeye çalıştım, ancak using System.Linqbunu bir iyileştirme yapmak için çok fazlaydı.

Edit 2 Dykam int dizisi bir char dizisi / dizgesine değiştirildi, bunu düzeltmek için uygun aritmik eklendi.


Evet, Java sürümünden daha kısa.
Dykam

3

Lua, 176 Karakter

o={[0]=4,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8}t={3,6,6,5,5,5,7,6,6}n=0+io.read()while n~=4 do a=o[n]or o[n%10]+t[(n-n%10)/10]print(n.." is "..a..".")n=a end print"4 is magic."

veya

  o={[0]=4,3,3,5,4,4
  ,3,5,5,4,3,6,6,8,8
  ,7,7,9,8,8}t={3,6,
   6,5,5,5,7,6,6}n=
   0+io.read()while
   n ~= 4 do a= o[n
   ]or o[n%10]+t[(n
   -n%10)/10]print(
n.." is "..a.."." )n=a
end print"4 is magic."

3

C - numaralı kelimeler olmadan

180 175 * 172 167 karakter

Tüm yeni satırlar okunabilirlik içindir ve kaldırılabilir:

Biraz küçültülmemiş:

* Önceki sürüm, spesifikasyonun iki kısmındaki işareti kaçırdı: sıfırı ele almadı ve stdin yerine komut satırında girdi aldı. Sıfır eklenen karakterlerin işlenmesi, ancak komut satırı argümanları yerine stdin kullanılması daha da fazla tasarruf sağlayarak net bir tasarruf sağlar.


2

perl, 123 122 karakter

STDOUT'a çıktı verme zorunluluğu olmadığını anladım, bu yüzden bunun yerine STDERR'a çıktı verin ve başka bir karakteri devre dışı bırakın.

@u='0335443554366887798866555766'=~/./g;$_+=<>;warn"$_ is ",$_=$_-4?$_<20?$u[$_]||4:$u[chop]+$u[$_+18]:magic,".\n"until/g/

Ve hecelenen sayıları döndüren bir sürüm:

279 278 276 280 karakter

@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("",One,Two,Three,Four,Five,@p[3..6],Ten,Eleven,Twelve,map$_.teen,@p);s/u//for@m=map$_.ty,Twen,@p;$n[8].=t;sub n{$n=shift;$n?$n<20?$n[$n]:"$m[$n/10-2] $n[$n%10]":Zero}$p+=<>;warnt$m=n($p)," is ",$_=$p-4?n$p=()=$m=~/\w/g:magic,".\n"until/c/

Spesifikasyonları karşılasa da,% 100 iyi biçimlendirilmemiştir. Sıfırla biten sayılardan sonra fazladan bir boşluk döndürür. Spesifikasyon diyor ki:

"Jetonları nasıl ayırdığınız umurumda değil, ancak birbirlerinden ayrılmaları gerekir"

Bu biraz sinsi olsa da. Daha doğru bir versiyon

282 281 279 283 karakter

@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("\x8",One,Two,Three,Four,Five,@p[3..6],Ten,Eleven,Twelve,map$_.teen,@p);s/u//for@m=map$_.ty,Twen,@p;$n[8].=t;sub n{$n=shift;$n?$n<20?$n[$n]:"$m[$n/10-2]-$n[$n%10]":Zero}$p+=<>;warn$m=n($p)," is ",$_=$p-4?n$p=()=$m=~/\w/g:magic,".\n"until/c/

1

Python:

#!/usr/bin/env python

# Number of letters in each part, we don't count spaces
Decades = ( 0, 3, 6, 6, 6, 5, 5, 7, 6, 6, 0 )
Smalls  = ( 0, 3, 3, 5, 4, 4, 3, 5, 5, 4 )
Teens  =  ( 6, 6, 8, 8, 7, 7, 9, 8, 8 )

def Count(n):
    if n > 10 and n < 20: return Teens[n-11]
    return   Smalls[n % 10 ] + Decades [ n / 10 ]

N = input()

while N-4:
    Cnt = Count(N)
    print "%d is %d" % ( N, Cnt)
    N = Cnt

print "4 is magic"

4
Bunu sevdim. Muhtemelen biraz daha sıkılaştırabilirsin.
Josh K

@Vlad: Girdi, bağımsız değişkenler yerine stdin'den okunmalıdır. Bu, sadece kullanabileceğiniz N = input()(veya raw_input()) ve malzemeleri ortadan kaldırabileceğiniz anlamına gelir sys.
kennytm

Ayrıca küçüklerin gençleri de içermesini sağlayabilirsiniz, bu durumda if ifadesi yalnızca "eğer n <20: Smalls [n] döndür" olur. 10'a kadar olan modül nedeniyle Smalls hala> = 20 durumunda çalışacaktır.
Jon Smock

5
Bu, she-banggolf sahası cevabında (tamamen isteğe bağlı) ilk defa görüyorum ;-)
ChristopheD

İyi bir başlangıç ​​gibi görünüyor ... Kesinlikle sıkılaştırın, Python bile bu boşlukların TÜMÜNE ihtiyaç duymaz. :-) Ayrıca, Ferruccio'nun da işaret ettiği gibi, 0 çalışmıyor, özellikle sonsuz döngüye giriyor gibi görünüyor.
Platinum Azure

1

C ++, 171 karakter (#include atlandı)

void main(){char x,y,*a="03354435543668877988";scanf("%d",&x);for(;x-4;x=y)y=x?x<19?a[x]-48:"_466555766"[x/10]+a[x%10]-96:4,printf("%d is %d.\n",x,y);puts("4 is magic.");}

Bence bunu C olarak düşünürseniz, ihtiyacını ortadan kaldırabilirsiniz #includeçünkü fonksiyonların sadece intparametre alacağı varsayılacaktır . Hatta maindönüş yaparak bir vuruştan tasarruf edebilirsiniz int.
Gabe

1

Ruby, 164 karakter

n=gets.to_i;s="03354435543668877987";if n==0;puts"0 is 4.";else;puts"#{n} is #{n=(n<20)?s[n]-48:"0066555766"[n/10]-48+s[n%10]-48}." until n==4;end;puts"4 is magic."

kodu çözüldü:

n = gets.to_i
s = "03354435543668877987"
if n == 0
  puts "0 is 4."
else
  puts "#{n} is #{n = (n < 20) ? s[n] - 48 : "0066555766"[n / 10] - 48 + s[n % 10] - 48}." until n == 4
end

puts "4 is magic."

Basit tutan güzel Ruby çözümü. :-) (+1)
Platinum Azure

Basit tutmak, fazla uzun tutmak için bir mazeret değil ;-)
Joey

Sanırım 'if n == 0' yerine 'if! N'
Vincent

2
Ruby'de mi? Her zaman false ve nil dışındaki tüm değerlerin doğru olarak değerlendirildiğini düşünmüşümdür :-(
Platinum Azure

1

Lua 185 190 199

eklenen dönemler, io.read eklendi, son baskıda kaldırıldı ()

 n=io.read();while(n~=4)do m=('43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:'):sub(n+1):byte()-48;print(n,' is ',m,'.')n=m;end print'4 is magic.'

satır sonlarıyla

 n=io.read()
 while (n~=4) do
    m=('43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:'):sub(n+1):byte()-48;
    print(n,' is ',m,'.')
    n=m;
 end 
 print'4 is magic.'

n=io.read()Standart girişten sayı okumak için kurala uymak için bir (+11 karakter) gerekir. Değişen print('4 is magic.')için print'4 is magic.'2 karakter kazandıracak. ;Sonra kaldırıldığında )1 karakter tasarruf edilir. printKullanarak virgül hile gibi görünüyor, ama Spec belirsizdir. print(n,'is',m,'.')2 karakter kaydetmek için de değiştirebilirsin .
gwell

Lua'da virgül satırsonu olarak tek başına mı işlenir? Kullanmayalı epey oldu.
Nick Van Brunt

Virgüller, sekmeler olarak oluşturulur.
gwell

0

PhP Kodu

function get_num_name($num){  
    switch($num){  
        case 1:return 'one';  
    case 2:return 'two';  
    case 3:return 'three';  
    case 4:return 'four';  
    case 5:return 'five';  
    case 6:return 'six';  
    case 7:return 'seven';  
    case 8:return 'eight';  
    case 9:return 'nine';  
    }  
}  

function num_to_words($number, $real_name, $decimal_digit, $decimal_name){  
    $res = '';  
    $real = 0;  
    $decimal = 0;  

    if($number == 0)  
        return 'Zero'.(($real_name == '')?'':' '.$real_name);  
    if($number >= 0){  
        $real = floor($number);  
        $decimal = number_format($number - $real, $decimal_digit, '.', ',');  
    }else{  
        $real = ceil($number) * (-1);  
        $number = abs($number);  
        $decimal = number_format($number - $real, $decimal_digit, '.', ',');  
    }  
    $decimal = substr($decimal, strpos($decimal, '.') +1);  

    $unit_name[1] = 'thousand';  
    $unit_name[2] = 'million';  
    $unit_name[3] = 'billion';  
    $unit_name[4] = 'trillion';  

    $packet = array();    

    $number = strrev($real);  
    $packet = str_split($number,3);  

    for($i=0;$i<count($packet);$i++){  
        $tmp = strrev($packet[$i]);  
        $unit = $unit_name[$i];  
        if((int)$tmp == 0)  
            continue;  
        $tmp_res = '';  
        if(strlen($tmp) >= 2){  
            $tmp_proc = substr($tmp,-2);  
            switch($tmp_proc){  
                case '10':  
                    $tmp_res = 'ten';  
                    break;  
                case '11':  
                    $tmp_res = 'eleven';  
                    break;  
                case '12':  
                    $tmp_res = 'twelve';  
                    break;  
                case '13':  
                    $tmp_res = 'thirteen';  
                    break;  
                case '15':  
                    $tmp_res = 'fifteen';  
                    break;  
                case '20':  
                    $tmp_res = 'twenty';  
                    break;  
                case '30':  
                    $tmp_res = 'thirty';  
                    break;  
                case '40':  
                    $tmp_res = 'forty';  
                    break;  
                case '50':  
                    $tmp_res = 'fifty';  
                    break;  
                case '70':  
                    $tmp_res = 'seventy';  
                    break;  
                case '80':  
                    $tmp_res = 'eighty';  
                    break;  
                default:  
                    $tmp_begin = substr($tmp_proc,0,1);  
                    $tmp_end = substr($tmp_proc,1,1);  

                    if($tmp_begin == '1')  
                        $tmp_res = get_num_name($tmp_end).'teen';  
                    elseif($tmp_begin == '0')  
                        $tmp_res = get_num_name($tmp_end);  
                    elseif($tmp_end == '0')  
                        $tmp_res = get_num_name($tmp_begin).'ty';  
                    else{  
                        if($tmp_begin == '2')  
                            $tmp_res = 'twenty';  
                        elseif($tmp_begin == '3')  
                            $tmp_res = 'thirty';  
                        elseif($tmp_begin == '4')  
                            $tmp_res = 'forty';  
                        elseif($tmp_begin == '5')  
                            $tmp_res = 'fifty';  
                        elseif($tmp_begin == '6')  
                            $tmp_res = 'sixty';  
                        elseif($tmp_begin == '7')  
                            $tmp_res = 'seventy';  
                        elseif($tmp_begin == '8')  
                            $tmp_res = 'eighty';  
                        elseif($tmp_begin == '9')  
                            $tmp_res = 'ninety';  

                        $tmp_res = $tmp_res.' '.get_num_name($tmp_end);  
                    }  
                    break;  
            }  

            if(strlen($tmp) == 3){  
                $tmp_begin = substr($tmp,0,1);  

                $space = '';  
                if(substr($tmp_res,0,1) != ' ' && $tmp_res != '')  
                    $space = ' ';  

                if($tmp_begin != 0){  
                    if($tmp_begin != '0'){  
                        if($tmp_res != '')  
                            $tmp_res = 'and'.$space.$tmp_res;  
                    }  
                    $tmp_res = get_num_name($tmp_begin).' hundred'.$space.$tmp_res;  
                }  
            }  
        }else  
            $tmp_res = get_num_name($tmp);  
        $space = '';  
        if(substr($res,0,1) != ' ' && $res != '')  
            $space = ' ';  
        $res = $tmp_res.' '.$unit.$space.$res;  
    }  

    $space = '';  
    if(substr($res,-1) != ' ' && $res != '')  
        $space = ' ';  

    if($res)  
        $res .= $space.$real_name.(($real > 1 && $real_name != '')?'s':'');  

    if($decimal > 0)  
        $res .= ' '.num_to_words($decimal, '', 0, '').' '.$decimal_name.(($decimal > 1 && $decimal_name != '')?'s':'');  
    return ucfirst($res);  
}  

//////////// test yapmak ////////////////

 $str2num = 12;
    while($str2num!=4){
        $str = num_to_words($str2num, '', 0, '');  
        $str2num = strlen($str)-1;
        echo $str . '=' . $str2num .'<br/>';
        if ($str2num == 4)
            echo 'four is magic';
    }

////// Sonuçlar /////////

Twelve =6
Six =3
Three =5
Five =4
four is magic

4
@wallacoloo: Kötü bir dil için iğrenç bir çözüm: D
Thomas Eding

5
Veya çok daha kısa 178 karakter:$l='4335443554366887798866555766';for($b=(int)fgets(fopen('php://stdin','r'));($a=$b)-4;){$b=$a<20?$l[$a]:$l[18+$a/10]+($a%10?$l[$a%10]:0);echo"$a is $b.\n";}echo"4 is magic.\n";
gnarf

Güzel şaka. :-D Çok iyi programlanmış.
Tom Pažourek

0

Perl - 130 karakter


5.12.1 (130 karakter) 121 123 132 136 140

#        1         2         3         4         5         6         7         8         9        100        11        12        13       14    
#23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123

@u='4335443554366887798866555766'=~/./g;$_=pop;say"$_ is ",$_=$_-4?$_<20?$u[$_]:$u[$_/10+18]+(($_%=10)&&$u[$_]):magic,"."until/\D/


5.10.1 (134 karakter) 125 127 136 140 144

#        1         2         3         4         5         6         7         8         9        100        11        12        13       14    
#23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234

@u='4335443554366887798866555766'=~/./g;$_=pop;print"$_ is ",$_=$_-4?$_<20?$u[$_]:$u[$_/10+18]+(($_%=10)&&$u[$_]):magic,".\n"until/\D/


Tarihi değiştir:

20100714:2223- mobrule'un dikkatinde değişiklik geri alındı , ancak ($_%10&&$u[$_%10])(($_%=10)&&$u[$_]), bu aynı karakter sayısı, ancak birisinin onu iyileştirmenin bir yolunu görmesi durumunda yaptım

20100714:0041- split//,'...''...'=~/./g
20100714:0025- ($_%10&&$u[$_%10])$u[$_%10]
20100713:2340- while$_until/\D/+ gereksiz parantezleri kaldırdı
20100713:xxxx- $=<>;chop;$_=pop;- mobrule nezaketi


Not: Başkalarının yanıtlarını yorumlarda iyileştirmekten bıktım, bu yüzden şimdi açgözlüyüm ve değişikliklerimi buraya ekleyebilirim :) Bu, Platinum Azure'un cevabından bir ayrımdır - kısmen Hobbs , mobrule ve Platin Azure .


Eğer kurtuldum zaman $_%10&&...yapı, sen girişler 20,30,40 için spesifikasyonları kırdı ...
mob

+1 Harika. Bununla birlikte, stdin'den bağımsız değişkenlere geçtiniz :-(
Platinum Azure

Sağ, yerine :) veya .. ARGVile doldurulur , teknik olarak STDINecho bar | xargs perl foo.pl
yankıdan

0

Sayı Kelimeli Utanmaz Perl (329 karakter)

p()C olanlar yerine Perl ilkelleri ve çoğunlukla yeniden yazılmış bir ana döngü kullanarak aynı şeyi yapması için bazı ince ayarlarla P Daddy'nin C kodundan oldukça doğrudan uyarlandı. Açıklama için onunkine bakın. Yeni satırların tümü isteğe bağlıdır.

@t=(qw(zero one two three four five six sM eight nine
tL elM twelve NP 4P fifP 6P 7P 8O 9P twLQ NQ forQ fifQ
6Q 7Q 8y 9Q en evL thir eL tO ty 4SmagicT)," is ",".\n");
sub p{local$_=$t[pop];1while s/[0-Z]/$t[-48+ord$&]/e;
print;length}$_=<>;chop;while($_-4){
$_=($_>19?(p($_/10+18),$_&&print("-"),$_%=10)[0]:0)+p$_;
p 35;p$_;p 36}p 34

Yan not: Perl'in printtrue / false döndürmesi çok kötü ; bir sayı döndürürse bana 7 vuruş kurtarırdı.


0

Ruby, 141 karakter:

n=gets.to_i;m="4335443554366887798866555766";loop{s=n;n=n>20?m[18+n/10]+m[n%10]-96: m[n]-48;puts"#{s} is #{n==s ? 'magic': n}.";n==s &&break}

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.