Hayata, evrene ve her şeye cevap


46

Görev

Girdi olarak bir String verildiğinde, göreviniz 42 yalnızca Girdi dizisi tam olarak aşağıdaki olduğunda gerçekleşir:

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

Girdi yukarıda belirtilen Dize eşit değilse, başka bir değer verebilir, bir hata üretebilir veya hiç çıkmayabilir.


Kazanan Kriter

Bu , yani bayttaki en kısa kod kazanır!


Burada verilen çözümlerin çoğu yanlıştır, çünkü dize istenen dizgiden daha uzun olduğunda ve önek istenen dize ile eşleştiğinde 42 yazdırırlar.
fR0DDY

@froddy: Ya sadece karakterler? dizeden sonra (is | are) satır sonu geliyor mu? Her zamanki giriş mekanizmam, girişin bir satır sonu ile sonlandırılıp sonlandırılmayacağını umursamıyor, ancak her iki durumda da aynı şeyi veriyor.
Joey,

@ fR0DDY: Girişin geri kalanının nasıl kullanılması gerektiği konusunda net bir tanım yoktu, bu yüzden burada 'yanlış' bir şey yok.
PatrickvL

3
@PatrickvL Girilen verilen dize ise 'sadece' yazıyor. Öyleyse abbcccddddeeeee...zzabctatmin etmiyor ve bu girdiden evet veren bazı programlar görebiliyorum.
fR0DDY

2
@ fR0DDY: Başka bir yolla söyleyeyim: Girişin nasıl sınırlandırılacağına dair bir açıklama yok, bu yüzden yoruma açık. Ayrıca karakter kodlamasından da söz edilmiyor (Sanırım çoğumuz çevrelerinin varsayılanını varsayıyoruz - ANSI, UTF8 ve UTF16LE en popülerleri olacak). Ayrıca girişin nasıl sunulduğunu da belirtmeyin - standart giriş üzerinden, bir komut satırı parametresiyle mi girildi? Görüyorsunuz - tüm bu özgürlüğe sahip olmak, “yanlış” olarak işaretleyeceğiniz bazı yorumlara yol açarken, diğerleri bunu “uyumlu” olarak değerlendirir. NOFI, ama bu bazılarımız için günlük pratik.
PatrickvL

Yanıtlar:


20

Golf Yazısı, 20

26,{.97+\{.}*}%=42`*

yeni hat ile 21 karakter (Nabb tarafından)

26,{).[96+]*}%n+=42`*

Aslına bakarsan Nabb benimkini yendi, yeni hat için 22 karakterle orijinal çözüm

26,{.97+\{.}*}%n+=42`*

Bu sadece kaynak dizgenin oluşturulması ve dizgenin stdin'den dize ile karşılaştırılmasıdır.


3
26,{).[96+]*}%n+=42`*21 için (yeni satır dahil).
Nabb

Heh, n+dizi düz olmadığından çünkü o işe yaramadı . Orjinal 20 karakterinizi tutmak veya ~dizinin iç koşullarını düzeltmek için a eklemek zorundasınız .
Nabb

@ Nabb, heheh, newline'ın farklı yaptığını anlamadım.
SİZ

13

Yakut 1.9, 46 42 39 karakter

p (?a..?z).map{|a|a*$.+=1}*""==gets&&42

Girişin yeni bir satırla sonlandırılmadığını varsayar.


Peki ya yeni hattan ne haber?
steenslag

2
@ steenslag: Teknik özellikler girişin yeni bir satırla sonlandırıldığını söylemiyor, bu nedenle bu çözüm yok diye varsayıyor.
Havai

11

C programı - 78 89

Düzenleme: Fazladan karakterler olduğunda 42 yazdırmayın.

Girişin izleyen bir yeni satırı olmadığını varsayar.

main(i,j){for(i=1;i<27;i++)for(j=i;j--;getchar()==96+i?0:exit(1));puts("42"+!!gets(&i));}

Önek eşleşmezse, programdan çıkar. Önek eşleşiyor ancak 1-3 veya daha fazla karakter varsa, 2 yazdırır. Aksi takdirde tanımsız davranışlar üretir.

Bu değiştirerek bir karakter daha kısa yapılabilir exit(1)etmek fork(). Oh, ve ilgisiz bir notta, hangi nedenle olursa olsun , sisteminizin kilitlenmesi durumunda, açık olan tüm belgeleri kaydetmeyi unutmayın .


1
Bu, dize istenen dizgiden daha uzunsa ve önek istenen dize ile eşleşirse 42 yazdırılır.
fR0DDY

8

PHP (60)

Girişin komut satırında verildiğini varsayarsak:

for(;$i<702;)$s.=chr(96.5+sqrt($i+=2));echo$s!=$argv[1]?:42;

Açıklama : dizeyi üçgen yapısı olarak görüntüleyebilirsiniz.

j     i   val
0     0   a
1   1-2   bb
2   3-5   ccc
3   6-9   dddd
4 10-14   eeeee
5 15-20   ffffff
      ...

Satır jdizinde başlar i = j*(j+1)/2(bu üçgen sayı formülüdür). İkinci dereceden denklemin çözülmesi endeksin içevrimiçi olmasına j = int((sqrt(8*i+1)-1)/2)ve dolayısıyla karakter içermesine neden olur 97 + int((sqrt(8*i+1)-1)/2). 0-350İndeks aralığı bize bu basitleştirmek için izin verir 96.5 + sqrt(2*(i+1)), ama artık daha büyük değerler için de geçerli olduğunun.

Düzenleme : Yorumlarda önerildiği şekilde komut satırı girişine geçti.
Düzenleme : Bir karakteri kaydetmek için koşullu işleci kullanır.


+1, bu işe yarar;) Umm, lütfen nasıl $s.=chr(96.5+sqrt($i+=2));çalıştığını açıklar mısınız
Clyde Lobo

Düzenlenen. Umarım mantıklıdır :-)
sam hocevar 10:11

için (; $ i <702;) $ s = CHR (96.5 + sqrt ($ i + = 2).); echo ($ s == $ argv [1]) * 42; Sadece 61 karakter, stdin girişini varsayarsak
Viper_Sb 10:11

@Viper_Sb: ipucu için teşekkürler; Kurallardan emin değildim, bu yüzden Clyde'nin çözümünü taklit ettim. Senin önerinle gideceğim.
Sam hocevar

1
@powtac dil sözdizimi burada bir boşluk gerektirmez
sam hocevar

7

Perl, 35 43

map$s.=$_ x++$a,a..z;say 42if<>~~$s

İhtiyaç duyulan Perl 5.10 veya üstü (birlikte çalışır -E), girişte yeni satır yok.

Yan etkiler regex'imi daha çok sevdim, ancak daha kısa olan kod konuştu. İşte bir hatıra olarak. Ayrıca Perl 5.10 veya daha yenisi için tasarlanmıştır, ancak yalnızca gelişmiş / deneysel regex özellikleri için, yalnızca bir pkomut satırı seçeneği gereklidir.

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42

Mükemmel. Bu özyinelemeli regex yenmek için çok çalıştım ama 43c altında alamadım. : - ((
lastik çizmeler,

Söylemek $a++."{$b}"yerine neden söylemek gerekiyor $a++.$b?
Timwi

@Timwi çünkü bu tellerin ortaya çıkan dizgede görünmesine ihtiyacım var. Kelimenin tam anlamıyla "d4" ile eşleşmek istemiyorum, "dddd", regex "d {4}" olarak ifade ediliyor
JB

Tabii ki. Açıkladığınız için teşekkürler!
Timwi

Bunun için 33 baytlık bir çözüm geldi! Çevrimiçi deneyin!
Dom Hastings,

7

05AB1E , 7 bayt (rekabet etmeyen)

AƶJQi42

Çevrimiçi deneyin!

açıklama

A       push lowercase alphabet
 ƶ      lift every letter, push it and multiply it by its index
  J     join the list
   Qi   does it equal the input?
     42 push 42 and output implicitly

05AB1E'yi öğrenmek için bazı zorluklardan geçiyorum (ve genel olarak golf oynuyor). Bu zorluk dün aktif olarak işaretlendi ve kısa bir çözüm buldum, öyleyse neden paylaşmıyorsunuz? :)


3
PPCG'ye Hoşgeldiniz!
Steadybox

6

Haskell programı - 71 67 64 57

İzleyen bir satırsonu olmadığını varsayar ve birini de çıkarmaz.

f x|x==[c|c<-['a'..'z'],_<-['a'..c]]="42"
main=interact f

Kullanımı:

$ echo -n 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz' | { ./42; echo; }
42
$ echo -n 'something else' | { ./42; echo; }
42: 42.hs:1:0-54: Non-exhaustive patterns in function f


$

1
fwiw bu kodu da hala çok okunabilir.
Dan Burton

1
Yana zipWithdaha kısa listenin sonuna geldiğinde durur, sen yerini alabilir ['a'..'z']ile ['a'..]ve 3 karakterden kaydedin.
Hammar

@hammar: Teşekkürler. Concat ve zipWith yerine >> = (concatMap) kullanarak 1 karakter daha kazandım.
Joey Adams,

@hammar: >> = ve lambda :-) yerine do notasyonu kullanarak daha da fazla tasarruf edin
Joey Adams

2
@Joey: Ya da daha iyisi:[c|c<-['a'..'z'],_<-['a'..c]]
Hammar 0

4

J, 29

f=:42#~((>:#a.{~97+])i.26)-:]

örnek:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42

J'yi seviyorum. Çirkin ve korkunç buluyorum. Ve onu beğendim.
seequ

4

D: 94 Karakterler

void f(S)(S s){S t;foreach(i;0..26)t~=array(repeat(cast(char)(i+'a'),i+1));s==t&&writeln(42);}

Daha okunaklı:

void f(S)(S s)
{
    S t;

    foreach(i; 0 .. 26)
        t ~= array(repeat(cast(char)(i + 'a'), i + 1));

    s == t && writeln(42);
}

3

Delphi, 164 132

Bu bir dize oluşturur ve onu sadece ilk komut satırı argümanı ile karşılaştırır. Diğer gönderimden daha kısa ve daha az zor:

var s:string;c,i:int8;begin repeat s:=s+Char(c+97);i:=i-1;c:=c+Ord(i<0);if i<0then i:=c;until c=26;Write(42*Ord(s=ParamStr(1)));end.

(Bu sürümün, cve ideğişkenlerinin, Delphi (2010) sürümümde olduğu gibi 0'da başlatıldığını varsaydığını unutmayın .)

Diğer gönderimde olduğu gibi, dize oluşturma daha önce yaptığım gibi bir işlevde gerçekleşmezse, bu karakterin daha az karaktere ihtiyacı vardır:

Delphi, 181

program a;{$APPTYPE CONSOLE}function s(c,i:byte):string;begin if(i>0)then Exit(Char(c)+s(c,i-1));if(c<122)then Exit(s(c+1,c-95));end;begin if(s(97,1)=ParamStr(1))then Write(42);end.

Çıktının yeni bir satıra ihtiyacı olmadığına dikkat edin, bu nedenle WriteLn () Write () oldu.


3

PHP - 45 karakter

Sürpriz, hiç kimsenin kullanılan karma bir cevabı yayınlamadığını düşünüyorum. Tam dize için test çok etkili bir yöntemdir.

echo md5($argv[1],1)!='¯è a@ÛÚƒ:ïT�p'?:42;

Verileri kopyalamak / yapıştırmak zordur, çünkü kodun ortasında boş bir bayt vardır. İşte test amaçlı kodun bir on altı dökümü.

65 63 68 6f 20 6d 64 35 28 24 61 72 67 76 5b 31 5d 2c 31 29 21 3d 27 af e8 a0 61 40 db da 7f 11 0f 83 3a ef 54 00 70 27 3f 3a 34 32 3b


2
Zeki! Teknik olarak bu aynı karıĢı veren diğer girdi değerleri olmasına rağmen, yalnızca girdi belirtilen formattaysa 42 çıktısı gereksinimini tam olarak karşılamamaktadır .
mellamokb

3

Scala 79

 if((for(i <- 1 to 26;j<-1 to i)yield(96+i).toChar).mkString==args(0))print(42)

3

Pyth, 14

*42qzsm*dhxGdG

Sadece gerekli dizgeyi kurar, sonra girdiyle karşılaştırır ve 42 ile çarpar.


'giriş ile karşılaştırır ve 42 ile çarpar.' Bunu asla kendi başıma düşünemezdim. Sen benim çözümümden 1 karakter almama yardım et. Teşekkürler.
AndoDaan

Argh, çok geç geldim. Nasıl çalıştığını açıklayabilir misiniz? Fonksiyon mbeni belaya sokuyor…
Jim

1
@Jim Girişinin mher bir elemanına bir fonksiyon uygulayan map fonksiyonu ile başlıyoruz . Giriş, Galfabedir. alfabedeki karakterin, içindeki alfabenin xGdkonumunu bulur . Bunu bir artırır ve karakteri bu kadar çoğaltır. İşlev dışında, sonuçta elde edilen dizgiler listesini tek bir dizgede birleştirir, ardından sonucun girişe eşit olup olmadığını kontrol eder. Booleans, False ve true ise temsil edilir , bu nedenle True ve False ise bir değerle sonuçlanır . dGh*dmsqz01*42420
isaacg

3

Brachylog (2), 15 bayt, dil kayıt sonrası mücadelesi

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆

Çevrimiçi deneyin!

Ve şimdi burada en çok görülenlerden tamamen farklı bir prensipte çalışan bir cevap için. Bu bir işlev bildirimidir (soru, ne tür bir gönderimin isteneceğini belirtmez, ancak işlevlere varsayılan olarak izin verilir).

açıklama

Bu cevap, bir tür string tanımlayarak çalışır: a) alfabenin tüm küçük harflerini içerenler, b) sıralama düzeninde olanlar ve c) bunlar için dizideki her karakterin oluşum sayısını almak için ardışık bir dizi üretir. 1'den başlayarak tamsayılar (Bu tür çok sayıda dize olduğu açık olmalıdır, ancak özel durum için istediğimiz en kısa olandır.) Daha sonra dize bu ölçütleri yerine getirirse, karakter dizisindeki farklı karakterlerin sayısına 16 ekleriz. dize; Bu, eğer soru, özel durum için bize sorarsa, diğer durumlarda en az 43 olanı ise 42 üretecektir. (Dize, kategoriye ait herhangi bir kriterden başarısız olursa, işlev bir istisna atmaya benzer bir şekilde başarısızlıkla sonuçlanır.)

Kaynak kodu nasıl yorumlayacağınız:

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆
⊇Ạ               {the input} contains all lowercase letters
  ∧              and
   ?o?           the input sorts to itself
                 {and; implied when two conditions overlap}
     ?ọ          the {character, number of occurrences} pairs for the input
       tᵐ        when the second element of each is taken
         ~       create an output that could have been produced by
          ⟦₁     outputting the list of integers from 1 to some input inclusive;
            +₁₆  add 16 to that input {and output it}

3

R, 60 58

if(readline()==paste0(rep(letters,1:26),collapse=""))cat(42)

if(scan(,"")==paste(rep(letters,1:26),collapse=""))cat(42)

@Giusppe tarafından öneri için teşekkürler


Bence pasteburada sorun yok ve scan(,"")yerine kullanabilirsiniz readline().
Giuseppe

2

Python (84)

Giriş sonunda izleyen bir yeni satır varsayar.

ithalat sistemi
''. (27) aralığında c için (c * chr (c + 96) birleşimi (+)) + '\ n' == sys.stdin.read (): yazdır 42

1
Neden raw_inputonun yerine kullanmıyorsun sys.stdin.read?
Juan,

1
@Juan: raw_inputsadece tek bir satır okur; "Giriş" in her zaman tek bir satır mı olacağından veya daha sonraki satırlarda giriş diskalifiye edilip edilmeyeceğinden emin değildim.
Hoa Long Tam

2

Python - 62 karakter

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42

2
Python 3: 'te daha kısa olabilirdi print("".join(x*chr(x+96)for x in range(27))==input())*42.
mbomb007

2

Perl, 49 46 karakter

bir programda kullanılacak, komut satırında değil

$..=chr($+96)x$ for 1..26;$.eq(pop)&&print '42'

join('',map$_ x++$x,'a'..'z')eq pop&&print'42'

Saygılarımızla

rbo

Düzenleme: Fikir Ventero'dan yırtıldı


2

PHP 92 88 87 karakter

function _($a){for($i=97;$i<123;$i++)for($j=$i-96;$j;$j--)$b.=chr($i);echo($b==$a)*42;}

DÜZENLE

Değiştirilen $j<0ile $jve return $b==$a?42:0;ileecho $b==$a?42:0;

Değiştirilen echo $b==$a?42:0;ileecho($b==$a)*42;


2
Tüm acayip dolar işaretleri için olmasaydı 80 karakter olabilir.
Joey Adams

Ayrıca tek döngülü bir çözüm için girişime bakın.
Sam hocevar

2

ECLiPSe Prolog - 173

c(_,[],_):-!. c(A,M,N):-length(L,N),checklist('='(A),L),append(F,L,M),P is N-1,B is A-1,c(B,F,P). ?- read_string(end_of_file,351,S),string_list(S,L),c(122,L,26),writeln(42).

2

JavaScript (91 93 94 98 102 116 )

Kullanımı:, Spesifikasyona göre geçerliyse a('string')döner 42, veya 0.

function a(z){for(i=r='';i++<26;)for(j=i;j--;)r+=String.fromCharCode(i+96);return(z==r)*42}

http://jsfiddle.net/g25M3/6/

Düzenleme : variçinde iki boşluk kaldırıldı ve ortadan kaldırıldı for (.

Düzenleme 2 : Değiştirilen j>0için jve

  1. return (z==r)?42:0; için
  2. return z==r?42:0

Düzenleme 3 : başlatma iile i='', değişim

  1. (z==r)?42:0 için
  2. (z==r)*42

Düzenleme 4 : Değiştir

  1. for(;i<27;i++) için
  2. while(i++<26)

Düzenleme 5 : Değiştir

  1. i=r='';while(i++<26) için
  2. for(i=r='';i++<26;) ve
  3. for(j=i;j;j--) için
  4. for(j=i;j--;)

varDeğişkenleri bildirmek için kullanmazsanız başka bir 12 karakter daha azaltabilirsiniz ;)
Clyde Lobo

@Clyde: Teşekkürler! Ayrıca aradaki boşluğu kaldırabilirim for (.
mellamokb

Evet, aynısını önermek üzereydi;) Oh ve ben seninkiyle aynı mantığı kullanarak PHP'de bir çözüm kodladım
Clyde Lobo

Sen değiştirerek başka 2 karakter kaydedebilirsiniz return(z==r)?42:0;ilereturn z==r?42:0
Clyde Lobo

j>0sadece jdüşünüyorum olabilir.
SİZ

2

JavaScript 1.8, 99 karakter

function c(x)(x.replace(/([a-z])\1*/g,function(m)!(a-m.length)*m.charCodeAt(0)-96-a++,a=1)==0)*a+15

Bunu anlamaya cesaret edersin :)


2

PHP - 59

Cli üzerinden en az 1 giriş sağlandığını varsayar

echo md5($argv[1])!='afe8a06140dbda7f110f833aef540070'?:42;

Daha az ya da çok çalışır, md5'in teknik olarak karma algo ile kopyaları olması dışında.


2

PowerShell v2 +, 47 bayt

42*(-join(1..26|%{,[char]($_+96)*$_})-ceq$args)

Bir aralık oluşturur 1..26, bunu bir döngüden geçirir |%{...}. Her yineleme, virgül operatörünü kullanarak akımın [char]mevcut döngü numarasıyla çarpılan bir dizinin hazır bilgisini oluşturur . Sonra -joinhep birlikte dizesini oluşturmak için bu abbcccdddd...ve daha sonra bir harf duyarlı kullanmak -ceqbizim girişi karşı karşılaştırma $argsYa sonuçlanacak $TRUEveya $FALSE. PowerShell'de, Boolean değerleri tam olarak 1veya 0sırasıyla burada olduğu gibi kullanılabilir 42*. 42Girdi abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzçıktısı alınacaksa yazdırılacaktır , 0aksi takdirde çıktı alınacaktır .


Bir bayt kurtarabilirsin :) Çevrimiçi deneyin!
mazzy

2

K, 26 Bayt

{(::;42)x~,/(1+!26)#'.Q.a}
{(::;42)x~,/(1+!26)#'.Q.a}"hello"
{(::;42)x~,/(1+!26)#'.Q.a}"abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz"
42

Teşekkürler


{$[x~.Q.a@&1+!26;42;]}22 bayt için
streetster

1
42*(&!27)~-96+"j"$için 18 bayt (benim taşıma OK cevabı).
streetster,

2

VBA 91

Herhangi bir VBA cevabı yoktu ama bu işe yarıyor:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function

Bundan herhangi bir boşluk kaldırmak gerçekten imkansız mıdır?
Esolanging Fruit

1
Yoğunlaştırılmış Versiyon, 61 bayt -o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
Taylor Scott

@ Challenger5 Hayır, imkansız değil. Taylor'ın Scott yorumu tam olarak bu. Komut Penceresinde çalışır ve değeri hücreden A1girdi olarak alır .
Mühendis Toast,

2

APL (Dyalog) , 18 17 bayt

42/⍨⍞≡819⌶⎕A/⍨⍳26

Çevrimiçi deneyin!

Büyük harf kullanmamıza izin verilirse, dört açık bayt kaydedilebilir.

42 42

/⍨ eğer (lit. tarafından kopyalandı)

 karakter girişi

 özdeştir

819⌶ küçük harfli

⎕ABir lphabet

/⍨ tarafından kopyalandı

 birinden

26 26


1

Clojure - 61 karakter

(fn[a](if(=(mapcat #(repeat%(char(+% 96)))(range 1 27))a)42))

Aşağıdaki gerçekleri açıklar:

  • Clojure herhangi bir dizgiyi otomatik olarak bir karakter dizisi olarak yorumlayabilir.
  • Her iki karakteri de oluşturmak için 1'den 26'ya kadar olan sayıları kullanabilirim ve "doğru" girdi üretmek için bunları doğru sayı veya süreleri tekrarlayabilirim.

Clojure yuvalanmış # () s ..... izin verirseniz 6 karakter kaydeder ..... Clojure 1.4 için önemli özellik isteği bence!
mikera

1

Javascript 144

Muhtemelen önemli ölçüde geliştirilebilir, özyineleme her zaman benim için uzak bir kafa olmuştur.

Sıkıştırılmış

function r(a,b,d,c){c++;if(b<d)a+=r(a,b+1,d,c);for(i=0;i<c;i++)a=String.fromCharCode(b)+a;return a}function q(a){if(q==r(a,97,122,0))return 42};

Daha az sıkıştırılmış

function r(s, c, x, w){        
    w++;
    if(c < x)
        s += r(s, c + 1, x, w);
    for(i = 0; i < w; i++)
        s = String.fromCharCode(c) + s;              
    return s;
}
function q(z){
    if(q==r(z,97, 122, 0))
        return 42;            
}

alert(q("rgrg"));

1

Delphi, 127

var b:Char;c,i:Int8;begin repeat if i<0then i:=c;Read(b);if c+97<>Ord(b)then Exit;i:=i-1;c:=c+Ord(i<0)until i=27;Write(42);end.

Bu, dizgeyi girişten okur, girdiği gibi karşılaştırır, girişte sonuna kadar eşleştiğinde 42 yazar z.

Delphi, 157

var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if b^<>Char(c)then Exit;Dec(i);if i>0then Continue;c:=c+1;i:=c-96;until i=27;Write(42);end.

Delphi, 188

program a;{$APPTYPE CONSOLE}var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if(b^<>Char(c))then Exit;Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);Write(42);end.

Bu sürüm, bu tekniğin önceki sürümüyle karşılaştırıldığında oldukça az karakter kaydeden bir işlev kullanmıyor:

Delphi, 213

program a;{$APPTYPE CONSOLE}function t(b:pchar;c,i:byte):byte;begin repeat Inc(b);if(b^<>Char(c))then Exit(0);Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);t:=42;end;begin WriteLn(t(CmdLine+77,97,1));end.

Ne yazık ki, Delphi'nin uzun anahtar kelimeleri, ve konsol uygulamalarını çıktı yazmadan önce başlatmaları gerektiğinden, biraz uzun sürüyor.

Ayrıca, CmdLine'ı 77 karakter artırdığımı ve yerel executablepath'i atlamam gereken ofset olduğu için (Delphi'nin doğrudan bir argüman işaretçisine sahip olmadığını) unutmayın. Kendi kurulumunuza uyacak şekilde ayarlayın (ofset <10 olduğunda 1 karakter daha az olabilir).


Uygulama türünü ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication altında ayarlayabilirsiniz. Ayrıca, program a;satırı atlayabilirsiniz . Ve parantez etrafında b^<>Char(c), i>0ve i=27kaldırılabilir.
Wouter van Nifterick

@Wouter van Nifterick: Önerileriniz için teşekkürler, diğer önerilerime de uygulayacağım. ( if i>0then
Derleyeceğimi
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.