Jawaban untuk kehidupan, alam semesta, dan segalanya

46

Tugas

Diberikan String sebagai input, tugas Anda adalah untuk menghasilkan 42 hanya jika String input kebetulan persis sebagai berikut:

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

Ini dapat menampilkan nilai lain, menghasilkan kesalahan atau tidak menghasilkan sama sekali, jika input tidak sama dengan String yang disebutkan di atas.


Kriteria Kemenangan

Ini adalah , jadi kode terpendek dalam byte menang!

Mateen Ulhaq
sumber
Banyak solusi yang disediakan di sini salah karena mereka mencetak 42 ketika string lebih panjang dari string yang diinginkan dan awalan cocok dengan string yang diinginkan.
fR0DDY
@froddy: Bagaimana jika satu-satunya karakter? mengikuti string (apakah | adalah) satu baris? Mekanisme input saya yang biasa tidak peduli apakah input diakhiri oleh satu baris atau tidak tetapi menghasilkan yang sama dalam kedua kasus, misalnya.
Joey
@ fR0DDY: Tidak ada definisi yang jelas tentang bagaimana sisa input harus ditangani, jadi tidak ada 'salah' di sini.
PatrickvL
3
@ Patrickrick Disebutkan 'hanya' jika inputnya adalah string yang diberikan. Jadi abbcccddddeeeee...zzabctidak memuaskan yang saya kira dan saya bisa melihat beberapa program memberikan ya pada input itu.
fR0DDY
2
@ fR0DDY: Biarkan saya katakan dengan cara lain: Tidak ada spesifikasi tentang bagaimana input dibatasi, jadi itu terbuka untuk interpretasi. Juga tidak disebutkan penyandian karakter (saya kira sebagian besar dari kita menganggap standar lingkungan mereka - ANSI, UTF8 dan UTF16LE akan menjadi yang paling populer). Juga tidak disebutkan bagaimana input disajikan - apakah dimasukkan melalui input standar, melalui parameter baris perintah? Jadi Anda lihat - memiliki semua kebebasan ini memberi jalan pada beberapa penafsiran yang Anda tandai sebagai 'salah', sementara yang lain akan menilai 'sesuai'. NOFI, tetapi ini adalah praktik sehari-hari bagi sebagian dari kita.
PatrickvL

Jawaban:

20

Golfscript, 20

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

dengan baris baru, 21 karakter (oleh Nabb)

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

Sebenarnya Nabb mengalahkan milikku, berikut ini solusi orisinil dengan lini baru, 22 karakter

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

Ini hanya menghasilkan string sumber dan hanya membandingkannya dengan string dari stdin.

KAMU
sumber
3
26,{).[96+]*}%n+=42`*untuk 21 (termasuk baris baru).
Nabb
Heh, itu tidak berfungsi tanpa n+karena array tidak rata. Anda harus menyimpan 20 karakter asli atau menambahkan ~untuk meratakan persyaratan bagian dalam array.
Nabb
@ Nabb, heheh, saya tidak menyadari baris baru membuatnya berbeda.
KAMU
13

Ruby 1.9, 46 42 39 karakter

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

Mengasumsikan input tidak diakhiri dengan baris baru.

Ventero
sumber
Bagaimana dengan baris baru dari dapatkan?
steenslag
2
@steenslag: Spesifikasi tidak mengatakan apa pun input dihentikan oleh baris baru, jadi solusi ini mengasumsikan tidak ada.
Ventero
11

Program C - 78 89

Sunting: Jangan mencetak 42 ketika ada karakter tambahan.

Asumsikan input tidak memiliki baris baru.

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

Jika awalan tidak cocok, program keluar. Jika awalan cocok tetapi ada 1-3 atau lebih karakter, cetak 2. Jika tidak, menghasilkan perilaku yang tidak ditentukan.

Ini dapat membuat satu karakter lebih pendek dengan mengubah exit(1)ke fork(). Oh, dan pada catatan yang tidak terkait, ingatlah untuk menyimpan dokumen terbuka apa pun , untuk alasan apa pun , sistem Anda akan terkunci.

Joey Adams
sumber
1
Ini akan mencetak 42 jika string lebih panjang dari string yang diinginkan dan awalan cocok dengan string yang diinginkan.
fR0DDY
8

PHP (60)

Dengan asumsi input disediakan di commandline:

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

Penjelasan : Anda dapat melihat string sebagai struktur segitiga.

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
      ...

Baris jdimulai pada indeks i = j*(j+1)/2(itulah rumus angka segitiga). Memecahkan persamaan kuadrat menghasilkan indeks iyang on line j = int((sqrt(8*i+1)-1)/2)dan karenanya mengandung karakter 97 + int((sqrt(8*i+1)-1)/2). Rentang 0-350indeks memungkinkan kami untuk menyederhanakannya 96.5 + sqrt(2*(i+1)), tetapi itu tidak berlaku untuk nilai yang lebih besar.

Sunting : Beralih ke input commandline seperti yang disarankan dalam komentar.
Sunting : Menggunakan operator kondisional untuk menyimpan karakter

sam hocevar
sumber
+1, itu berfungsi;) Umm, bisakah Anda menjelaskan bagaimana cara $s.=chr(96.5+sqrt($i+=2));kerjanya?
Clyde Lobo
Diedit. Saya harap masuk akal :-)
sam hocevar
untuk (; $ i <702;) $ s. = chr (96.5 + sqrt ($ i + = 2)); echo ($ s == $ argv [1]) * 42; Hanya 61 karakter, dengan asumsi input stdin
Viper_Sb
@ Viper_Sb: terima kasih atas petunjuknya; Saya tidak yakin tentang aturannya jadi saya meniru solusi Clyde. Saya akan pergi dengan saran Anda.
sam hocevar
1
@ Powowac sintaks bahasa tidak memerlukan ruang di sini
sam hocevar
7

Perl, 35 43

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

Membutuhkan Perl 5.10 atau lebih baru (dijalankan dengan -E), tidak ada baris baru dalam input.

Saya lebih suka efek samping regex saya, tetapi kode yang lebih pendek telah berbicara. Ini dia sebagai oleh-oleh. Juga dimaksudkan untuk Perl 5.10 atau lebih baru, tetapi hanya untuk fitur regex maju / eksperimental, jadi hanya popsi baris perintah yang diperlukan.

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42
JB
sumber
Luar biasa. Saya berusaha keras untuk mengalahkan regex w / rekursif ini tetapi tidak bisa mencapai di bawah 43c. : - ((
sepatu karet
Mengapa perlu mengatakan $a++."{$b}"bukan hanya $a++.$b?
Timwi
@Timwi karena saya perlu kawat gigi itu muncul di string yang dihasilkan. Saya tidak ingin mencocokkan dengan "d4" literal, saya ingin "dddd", dinyatakan sebagai regex "d {4}"
JB
Tentu saja. Terima kasih telah menjelaskan!
Timwi
Datang dengan solusi 33 byte untuk ini! Cobalah online!
Dom Hastings
7

05AB1E , 7 byte (tidak bersaing)

AƶJQi42

Cobalah online!

Penjelasan

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

Hanya melalui beberapa tantangan untuk belajar 05AB1E (dan bermain golf secara umum). Tantangan ini ditandai sebagai aktif kemarin dan saya menemukan solusi singkat, jadi mengapa tidak berbagi? :)

Cinari
sumber
3
Selamat datang di PPCG!
Steadybox
6

Program Haskell - 71 67 64 57

Mengasumsikan tidak ada baris baru, dan tidak menghasilkan satu baris pun.

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

Pemakaian:

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


$
Joey Adams
sumber
1
fwiw kode ini juga masih sangat mudah dibaca.
Dan Burton
1
Karena zipWithberhenti ketika mencapai akhir daftar yang lebih pendek, Anda dapat mengganti ['a'..'z']dengan ['a'..]dan menyimpan 3 karakter.
hammar
@hammar: Terima kasih. Saya menyimpan 1 char lebih dengan menggunakan >> = (concatMap) sebagai pengganti concat dan zipWith.
Joey Adams
@hammar: Disimpan lebih banyak lagi dengan menggunakan notasi alih-alih >> = dan lambda :-)
Joey Adams
2
@ Joey: Atau lebih baik lagi:[c|c<-['a'..'z'],_<-['a'..c]]
hammar
4

J, 29

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

contoh:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42
Eelvex
sumber
Saya suka J. Dan saya merasa jelek dan mengerikan. Dan saya menyukainya.
seequ
4

D: 94 Karakter

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

Lebih Jelas:

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

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

    s == t && writeln(42);
}
Jonathan M Davis
sumber
3

Delphi, 164 132

Yang ini membangun string dan membandingkannya dengan argumen baris perintah pertama. Ini lebih pendek dan tidak terlalu rumit daripada kiriman saya yang lain:

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.

(Perhatikan, bahwa versi ini mengasumsikan bahwa cdan ivariabel mulai diinisialisasi pada 0, seperti halnya dalam versi saya Delphi (2010).)

Seperti kiriman saya yang lain, yang ini membutuhkan lebih sedikit karakter jika pembuatan string tidak terjadi dalam suatu fungsi, seperti yang saya lakukan sebelumnya:

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.

Perhatikan bahwa output tidak memerlukan baris baru, jadi WriteLn () menjadi Write ().

PatrickvL
sumber
3

PHP - 45 karakter

Saya terkejut tidak ada yang diposting jawaban yang menggunakan hashing. Ini adalah cara yang sangat efisien untuk menguji string yang tepat.

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

Data agak sulit untuk menyalin / menempel karena ada null-byte di tengah kode. Berikut adalah hex-dump kode untuk keperluan pengujian.

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 ef 27 00 54 3f 3a 34 32 3b

HoLyVieR
sumber
2
Pintar! Meskipun karena secara teknis ada nilai input lain yang menghasilkan hash yang sama, itu tidak cukup memenuhi persyaratan untuk menghasilkan 42 hanya jika input dalam format yang ditentukan.
mellamokb
3

Scala 79

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

Pyth, 14

*42qzsm*dhxGdG

Hanya membangun string yang diperlukan, kemudian membandingkannya dengan input dan mengalikannya dengan 42.

isaacg
sumber
'bandingkan dengan input dan dikalikan dengan 42.' tidak akan pernah memikirkan itu sendiri. Anda hanya membantu saya mencukur 1 karakter dari solusi saya. Terima kasih.
AndoDaan
Argh, saya datang terlambat. Bisakah Anda menjelaskan cara kerjanya? Fungsinya mmenyebabkan saya kesulitan ...
Jim
1
@ Jim Kita mulai dengan fungsi peta m,, yang menerapkan fungsi ke setiap elemen inputnya. Inputnya adalah Galfabet. xGdmenemukan posisi d, karakter dalam alfabet, dalam G, alfabet. hmeningkatkan itu per satu, dan *dmereplikasi karakter sebanyak itu berkali-kali. Di luar mfungsi, sgabungkan daftar string yang dihasilkan menjadi satu string, kemudian qzperiksa apakah hasilnya sama dengan input. Boolean diwakili seolah- 0olah Salah dan 1jika benar, sehingga *42menghasilkan nilai 42jika Benar dan 0jika Salah.
isaacg
3

Brachylog (2), 15 byte, tantangan tanggal bahasa

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

Cobalah online!

Dan sekarang untuk jawaban yang bekerja pada prinsip yang sama sekali berbeda dengan yang paling banyak dilihat di sini. Ini adalah pengiriman fungsi (pertanyaan tidak menentukan jenis pengiriman apa yang diinginkan, tetapi fungsi diizinkan secara default).

Penjelasan

Jawaban ini bekerja dengan mendefinisikan semacam string: yang a) berisi semua huruf kecil dari alfabet, b) dalam urutan, dan c) yang mengambil jumlah kemunculan setiap karakter dalam string menghasilkan urutan berturut-turut bilangan bulat mulai dari 1. (Seharusnya jelas bahwa ada banyak string seperti itu, tetapi yang kita ingin kasus khusus adalah yang terpendek.) Kemudian jika string memenuhi kriteria tersebut, kita menambahkan 16 ke jumlah karakter berbeda dalam tali; ini akan menghasilkan 42 jika string adalah satu pertanyaan yang meminta kita untuk kasus khusus, dan setidaknya 43 dalam semua kasus lainnya. (Jika string gagal salah satu kriteria untuk masuk ke dalam kategori, fungsi akan berakhir dengan kegagalan, yang seperti melempar pengecualian.)

Berikut cara menafsirkan kode sumber:

⊇Ạ∧?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}

sumber
3

R, 60 58

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

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

Terima kasih atas sarannya oleh @giusppe

Kun Ren
sumber
Saya pikir pastetidak apa-apa di sini, dan Anda dapat menggunakannya scan(,"")sebagai gantinya readline().
Giuseppe
2

Python (84)

Mengasumsikan baris tambahan di akhir input.

impor sys
jika ''. join (c * chr (c + 96) untuk c dalam kisaran (27)) + '\ n' == sys.stdin.read (): cetak 42
Hoa Long Tam
sumber
1
Kenapa tidak digunakan raw_inputsaja sys.stdin.read?
Juan
1
@Juan: raw_inputhanya membaca satu baris; Saya tidak yakin apakah "input" akan selalu menjadi satu baris atau apakah akan ada input yang didiskualifikasi pada baris selanjutnya.
Hoa Long Tam
2

Python - 62 karakter

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42
gnibbler
sumber
2
Bisa lebih pendek di Python 3: print("".join(x*chr(x+96)for x in range(27))==input())*42.
mbomb007
2

Perl, 49 46 karakter

untuk digunakan dalam suatu program, bukan pada baris perintah

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

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

Salam

rbo

Sunting: Ide yang diambil dari Ventero

sepatu karet
sumber
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;}

SUNTING

Diganti $j<0dengan $jdan return $b==$a?42:0;denganecho $b==$a?42:0;

Diganti echo $b==$a?42:0;denganecho($b==$a)*42;

Clyde Lobo
sumber
2
Bisa jadi 80 karakter jika bukan karena semua tanda dolar yang menakutkan.
Joey Adams
Juga lihat entri saya untuk solusi loop tunggal.
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).
coredump
sumber
2

JavaScript (91 93 94 98 102 116 )

Penggunaan:, a('string')mengembalikan 42jika valid menurut spesifikasi, atau 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/

Sunting : Dihapus vardan dihilangkan dua spasi di for (.

Sunting 2 : Diubah j>0menjadi j, dan

  1. return (z==r)?42:0; untuk
  2. return z==r?42:0

Sunting 3 : Inisialisasi idengan i='', ubah

  1. (z==r)?42:0 untuk
  2. (z==r)*42

Sunting 4 : Ubah

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

Sunting 5 : Ubah

  1. i=r='';while(i++<26) untuk
  2. for(i=r='';i++<26;) dan
  3. for(j=i;j;j--) untuk
  4. for(j=i;j--;)
mellamokb
sumber
Nah Anda dapat mengurangi 12 karakter lain jika Anda tidak menggunakan varuntuk mendeklarasikan variabel;)
Clyde Lobo
@Clyde: Terima kasih! Juga menemukan saya dapat menghapus ruang antara for (.
mellamokb
Ya, akan menyarankan hal yang sama;) Oh dan saya mengkodekan solusi dalam PHP menggunakan logika yang sama seperti milik Anda
Clyde Lobo
Anda dapat menyimpan 2 char lainnya dengan menggantinya return(z==r)?42:0;denganreturn z==r?42:0
Clyde Lobo
j>0bisa saja jsaya kira.
ANDA
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

Saya menantang Anda untuk membuatnya masuk akal :)

Casey Chu
sumber
2

PHP - 59

Asumsikan setidaknya 1 input diberikan pada klien

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

Ini lebih atau kurang berfungsi, kecuali bahwa md5 secara teknis dapat memiliki duplikasi dengan hashing algo.

syntaqx
sumber
2

PowerShell v2 +, 47 byte

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

Membangun rentang 1..26, mengumpankannya melalui loop dengan|%{...} . Setiap iterasi kami menggunakan operator koma untuk membangun array literal dari arus [char]dikalikan dengan nomor loop saat ini. Kami kemudian -joinbersama-sama membangun string abbcccdddd...dan kemudian menggunakan -ceqperbandingan case-sensitive terhadap input kami $args, yang akan menghasilkan salah satu $TRUEatau $FALSE. Di PowerShell, nilai Boolean dapat secara implisit dilemparkan sebagai 1atau 0, masing-masing, yang terjadi di sini dengan 42*. Akan mencetak 42jika inputnya abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzdan akan menampilkan 0sebaliknya.

AdmBorkBork
sumber
Anda bisa menghemat satu byte :) Coba online!
mazzy
2

K, 26 Bytes

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

Terima kasih

Chromozorz
sumber
{$[x~.Q.a@&1+!26;42;]}selama 22 byte.
streetster
1
42*(&!27)~-96+"j"$untuk 18 byte (porting jawaban oK saya ).
streetster
2

VBA 91

Tidak ada jawaban VBA tetapi ini berfungsi:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function
OSG
sumber
Apakah benar-benar mustahil untuk menghapus spasi putih dari ini?
Buah Esolanging
1
Versi Ringkas, 61 byte -o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
Taylor Scott
@ Challenger5 Tidak, bukan tidak mungkin. Komentar Taylor Scott persis seperti itu. Ini berjalan di Jendela Segera dan mengambil nilai dari sel A1sebagai input.
Engineer Toast
2

APL (Dyalog) , 18 17 byte

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

Cobalah online!

Empat byte jelas dapat disimpan jika kita diizinkan menggunakan huruf besar.

42 42

/⍨ if (lit. direplikasi oleh)

 input karakter

 identik dengan

819⌶ yang lebih rendah

⎕ASebuah lfabet

/⍨ direplikasi oleh

 satu lewat

26 26

Adm
sumber
1

Clojure - 61 karakter

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

Memanfaatkan fakta-fakta berikut:

  • Clojure dapat menafsirkan string apa pun secara otomatis sebagai urutan karakter
  • Saya dapat menggunakan rentang angka dari 1 hingga 26 untuk membuat karakter dan mengulanginya dengan angka atau waktu yang tepat untuk menghasilkan input "benar"
mikera
sumber
akan menghemat 6 karakter jika Clojure diizinkan # () s ..... permintaan fitur penting untuk Clojure 1.4 Saya rasa!
mikera
1

Javascript 144

Mungkin bisa ditingkatkan secara signifikan, rekursi selalu menjadi hal yang jauh bagi saya.

Terkompresi

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};

Kurang Terkompresi

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"));
Tom Gullen
sumber
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.

Yang ini membaca string dari input, membandingkannya saat berjalan, menulis 42 ketika input cocok sampai yang terakhir 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.

Versi ini tidak menggunakan fungsi, yang menyimpan beberapa karakter jika dibandingkan dengan versi sebelumnya dari teknik ini:

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.

Sayangnya agak lama, sebagian besar karena kata kunci yang panjang Delphi, dan kebutuhan untuk menginisialisasi aplikasi konsol sebelum mereka dapat menulis output.

Perhatikan juga bahwa saya menambah CmdLine dengan 77 karakter, karena itu adalah offset yang saya perlukan untuk melewati executablepath lokal saya (Delphi tidak memiliki pointer argumen langsung). Sesuaikan agar sesuai dengan pengaturan Anda sendiri (bisa menyebabkan 1 karakter lebih sedikit saat offset <10).

PatrickvL
sumber
Anda dapat mengatur jenis aplikasi di bawah ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication. Anda juga dapat menghilangkan program a;garis. Dan kurung di sekitar b^<>Char(c), i>0dan i=27bisa dilepas.
Wouter van Nifterick
@Wouter van Nifterick: Terima kasih atas sarannya, saya akan menerapkannya pada kiriman saya yang lain juga. (Saya bahkan tidak tahu if i>0thenakan dikompilasi!)
PatrickvL