Réponse à la vie, l'univers et tout ce qui existe

46

Tâche

Avec une chaîne en entrée, votre tâche consiste à sortir 42 uniquement si la chaîne en entrée se trouve exactement comme suit:

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

Il peut générer toute autre valeur, générer une erreur ou ne pas générer de sortie, si l’entrée n’est pas égale à la chaîne susmentionnée.


Critère gagnant

C'est du , donc le code le plus court en octets gagne!

Mateen Ulhaq
la source
La plupart des solutions fournies ici sont incorrectes car elles impriment 42 lorsque la chaîne est plus longue que la chaîne souhaitée et que le préfixe correspond à la chaîne souhaitée.
FRDDDY
@froddy: Et si les seuls personnages? après la chaîne (est | sont) un saut de ligne? Mon mécanisme d’entrée habituel ne me soucie pas de savoir si l’entrée est terminée par un saut de ligne, mais donne la même chose dans les deux cas, par exemple.
Joey
@ fR0DDY: Il n'y avait pas de définition claire sur la façon dont le reste de l'entrée devrait être traité, donc il n'y a pas de «faux» ici.
PatrickvL
3
@PatrickvL Il mentionne 'seulement' si l'entrée est la chaîne donnée. Donc, abbcccddddeeeee...zzabcne satisfait pas cela, je suppose et je peux voir certains programmes donner un oui à cette entrée.
fr0ddy
2
@ fR0DDY: Permettez-moi de formuler les choses autrement: il n'y a pas de spécification sur la manière dont l'entrée est délimitée, donc c'est ouvert à interprétation. Il n’ya pas non plus mention du codage de caractères (je suppose que la plupart d’entre nous supposons que leur environnement est celui par défaut - ANSI, UTF8 et UTF16LE seront les plus populaires). En outre, aucune mention de la manière dont l'entrée est présentée - est-elle entrée via l'entrée standard, via un paramètre de ligne de commande? Vous voyez donc que toute cette liberté cède la place à une interprétation que vous qualifieriez d '"incorrecte", alors que d'autres jugeraient qu'elle est "conforme". NOFI, mais c'est une pratique quotidienne pour certains d'entre nous.
PatrickvL

Réponses:

20

Golfscript, 20

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

avec nouvelle ligne, 21 caractères (par Nabb)

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

En fait, Nabb a battu le mien, voici la solution originale pour une nouvelle ligne, 22 caractères

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

Il s’agit simplement de générer une chaîne source et de la comparer à la chaîne stdin.

TOI
la source
3
26,{).[96+]*}%n+=42`*pour 21 (y compris newline).
Nabb
Heh, ça ne marche pas sans ça n+parce que le tableau n'est pas plat. Vous devrez soit conserver vos 20 caractères d'origine, soit ajouter un ~pour aplatir les termes internes du tableau.
Nabb
@Nabb, heheh, je n'avais pas réalisé que newline le rendait différent.
VOUS
13

Ruby 1.9, 46 42 39 caractères

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

Suppose que l’entrée ne se termine pas par une nouvelle ligne.

Ventero
la source
Qu'en est-il du newline from gets?
steenslag
2
@steenslag: Les spécifications ne disent rien, l'entrée étant terminée par une nouvelle ligne, cette solution suppose qu'il n'y en a pas.
Ventero
11

Programme C - 78 89

Éditer: N'imprimez pas quand il y a des caractères

Suppose que l'entrée n'a pas de nouvelle ligne.

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

Si le préfixe ne correspond pas, le programme se ferme. Si le préfixe correspond mais qu'il y a 1 à 3 caractères supplémentaires, est imprimé 2. Sinon, le comportement est indéfini.

Cela peut être raccourci d’un caractère en passant exit(1)à fork(). Oh, et sur une note indépendante, n'oubliez pas de sauvegarder tous les documents ouverts au cas où, pour une raison quelconque , votre système se bloquerait.

Joey Adams
la source
1
Ceci imprimera 42 si la chaîne est plus longue que la chaîne souhaitée et si le préfixe correspond à la chaîne souhaitée.
fr0ddy
8

PHP (60)

En supposant que l'entrée soit fournie dans la ligne de commande:

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

Explication : vous pouvez voir la chaîne comme une structure en triangle.

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

La ligne jcommence à l'index i = j*(j+1)/2(c'est la formule du nombre triangulaire). En résolvant l'équation quadratique, l'index iest en ligne j = int((sqrt(8*i+1)-1)/2)et contient donc du caractère 97 + int((sqrt(8*i+1)-1)/2). La 0-350plage d'index nous permet de simplifier cela 96.5 + sqrt(2*(i+1)), mais cela n'est plus le cas pour les valeurs plus grandes.

Edit : Basculé en entrée de ligne de commande comme suggéré dans les commentaires.
Edit : Utilise l'opérateur conditionnel pour sauvegarder un personnage

sam hocevar
la source
+1, ça marche;) Umm, pourriez-vous nous expliquer comment ça $s.=chr(96.5+sqrt($i+=2));marche?
Clyde Lobo
Édité. J'espère que cela a du sens :-)
sam hocevar
pour (; $ i <702;) $ s. = chr (96,5 + sqrt ($ i + = 2)); echo ($ s == $ argv [1]) * 42; Seulement 61 caractères, en supposant une entrée stdin
Viper_Sb
@Viper_Sb: merci pour l'allusion; Je n'étais pas sûr des règles, alors j'ai imité la solution de Clyde. Je vais avec votre suggestion.
Sam Hocevar
1
@powtac la syntaxe du langage ne nécessite pas d'espace
sam hocevar
7

Perl, 35 43

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

Nécessite Perl 5.10 ou une version ultérieure (exécuté avec -E), aucune nouvelle ligne en entrée.

J'ai mieux aimé mes regex d'effets secondaires, mais le code le plus court a été parlé. La voici en souvenir. Également destiné à Perl 5.10 ou ultérieur, mais uniquement aux fonctionnalités regex avancées / expérimentales, seule une poption de ligne de commande est nécessaire.

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42
JB
la source
Excellent. J'ai essayé de battre cette regex récursive mais je ne pouvais pas descendre en dessous de 43c. : - ((
bottes en caoutchouc du
Pourquoi est-il nécessaire de dire $a++."{$b}"au lieu de juste $a++.$b?
Timwi
@ Timwi parce que j'ai besoin de ces accolades pour apparaître dans la chaîne résultante. Je ne veux pas correspondre au littéral "d4", je veux "dddd", exprimé sous forme de regex "d {4}"
JB
Bien sûr. Merci de m'avoir expliqué!
Timwi
Entré avec une solution de 33 octets pour cela! Essayez-le en ligne!
Dom Hastings
7

05AB1E , 7 octets (non concurrents)

AƶJQi42

Essayez-le en ligne!

Explication

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

Juste en passant par quelques défis pour apprendre 05AB1E (et le golf en général). Ce défi a été marqué comme étant actif hier et j'ai trouvé une solution courte, alors pourquoi ne pas partager? :)

Cinari
la source
3
Bienvenue chez PPCG!
Steadybox
6

Programme Haskell - 71 67 64 57

Suppose qu'il n'y a pas de fin de ligne, et n'en génère pas non plus.

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

Usage:

$ 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
la source
1
Fwiw ce code est également toujours très lisible.
Dan Burton
1
Depuis les zipWitharrêts quand il atteint la fin de la liste plus courte, vous pouvez remplacer ['a'..'z']avec ['a'..]et économisez 3 caractères.
hammar
@hammar: Merci. J'ai enregistré 1 caractère supplémentaire en utilisant >> = (concatMap) au lieu de concat et zipWith.
Joey Adams
@hammar: sauvé encore plus en utilisant la notation do à la place de >> = et lambda :-)
Joey Adams
2
@ Joey: Ou même mieux:[c|c<-['a'..'z'],_<-['a'..c]]
hammar
4

J, 29

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

exemple:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42
Eelvex
la source
J'aime J. Et je le trouve moche et horrible. Et j'aime ça.
voir
4

D: 94 caractères

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

Plus lisiblement:

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
la source
3

Delphi, 164 132

Celui-ci construit une chaîne et la compare simplement au premier argument de ligne de commande. C'est plus court et moins délicat que mon autre soumission:

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.

(Notez que cette version suppose que les variables cet icommencent initialisées à 0, comme c'est le cas dans ma version de Delphi (2010).)

Comme mon autre soumission, celle-ci nécessite moins de caractères si la construction de chaîne ne se produit pas dans une fonction, comme je le faisais auparavant:

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.

Notez que la sortie n'a pas besoin d'une nouvelle ligne, donc WriteLn () est devenue Write ().

PatrickvL
la source
3

PHP - 45 caractères

Je suis surpris que personne n'ait posté de réponse utilisant le hachage. C'est un moyen très efficace de tester la chaîne exacte.

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

Les données sont un peu difficiles à copier / coller car il y a un octet nul au milieu du code. Voici un vidage hexadécimal du code à des fins de test.

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

HoLyVieR
la source
2
Intelligent! Bien qu’il existe techniquement d’autres valeurs en entrée donnant le même hachage, cela ne satisfait pas tout à fait l’exigence de sortie en 42 que si l’entrée est au format spécifié.
Mellamokb
3

Scala 79

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

Pyth, 14

*42qzsm*dhxGdG

Construit simplement la chaîne nécessaire, puis compare avec l'entrée et multiplie par 42.

isaacg
la source
"compare avec l'entrée et multiplie par 42." n’aurais jamais pensé à cela seul. Vous venez de m'aider à éliminer un personnage de ma solution. Merci.
AndoDaan
Argh, je suis venu trop tard. Pouvez-vous expliquer comment cela fonctionne? La fonction mme cause des ennuis…
Jim
1
@ Jim Nous commençons par la fonction map m, qui applique une fonction à chaque élément de son entrée. L'entrée est G, l'alphabet. xGdtrouve la position de d, le caractère dans l'alphabet, dans G, l'alphabet. haugmente cela de un, et *dreproduit le personnage autant de fois. En dehors de la mfonction, scombine la liste de chaînes résultante en une seule chaîne, puis qzvérifie si le résultat est égal à l'entrée. Les booléens sont représentés comme 0s'ils étaient False et 1si true, ce *42qui donne une valeur de 42si True et 0si False.
isaacg
3

Brachylog (2), 15 octets, défi linguistique après la date

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

Essayez-le en ligne!

Et maintenant, une réponse qui fonctionne sur un principe complètement différent de celui que nous avons le plus en vue ici. Il s'agit d'une soumission de fonction (la question ne spécifie pas le type de soumission souhaitée, mais les fonctions sont autorisées par défaut).

Explication

Cette réponse fonctionne en définissant une sorte de chaîne: celles qui a) contiennent toutes les lettres minuscules de l’alphabet, b) sont dans l’ordre trié et c) pour lesquelles le fait de prendre le nombre d’occurrences de chaque caractère de la chaîne produit une séquence de commandes consécutives. entiers à partir de 1. (Il doit être clair qu'il existe de nombreuses chaînes de ce type, mais celle que nous voulons casse est le plus court.) Ensuite, si la chaîne remplit ces critères, nous ajoutons 16 au nombre de caractères distincts dans le champ. chaîne; cela produira 42 si la chaîne est celle que la question nous demande, et au moins 43 dans tous les autres cas. (Si la chaîne échoue pour que l'un des critères appartienne à la catégorie, la fonction se terminera par un échec, ce qui revient à lancer une exception.)

Voici comment interpréter le code source:

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

la source
3

R, 60 58

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

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

Merci pour la suggestion de @giusppe

Kun Ren
la source
Je pense que tout pasteva bien ici, et vous pouvez utiliser scan(,"")au lieu de readline().
Giuseppe
2

Python (84)

Suppose un retour à la fin à la fin de l’entrée.

système d'importation
si ''. join (c * chr (c + 96) pour c dans la plage (27)) + '\ n' == sys.stdin.read (): print 42
Hoa Long Tam
la source
1
Pourquoi ne pas utiliser à la raw_inputplace sys.stdin.read?
Juan
1
@Juan: raw_inputne lit qu'une seule ligne; Je ne savais pas si "l'entrée" serait toujours une seule ligne ou s'il pourrait y avoir une entrée disqualifiante sur les lignes suivantes.
Hoa Long Tam
2

Python - 62 caractères

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42
gnibbler
la source
2
Peut - être plus court en Python 3: print("".join(x*chr(x+96)for x in range(27))==input())*42.
mbomb007
2

Perl, 49 46 caractères

à utiliser dans un programme, pas sur la ligne de commande

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

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

Cordialement

rbo

Edit: Idée extraite de Ventero

bottes en caoutchouc
la source
2

PHP 92 88 87 caractères

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

MODIFIER

Remplacé $j<0par $jet return $b==$a?42:0;avececho $b==$a?42:0;

Remplacé echo $b==$a?42:0;parecho($b==$a)*42;

Clyde Lobo
la source
2
Pourrait être 80 caractères si ce n'était pas pour tous les signes dollar freaking.
Joey Adams
Voir aussi mon entrée pour une solution à boucle unique.
Sam Hocevar
2

Prolog ECLiPSe - 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
la source
2

JavaScript (91 93 94 98 102 116 )

Utilisation:, a('string')retourne 42si valide selon les spécifications, ou 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/

Éditer : Supprimé varet éliminé deux espaces dans for (.

Modifier 2 : remplacé j>0par j, et

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

Edit 3 : Initialize iwith i='', change

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

Edit 4 : Change

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

Edit 5 : Change

  1. i=r='';while(i++<26) à
  2. for(i=r='';i++<26;) et
  3. for(j=i;j;j--) à
  4. for(j=i;j--;)
mellamokb
la source
Eh bien, vous pouvez réduire encore 12 caractères si vous n’utilisez pas varpour déclarer des variables;)
Clyde Lobo
@Clyde: Merci! J'ai aussi trouvé que je pouvais supprimer de l'espace entre for (.
Mellamokb
Ouais, était sur le point de suggérer la même chose;) Oh et j'ai codé une solution en PHP en utilisant la même logique que la vôtre
Clyde Lobo
Vous pouvez économiser 2 caractères en plus en les remplaçant return(z==r)?42:0;parreturn z==r?42:0
Clyde Lobo
j>0pourrait être juste jje pense.
VOUS
2

JavaScript 1.8, 99 caractères

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

Je te défie de donner un sens :)

Casey Chu
la source
2

PHP - 59

Suppose qu’au moins une entrée est fournie sur cli

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

Cela fonctionne plus ou moins, sauf que md5 is peut techniquement avoir des duplications avec l'algorithme de hachage.

syntaqx
la source
2

PowerShell v2 +, 47 octets

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

Construit une plage 1..26, le nourrit à travers une boucle avec |%{...}. Chaque itération, nous utilisons l' opérateur de virgule pour construire un littéral de tableau du courant [char]multiplié par le numéro de la boucle actuelle. Ensuite, nous -joinréunissons tous ces éléments pour construire la chaîne abbcccdddd..., puis nous utilisons une -ceqcomparaison sensible à la casse par rapport à notre entrée $args, ce qui entraînera un $TRUEou $FALSE. Dans PowerShell, les valeurs booléennes peuvent être implicitement converties sous la forme 1ou 0respectivement, ce qui se produit ici avec le 42*. Imprimera 42si et seulement si l'entrée est abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzzet si elle sortira 0.

AdmBorkBork
la source
vous pourriez économiser un octet :) Essayez-le en ligne!
Mazzy
2

K, 26 octets

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

Merci

Chromozorz
la source
{$[x~.Q.a@&1+!26;42;]}pour 22 octets.
streetster
1
42*(&!27)~-96+"j"$pour 18 octets (portant ma réponse OK ).
streetster
2

VBA 91

Il n'y a pas eu de réponses VBA mais cela fonctionne:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function
OSG
la source
Est-il vraiment impossible de supprimer un espace?
Esolanging Fruit
1
Version condensée, 61 octets -o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
Taylor Scott
@ Challenger5 Non, ce n'est pas impossible. Le commentaire de Taylor par Scott est exactement cela. Il s'exécute dans la fenêtre immédiate et prend la valeur de la cellule en A1tant qu'entrée.
Ingénieur Toast
2

APL (Dyalog) , 18 17 octets

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

Essayez-le en ligne!

Quatre octets évidents peuvent être sauvegardés si nous sommes autorisés à utiliser des majuscules.

42 42

/⍨ si (lit. répliqué par)

 saisie de caractères

 est identique à

819⌶ le minuscule

⎕AUn alphabet

/⍨ répliqué par

 un à travers

26 26

Adam
la source
1

Clojure - 61 caractères

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

Exploite les faits suivants:

  • Clojure peut interpréter n'importe quelle chaîne automatiquement comme une séquence de caractères
  • Je peux utiliser la plage de nombres de 1 à 26 pour créer les caractères et les répéter le nombre ou les temps corrects pour générer la saisie "correcte"
Mikera
la source
économiserait 6 caractères si Clojure permettait des # () s imbriqués ... demande de fonctionnalité importante pour Clojure 1.4 Je pense!
Mikera
1

Javascript 144

Probablement peut être considérablement amélioré, la récursion a toujours été une tête loin pour moi.

Comprimé

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

Moins Compressé

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

Celui-ci lit la chaîne à partir de l'entrée, la compare au fur et à mesure, écrit 42 quand l'entrée correspond jusqu'à la dernière 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.

Cette version n'utilise pas de fonction, ce qui enregistre pas mal de caractères par rapport à la version précédente de cette technique:

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.

Hélas un peu long, principalement à cause des longs mots-clés de Delphi et de la nécessité d'initialiser les applications de la console avant de pouvoir écrire la sortie.

Notez également que j'ai incrémenté CmdLine de 77 caractères, car c’était le décalage que je devais ignorer par mon chemin exécutable local (Delphi n’a pas de pointeur d’argument direct). Ajustez pour correspondre à votre propre configuration (peut entraîner 1 caractère de moins si le décalage <10).

PatrickvL
la source
Vous pouvez définir le type d'application sous ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication. En outre, vous pouvez omettre la program a;ligne. Et les crochets autour b^<>Char(c), i>0et i=27peuvent être supprimés.
Wouter van Nifterick
@Wouter van Nifterick: Merci pour les suggestions, je les appliquerai aussi à mes autres soumissions. (Je ne savais même pas que if i>0thenje compilerais!)
PatrickvL Le