Inspiré par le malheureux tri des chiffres sans utiliser de tableau , mais je pensais que cela faisait un meilleur code de golf que la question SO.
Étant donné un entier positif, triez les chiffres de cet entier.
Le score le plus bas gagne!
- Commencez avec 0 points.
- Ajoutez un point par caractère.
- Ajoutez 20 points pour chaque tableau que vous utilisez.
- Ajoutez 10 points pour chaque chaîne à plusieurs caractères de votre code. (Sauf l'entrée initiale tant qu'elle est convertie en entier sans aucune autre opération sur elle.)
- Ajoutez 32 points si le nombre maximum de chiffres que votre programme peut gérer est limité par votre programme (par opposition à la machine).
- Soustrayez 10 points si votre code peut changer la direction du tri en fonction d'un autre argument (tout ce que vous voulez, mais par exemple 0 pour le tri décroissant et 1 pour le croissant).
Chaque langue est différente, mais l'idée est d'éviter tout type de piratage à plusieurs chiffres.
Exemple:
Entrée : 52146729
Sortie : 97654221 ou 12245679
Remarques:
- Utilisez toutes les capacités de tri intégrées fournies par votre langage de programmation, mais si cette fonction de tri implique des chaînes ou des tableaux, prenez la peine!
- Vous pouvez écrire la solution en tant que fonction qui prend directement un entier ou en tant que programme qui prend un argument de argv, un fichier ou un flux et le convertit en entier. Tant que vous le convertissez immédiatement en entier et supprimez l'entrée char * d'origine sans effectuer d'autres opérations dessus, aucune pénalité ne s'applique.
- Les pénalités s'appliquent non seulement aux littéraux de chaîne dans le texte de votre programme, mais à toute partie de votre fonctionnalité de programme qui peut sans doute entrer ou sortir une chaîne ou itérable. Par exemple, JavaScript
String.prototype.split
a au moins une chaîne en entrée (this
) et un tableau en sortie, donc +30 pour l'utiliser. - J'ai essayé de faire en sorte que ces règles guident le principe de la conception de l'algorithme, pas les E / S initiales / finales (d'où la note # 2). Je ne pense pas que la pénalité devrait s'appliquer à
int(input())
même siinput
la signature indique qu'elle renvoie une chaîne, tant que cette expression est le point d'entrée initial du programme. De même, si la sortie finale du programme estprint(x)
etx
doit être une chaîne, la pénalité ne s'applique pas à l'opération de transtypage de chaîne de dernier fossé. Cela dit, je n'ai explicitement jamais dit qu'il fallait que ce soit un programme ou d'où les E / S devaient venir ou aller. Une fonction qui prend unint
et renvoie unint
servirait et ne souffrirait pas de ces ambiguïtés.
code-challenge
sorting
kojiro
la source
la source
" "
compte comme une chaîne à plusieurs caractères? Un seul personnage ne serait pas considéré comme "multi" ...Réponses:
GolfScript,
114(4 + 10 (chaîne) - 10 (option inverse))
Entrée sur STDIN.
Le format d'entrée est le suivant:
1
trier normalement,-1
inverser. 4 caractères - 10 pour l'option inverse = score de -6.L'entrée est techniquement une chaîne, donc je ne sais pas si cela compte pour +10. J'interprète la règle comme "une chaîne déclarée dans votre programme" (car elle dit "dans votre code").
Ancienne réponse (score de 11):
la source
~
immédiatement converti en entier. Mais il est ensuite reconverti en chaîne avec`
. La conversion en chaîne compte-t-elle? Parce que parfois la chaîne peut ne pas être multicaractère (entrée à 1 chiffre)chr
), ça va.Haskell 106
exemple:
Une réponse qui n'esquive pas la question.
Une explication a été demandée, ici elle n'est pas golfée. C'est une sorte de bulle très inefficace.
Des réponses plus courtes existent dans Haskell, équivalentes à certaines des autres publiées, par exemple:
... marque 52 + 20 = 72, ou ceci, marquant 45 + 20 = 65:
... mais l'esprit de la question - pas de tableaux, de chaînes ou de caractères - est plus intéressant.
la source
Integer.MAX_VALUE
-il en prend unint
. Le mien et certains autres acceptent n'importe quelle taille d'entrée - le type d'entrées
estInteger
, équivalentBigDecimal
en Java. Ce n'est pas ce que j'ai compris dans la question, je pensais que cela pénalisait les réponses qui ne «triaient» que des nombres à un chiffre.Ensemble C + x86, 636
Je sais que ça ne va pas gagner mais c'était tellement anormal et tordu que je devais le partager. Pas de tableaux ou de chaînes (tant que vous ne comptez pas les arguments d'entrée). Le nombre de chiffres est limité par la plage de 32 bits.
Voici donc une petite explication sur ce que j'ai fait:
Je pensais que je ferais cela sans utiliser de tableaux ou de chaînes, puis la récursivité est venue à l'esprit, mais bien sûr, avec la récursivité, je ne serais pas en mesure d'échanger les valeurs d'autres appels récursifs ... et c'est alors que j'ai réalisé que il y avait un moyen. Lier mon programme C avec une fonction d'assemblage Je pourrais sauter dans la pile et retourner un pointeur vers le pointeur de base de l'appel souhaité, c'est ce que fait la fonction "recursionStackAt". Bien sûr, recursionStackAt est une fonction très laide, son résultat ne dépend pas seulement de l'entrée ou de l'état du programme mais de l'appelant lui-même. Notez que c'est ce qui m'a fait changer les index de 0 à 1.
Sans plus tarder, voici le code:
Et bien sûr le code d'assemblage x86 (AT&T sintax, btw) pour la fonction recursionStackAt:
Quelques exemples sur la sortie: (1 signifie augmenter et 0 diminuer)
Voici la version obscurcie (qui est illisible mais fonctionne bien):
http://pastebin.com/XkYt9DLy (code C) http://pastebin.com/h0S0dfeU (code x86)
Donc, si LibreOffice ne ment pas, mon code obscurci se compose de 646 caractères (sans espaces, dois-je les compter?) Et avec toutes les autres conditions remplies, j'obtiens -10 pour le choix croissant / décroissant.
Oh, et pour compiler cela, vous devriez le faire (sur les systèmes de type Unix)
Notez que l'indicateur -m32 est uniquement si vous êtes sur une machine 64 bits. Vous avez également besoin des bibliothèques 32 bits pour le compiler.
la source
Bash (écho) (0 + 7 + 0 + 0 + 32-10) = 29
Sorta:
Usage:
Utilisez "-e" pour trier en sens inverse:
EDIT: changé "chat" en "écho" pour que cela fonctionne réellement. EDIT 2: Ajout de "$ *" et le mettre dans le script "sorta"
la source
-e
pourrait être utilisé comme argument pour la sortie inverse.Python3
Mes fonctionnalités de script:
Pas de tableaux
Pas de chaînes
La complexité est O (n): j'ai utilisé countingsort (modifié par moi pour ne pas utiliser de tableaux, mais des nombres premiers pour compter les occurrences)
Aucune limitation de taille
Caractères:
260234la source
P
on peut écrirelambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1]
, en rasant pas mal de caractères. J'ai peut-être un peu foiré, mais l'idée est d'utiliser une version imbriquée du ternaire Python à l'ancienne (avant que Python n'ait un ternaire)(false_result, true_result)[boolean]
.Bash + coreutils, 14 (24 caractères - 10 pour le revers)
Je pense que cela pourrait un peu contourner les règles, mais voilà, c'est vendredi ...
Je suppose que l'utilisation de bibliothèques standard est autorisée. Mon interprétation de la bibliothèque standard pour
bash
estcoreutils
:Entrée de stdin. Utilisé:
la source
bash
l'idée des entiers (déclarer -i). Édité.tr
n'aime pas votre syntaxe, ce qui vous coûterait un caractère sur ces systèmes.) Quoi qu'il en soit, je dirais que ce sont toujours toutes des opérations de chaîne à cœur.declare -i
ne fait pas d'un nom un entier, il oblige simplement le shell à utiliser le contexte arithmétique sur le RHS des expressions d'affectation.C - 64 caractères, 64 points
Vous vous demandez peut-être comment cela fonctionne sans aucun en-tête. Simple, compilez avec:
Non-golfé:
J'ai également décidé d'inclure le tri des caractères, juste parce que je le pouvais.
Essais:
la source
main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}
ce qui est de toute façon plus court.c(*a
, ma version de gcc insistait sur le fait que nous devions faire à lac(char*a
place.fonction c (arc petit-endien),
131108 caractèresAucun défi de tri n'est complet sans une réponse sleepsort . Celui-ci prendra jusqu'à 10 secondes pour revenir, mais cela fonctionne, et je pense qu'il est entièrement conforme aux spécifications. Cette fonction prend un seul paramètre int et renvoie un entier avec les chiffres décimaux triés:
nouvelles lignes et indentation ajoutées pour plus de lisibilité
Appelez comme suit:
la source
?:
place deif-else
.fork()?c++:(sleep(d),exit(d));
(,)
.Java: 262 points
Ouais, ouais je sais, c'est sans espoir, mais quand même ..
Analyse (marquage):
StringBuffer
(je l'ai utilisé parce qu'il est plus court queStringBuilder
) (score = 262 + 10 = 272)Usage:
Lorsque vous essayez de compiler le
G.java
fichier dans l'invite de commande, cela génère beaucoup de problèmes (erreurs). Alors, la solution?Ensuite, cette classe doit être appelée par une
main()
méthode de toute autre classe (ou même de cette classe elle-même). Je lui mets une autre classe, donc je ne l'ajoute pas à mon nombre de personnages. Compilez l'autre classe de manière similaire (sans utilisercmd
). Maintenant, lamain()
méthode dans l' autre classe devrait ressembler à ceci:Excluant les espaces inutiles, les commentaires et les sauts de ligne, c'est encore 93 caractères. Je ne l'ajoute pas à mon personnage parce que c'est juste pour une démonstration via la console.
Production:
ZERO ie
0
est considéré. En supposant que la classe externe estHelper.java
, et qu'elle a été compilée avec succès, quelques exemples via la console sont:Lorsqu'elle est changée en
0
c.- à- d. Décroissante ...REMARQUES:
G.java
. C'est la classe principale .Integer.MAX_VALUE
car c'est la taille maximale que tout tableau peut contenir (en Java).la source
TeX / LaTeX (332)
Si le code réel est placé dans un package
s
, le fichier LaTeX principal semble agréable et facile. Le nombre est simplement donné en mathématiques. Si le nombre est négatif, l'ordre de tri est inversé. Le code du packages
peut également être utilisé avec du TeX simple, exemple ci-dessous.Le package
s
(une ligne, les fins de ligne ne sont pas nécessaires):Résultat:
Résultat: désespéré
En utilisant TeX ordinaire avec
etex
oupdftex
, le fichier peut être réduit à:<contents of s.sty>\rm\shipout\hbox{$<number>$}\bye
Octets: 318 octets (
s.sty
) + 24 octets pour le reste sans le nombreLes tableaux ne sont pas utilisés: 0
Je ne vois pas de chaînes multi-caractères: 0
Le nombre n'est pas limité par l'algorithme. Le plus grand nombre TeX est 2 31 - 1 = 2147483647. L'exemple utilise un nombre à 66 chiffres, beaucoup plus grand: 0
Si un moins est donné, l'ordre de tri revient à l'ordre décroissant: −10
0 + 318 + 24 + 0 + 0 - 10 = 332
Algorithme:
Les chiffres deviennent des caractères actifs en mode mathématique. Chaque chiffre se souvient et recueille chaque utilisation dans une macro. Après le mode mathématique, les macros sont sorties avec les chiffres dans l'ordre croissant.
Le changement de direction se fait par un texte de droite à gauche, une fonctionnalité e-TeX.
Version dégolfée du code en
s.sty
Reproduire
Il existe des compilateurs LaTeX en ligne, une liste peut être trouvée ici . J'ai essayé le premier élément de la liste, le servlet LaTeX sur sciencesoft.at . Il peut être utilisé sans signature et il peut également créer des URL permanentes: source et résultat sous forme d'image .
la source
C - 65
L'observateur avisé notera que cet algorithme de tri s'exécute en temps O (n) sur le nombre de chiffres
n
.L'observateur pragmatique notera que cet algorithme de tri s'exécute dans le temps proportionnellement à la plage d'entiers signés sur la plateforme, qu'il mute l'état global qui doit être réinitialisé entre les exécutions, et que de nombreux autres sacrifices ont été consentis en faveur de la brièveté.
La version non golfée n'est pas exactement équivalente, mais elle transmet mieux l'algorithme réel impliqué.
Voici un faisceau de test pour la fonction:
la source
Haskell - 96
96 caractères, pas de tableaux, pas de chaînes, pas de limite entière, ne peut pas inverser
Exemples:
Celui-ci est un tri par insertion, effectué directement sur les entiers eux-mêmes. Ceci est similaire à l'autre entrée Haskell qui est du type à bulles, bien que je jure que j'y travaillais avant de voir celle-ci.
Petit guide:
d
divise un nombre en unités et en dizaines, c'est-à-dire:d 135
est la paire(13,5)
a%x
est trié insertion de chiffrea
dans le nombrex
a&x
triex
en insérant le chiffre des unités dansa
le résultat et le restes x
trie x en lançant la&
récursivité sur 0 etx
L'astuce est que le deuxième argument de
%
et&
n'est pasx
directement, maisx
divMod'd utilisantd
la source
Python3.3 61 points
Ce programme accepte l'entrée comme une chaîne, qui compte comme une chaîne car elle n'est pas immédiatement transformée en entier. +10
La chaîne est triée dans un tableau +10
Ce tableau est réuni en une chaîne +10
Remarque: Le
''
utilisé pour joindre le contenu du tableau n'est pas une chaîne à plusieurs caractères, donc +10 n'est pas ajouté au score.Le programme se compose de 31 caractères. +31
31 + 10 + 10 + 10 = 61 points
la source
print(int(''.join(sorted(input()))))
, mais la conversion en entier n'ajoutait que des points et ne faisait pas en sorte que le code suive les règles de plus près. Je ne suis pas vraiment resté fidèle au défi, je suppose. Mais il déclare que l'entrée peut être une chaîne et la sortie peut être une chaîne (pour les instructions d'impression), et ne dit rien entre les deux:]J, 10 caractères (+ 1 chaîne) score = 20
Usage:
Fonctionne pour tous les nombres 32 bits.
Explication:
/:~
trier&.
sous":
format. Ma version précédente utilisait également un tableau, mais ils sont coûteux, alors maintenant je dois simplement utiliser une chaîne et trier les caractères par ordre alphabétique.":
convertit le nombre entré en chaîne et/:~
trie les chiffres par ordre croissant. Étant donné que le tri est effectué au format «sous», lorsque le tri est terminé, la chaîne est reconvertie en nombre. Ajouter la possibilité de revenir en arrière coûterait probablement plus cher qu'il n'en économise, donc je n'ai pas pris la peine.L'argument pourrait être avancé que, puisque J, comme APL et K, est un langage basé sur un tableau, l'entrée unique est un tableau de 1 élément, mais j'ai choisi de ne pas adopter une vue aussi dure lors du calcul de mon score.
La limite de 32 bits est imposée par J, plutôt que par mon programme. Tout supérieur et J bascule les nombres en notation scientifique. La question de savoir si la pénalité de 32 points s'applique dans ce cas n'est pas claire, mais même si les deux pénalités précédentes s'appliquent (je ne pense pas qu'elles devraient), le score monte à 72 et bat toujours confortablement la grande majorité des autres réponses.
la source
Python 2.7: 174
Il fonctionne en créant un dictionnaire mappant les 10 chiffres à 0. Ensuite, il itère sur la longueur du nombre (
log10(i)
), extrait chaque chiffre ((i / (10 ** c)) % 10
) et incrémente le compteur de ce chiffre dans le dictionnaire. Enfin, il crée une chaîne faite en itérant sur les 10 chiffres et pour chaque chiffre donnant une instance du chiffre sous forme de chaîne.Je pourrais changer la dernière ligne
print"".join(d[n]*str(n)for n in xrange(10))
qui serait de 16 caractères de moins, mais utiliserais des chaînes à plusieurs caractères.la source
i=int(input())
peut être touti=input()
aussiinput()
automatiquement égal au nombre.C (jusqu'à C90)
ou C ++,7866 pointsLa fonction afin de trier un entier est appelée
s
.Notation:
int
) (+0)Ancienne version (78 points, fonctionne également avec les versions C ++ et C plus modernes)
la source
C # - 179
Non golfé
Tester
Ordinaire:
Renversé:
Points: (J'espère avoir bien compris le système de points - n'hésitez pas à corriger)
C # avec LINQPAD - 123
Tester
Ordinaire:
Renversé:
Points:
la source
Java 1469
Une solution sans chaîne ni tableau en Java. 1437 caractères + 32 car il ne prend que Long.MAX_VALUE en entrée. En utilisant Double, je pourrais passer à plus de 300 chiffres à la place, mais ce serait trop fastidieux à mettre en œuvre. Tout ce qui est plus grand que cela nécessiterait BigInteger et AFAIK qui utilise des tableaux en interne. Si vous utilisez moins de 19 chiffres pour l'entrée, la sortie aura des zéros non significatifs. Une entrée négative donnera tous les zéros et tout ce qui n'est pas un nombre provoquera une exception.
Pour le type que j'ai utilisé le plus facilement possible, c'est donc assez inefficace. (devrait être O (n * n))
Je sais que cela ne se compare pas vraiment aux solutions dans d'autres langages mais je pense que c'est au moins le plus court que je puisse obtenir en Java. (si quelqu'un sait comment obtenir ce raccourci, n'hésitez pas à le modifier / commenter)
la source
AWK - 101
Le fichier 'x':
La course:
Le seul tableau utilisé est ARGV et ce n'est pas utile pour le tri, c'est seulement l'accès aux paramètres de ligne de commande et ces valeurs sont dans des variables non-tableau où elles sont réellement nécessaires pour les calculs. Je pense que cela ne comptera pas contre cette solution. Le calcul suivant ne prend pas en compte le tableau ARGV:
111 (caractères) - 10 (peut inverser)
la source
Je ne vois rien sur les fonctions de tri dans la question, alors ... (je vais supprimer la réponse si elle plie ou enfreint les règles, faites-le moi savoir)
JavaScript
5696JavaScript
69109 (réversible)Peut être joué un peu au golf en utilisant les fonctions de flèche EcmaScript 6 :
ES6
5090ES6
63103 (réversible) (73-10)la source
prompt
renvoie une chaîne (que vous ne convertissez pas immédiatement en entier): +10;split
renvoie un tableau: +20;sort
fait un tri sur place (c'est donc toujours le même tableau);join
renvoie une nouvelle chaîne, +10. Total: 96.SED 67 caractères (score de 67 ou 107)
Cela utilise un tri à bulles pour plus de concision. Le score serait de 107 si chaque modèle d'expression régulière et chaque remplacement comptent comme une chaîne (c'est-à-dire 67 + (10 * 4))
Nombre de chiffres manipulés limité par la mémoire (et probablement la patience)
la source
Fonction lambda Python (réversible), 69
n
(entrée) et''.join(...)
(+20)sorted(...)
(+20)d
(-10)Fonction lambda Python (non réversible), 67
EDIT: L'entrée doit être une chaîne. J'envisage la peine d'utiliser cette chaîne directement.
la source
raw_input([prompt]) -> string
, ainsisorted(raw_input())
est +10. Aussisorted -> new sorted list
, donc +20. Ensuite,S.join -> string
donc +10 à nouveau. La notation de tranche implique également des chaînes, donc +10 (tout autre élément prenant en charge la notation de tranche serait sans doute +20). Je calcule donc 73 et 108, respectivement.print
s au lieu dereturn
ing?lambda
ici.)print
est plus court et ne nécessite pas de wrappers. Je ne savais pas que vous autoriseriez les fonctions lambda. Un peu faciale quand j'ai lu ça. Est-ce correct maintenant?''.join(sorted(str(n)))
.Pouvez-vous s'il vous plaît me dire pourquoi cela ne sera pas considéré comme une réponse? Je suis un peu nouveauLisp commun - 126
La version non golfifiée (stylistiquement mais aussi lexicalement mais fonctionnellement identique):
Les chiffres d'un nombre négatif sont traités comme ayant une valeur négative, et les chiffres sont triés les moins significatifs en premier (c'est-à-dire petit-boutien). Exemples:
Il y a 136 caractères dans la version golfée, y compris les espaces. Il n'utilise aucune chaîne et aucun tableau et gère les entiers de précision arbitraire, y compris les entiers négatifs. Le tri est paramétré sur un prédicat binaire qui définit un ordre total sur les entiers dans
[-9, 9]
, incluant mais sans s'y limiter<
et>
:Cela donne un score de 126.
la source
JavaScript 416/185
Pas de tableaux, pas de chaînes, pas de contrainte de longueur arbitraire ...
Mais trier vers le haut / vers le bas aurait utilisé plus de 10 caractères ^^ Mais j'ai trouvé l'idée de compter les chiffres et de les imprimer intéressante - peut-être que quelqu'un peut utiliser cette idée dans GolfScript et gagner le prix ;-)
Le même code plus court, en utilisant eval: (mais cela serait probablement envisagé en utilisant des chaînes ...)
la source
C (222)
Points:
-10 (tri inverse si le nombre (argv [1]) est négatif)
= 222 points
Indicateurs nécessaires pour se débarrasser des 1000 avertissements du compilateur:
gcc -Wno-implicit-function-declaration -Wno-return-type -Wno-implicit-int -Wno-char-subscripts -o count2 counta2.c
"Mieux" lisible:
Assez peu golfé:
la source
"%""i"
au lieu de"%i"
? Ils compilent la même chose, donc vous ne faites que perdre deux caractères.Y a-t-il une raison pour laquelle je ne vois pas déjà cette solution?
Rubis
Je ne sais pas comment marquer cela. Le fractionnement générerait un tableau, mais au-delà, je ne sais pas .. 38 caractères + 2x20 pour les tableaux? Ou doit-il inclure tous les tableaux que le tri pourrait créer en interne?
la source
VBScript - 76 (96?)
66 caractères + 10 pour l'utilisation de la chaîne
n
(Je ne sais pas si l'utilisation de la
replace
fonction etstring
fonction qui renvoie n quantité de caractères x est comptée comme une chaîne supplémentaire).Il compte la quantité d'un certain chiffre en comparant la longueur de la chaîne d'origine avec la même chaîne avec le certain chiffre remplacé. Ensuite, il attache ce nombre de chiffres à n.
la source
Tri-sommeil Python 3 (168)
Sans liste ni boucle, seulement des générateurs.
pourrait probablement être amélioré.
la source
Raquette 97
97 points (87 +20 pour deux chaînes, -10 pour le tri, pas de tableaux)
Cela utilise des listes de caractères, vous devez donc lui donner une fonction de comparaison de caractères comme
char<?
ouchar>?
. Je pense que cela passe aussi comme non golfé car il n'y a pas grand-chose à faire que d'ajouter des espaces et d'augmenter les noms de variables. Mon ancienne version est peut-être plus honorable :)Ancienne version sans cordes:
110 points (120 octets (utf-8) - 10 pour permettre de changer l'ordre de tri. Il n'utilise ni chaînes ni tableaux)
Non golfé:
Je l'ai testé avec le 100 000e numéro de fibonacci:
Et la même chose dans l'ordre inverse:
la source