Défi
Étant donné qu'une représentation ASCII d'un nombre babylonien en entrée, affiche le nombre en chiffres arabes occidentaux.
Système de numération babylonien
Comment les Babyloniens ont-ils compté? Fait intéressant, ils utilisaient un système Base 60 avec un élément d’un système Base 10. Considérons d’abord la colonne des unités du système:
Les Babyloniens n'avaient que trois symboles: T
(ou, si vous pouvez le rendre:) 𒐕
qui représente 1, et <
(ou, si vous pouvez le rendre:) 𒌋
qui représente 10, et \
(ou, si vous le rendez:) 𒑊
qui représente zéro.
Remarque: Techniquement, \
(ou 𒑊
) n'est pas nul (parce que les Babyloniens n'avaient pas la notion de «zéro»). "Zero" a été inventé plus tard, ainsi \
qu'un symbole d'espace réservé a été ajouté plus tard pour éviter toute ambiguïté. Cependant, pour les besoins de ce défi, il suffit de considérer \
que zéro
Donc, dans chaque colonne, vous ajoutez simplement la valeur des symboles, par exemple:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
Il n'y aura jamais plus de cinq <
ou plus de neuf T
dans chaque colonne. \
apparaîtra toujours seul dans la colonne.
Maintenant, nous devons étendre cela à l’ajout de colonnes. Cela fonctionne exactement comme n'importe quelle autre base soixante, où vous multipliez la valeur de la colonne la plus à droite par , celle à gauche par , celle à gauche par , etc. Vous ajoutez ensuite la valeur de chacun pour obtenir la valeur du nombre.60 2
Les colonnes seront séparées par des espaces pour éviter toute ambiguïté.
Quelques exemples:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
Règles
- Vous êtes libre d'accepter les entrées ASCII (
T<\
) ou Unicode (𒐕𒌋𒑊
). - Le nombre entré sera toujours inférieur à
- Le
<
s sera toujours à gauche duT
s dans chaque colonne \
apparaîtra toujours seul dans une colonne
Gagnant
Le code le plus court en octets gagne.
la source
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Qui est encore en usage aujourd'hui; le système de numération babylonien est exactement ce que nous utilisons pour les horloges. Deux chiffres décimaux chacun pour les secondes, les minutes et les heures, de 60 secondes à la minute et de 60 minutes à l’heure.Réponses:
JavaScript (ES6), 44 octets
Prend les entrées sous forme de tableau de caractères ASCII.
Essayez-le en ligne!
Comment?
Le système de chiffres babylonien peut être vu comme une langue à 4 instructions fonctionnant avec un seul registre - appelons-le l'accumulateur.
À partir de , chaque caractère c du tableau d'entrée a modifie l'accumulateur k comme suit:k = 0 c une k
space
: multipliez par 60 (implémenté sous la forme: ajoutez 59 k à k )<
: ajouter à kT
: incrément\
: ne fais rien; c'est l'NOP
instruction de ce langage (implémenté sous la forme: ajoutez à k )la source
C (gcc) ,
140138136 octetsEssayez-le en ligne!
la source
Perl 6 , 39 octets
-3 octets grâce à nwellnhof
Essayez-le en ligne!
Utilise les caractères cunéiformes.
Explication:
la source
{:60[.words>>.&{sum (.ords X%151)X%27}]}
(40 bytes)Gelée ,
13 à12 octetsUn lien monadique acceptant une liste de caractères qui donne un entier.
Essayez-le en ligne!
Comment?
Un autre 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
est1013
, cette modulo1013
par lesO
valeurs rdinal obtenir53
,5
et1
pour<
,T
,\
puis exécute respectivement division entière,:
en5
obtenir10
,1
et0
)la source
05AB1E , 13 octets
Essayez-le en ligne!
Pour compenser ma paresse avec ma réponse à Jelly, voici une soumission dans 05AB1E xD.
la source
8740
?•Yη•
(4 octets)1|Ç7%-13%O60β
est également 13 - est-ce golfable?Python 2 ,
96938785 octetsEssayez-le en ligne!
Enregistré:
la source
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 octets
Limité à Office 32 bits, qui
^
sert deLongLong
type littéral dans les versions 64 bitsPrend les entrées de la cellule
A1
et les sorties dans la fenêtre vbe immediate.Ungolfed and Commented
la source
Dyalog APL ,
33 à30 octetsEssayez-le en ligne!
Edit: -3 octets grâce à ngn
'\ T<'⍳
remplace les caractères par des nombres (leur position dans la constante de chaîne) et⌽
inverse l'entrée de sorte que les "chiffres" les plus significatifs soient les derniers. Cela permet+\2=
de conserver un nombre actif de la puissance souhaitée de 60 (appliquée par60*
) en comptant le nombre de fois où un espace (index 2 dans la constante de chaîne) est rencontré.⌊10*⍵-3
donne la puissance désirée de dix pour chaque personnage. L'ordre des caractères dans la constante de chaîne et le décalage -3 font que '\' et l'espace passent à des nombres négatifs, ce qui crée des fractions lorsque ces caractères sont augmentés à la puissance de 10, ce qui permet de les éliminer⌊
.Tout ce que nous avons à faire maintenant, c’est de multiplier les puissances de 10 chiffres par les valeurs de position de puissances de 60 et d’additionner le tout
+/
.la source
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 octets
Essayez-le en ligne!
Ceci utilise la technique de la réponse d' Arnauld .
la source
Toile ,
201716 octetsEssayez-le ici!
Explication:
la source
APL (NARS io ← 0), 28 caractères, 56 octets
certains tests avec vérification de type:
Chaque type de résultat est un nombre.
la source
JavaScript (Node.js) ,
12211410710683 octetsEssayez-le en ligne!
Je suis un peu obsédé par les opérations sur les tableaux de "style fonctionnel", utilise une entrée ASCII, autant que je sache, JS n'est pas très doué pour obtenir des codes de caractères fantaisistes
Je garde cela pour la postérité, mais c'est une solution naïve / idiote, je vous suggère de consulter la réponse d'Arnauld, qui est bien plus intéressante qu'une mise en œuvre du défi.
la source
c<'T'
fonctionne à la place dec=='<'
&&
par|
.for...of
boucles: PRetina ,
292623 octetsEssayez-le en ligne! Utilise la séparation entre les lignes, mais link inclut un en-tête pour utiliser des espaces à des fins pratiques. Edit: 3 octets enregistrés avec l’aide de @KevinCruijssen. Sauvegardé de 3 octets supplémentaires grâce à @FryAmTheEggman. Explication:
Remplacer chacun
<
par 10T
s.Prenez la première ligne, multipliez-la par 60 et ajoutez la ligne suivante. Répétez ensuite jusqu'à ce qu'il ne reste qu'une ligne.
Compte le
T
s.Version 51 octets plus rapide:
Essayez-le en ligne!Utilise la séparation entre les lignes, mais link inclut un en-tête pour utiliser des espaces à des fins pratiques. Explication:
Faites correspondre chaque ligne individuellement et comptez le nombre de
T
s et 10 fois le nombre de<
s. Ceci convertit chaque ligne en valeur "chiffre" en base 60.Conversion en base 60, en exécutant une ligne à la fois. Le calcul est fait en décimal pour la vitesse.
la source
<
sans le+
, à moins que je ne voie pas une sorte de cas de bord.$&
c'est toujours maintenant un caractère, je peux utiliser le caractère par défaut, en économisant deux octets supplémentaires!_
certain temps .$*
1
<
comme une seule correspondance et les répétait 10 fois la longueur (la quantité<
dans la correspondance), et ma modification proposée répète chaque<
fois 10 fois séparément10*
) Maintenant, je comprends mieux pourquoi ils+
étaient là au début. Je ne sais pas trop sur les commandes intégrées à Retina, seulement les expressions rationnelles en général, d’où le changement que je propose car je le lis déjà comme répétition toutes les>
10 fois. ;)Bash (avec sed et dc), 50 octets
Prend des entrées délimitées par un espace de
stdin
, sorties àstdout
Essayez-le en ligne!
Explication
Sed utilise pour transformer l’entrée avec un tas de correspondances d’expressions régulières jusqu’à ce que, par exemple, l’entrée
<<<TT \ TTTT
ait été transforméeA+A+A+1+1+60*60*1+1+1+1+
. Ensuite, cette entrée est alimentée en courant continu avec la commande d’exécution d’entrée explicite?
, précédée dez
(insère la longueur de la pile (0) dans la pile de sorte que nous ayons un emplacement à la terre pour l’addition) et suivie dep
(impression).la source
J ,
3430 octetsEssayez-le en ligne!
la source
Dyalog APL,
3532 octetsEssayez-le en ligne!
31 dans dzaima / APL
la source
Noether , 55 octets
Essayez-le en ligne!
Même approche que @Arnauld.
la source
Charbon de bois , 26 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Effacer le résultat.
Boucle sur les caractères saisis. La
≡
commande est encapsulée dans un bloc pour l'empêcher de trouver un bloc "par défaut".Basculez sur le personnage actuel ...
si c'est un espace, multipliez le résultat par 60 ...
si c'est un,
<
ajoutez 10 au résultat ...si c'est un
T
incrémente alors le résultat.Imprimer le résultat.
la source
R ,
9881 octetsEssayez-le en ligne!
Ridiculement long en raison de l'analyse des chaînes.Merci Giusppe d’avoir supprimé 16 octets inutiles.Définit
y
la valeur de bytecode de l’entrée unicode etR = y("T<\") = y("𒐕𒌋𒑊")
Observe ça
R%%3 = 1,2,0
etR%%6 = 1,5,0
... alorsR%%3 * R%%6 = 1,10,0
!Le reste est facile: somme par colonne, puis produit par points avec puissances décroissantes de 60.
la source
scan(,"")
divise pas automatiquement sur les espaces?/60
peux le remplacer par-1
l'expression de l'exposant pour un autre octet, en plus du<-
peut être remplacé par=
puisque tout est entre parenthèses.Ruby ,
5046 octetsEssayez-le en ligne!
Un port de base de la réponse Arnauld amélioré de 4 octets par Go.
la source
C (gcc) ,
656463 octetsEssayez-le en ligne!
la source
return o
pars=o
enregistre 5 octets supplémentaires.Java 8,
6460 octets-4 octets grâce à @ceilingcat .
Essayez-le en ligne. Explication:
la source
Perl -F // -E, 39 octets
Ceci lit le numéro à convertir de STDIN.
C'est essentiel la même solution que celle donnée par @Arnauld en utilisant JavaScript.
la source
F #, 128 octets
Essayez-le en ligne!
Ungolfed cela ressemblerait à ceci:
Seq.mapFoldBack
combineSeq.map
etSeq.foldBack
.Seq.mapFoldBack
itère dans la séquence vers l’arrière et enfile une valeur d’accumulateur dans la séquence (dans ce cas,i
).Pour chaque élément de la séquence, le nombre babylonien est calculé (par
Seq.sumBy
ce qui mappe chaque caractère sur un nombre et totalise le résultat), puis multiplié pari
.i
est ensuite multiplié par 60 et cette valeur est ensuite transmise au prochain élément de la séquence. L'état initial de l'accumulateur est 1.Par exemple, l'ordre des appels et des résultats en
Seq.mapFoldBack
entrée<<<TT \ TTTT
serait:La fonction retournera un tuple de
seq<int>, int
. Lafst
fonction retourne le premier élément de ce tuple etSeq.sum
effectue la somme réelle.Pourquoi ne pas utiliser
Seq.mapi
ou similaire?Seq.mapi
mappe chaque élément de la séquence et fournit l'index à la fonction de mappage. À partir de là vous pourriez faire60 ** index
(où**
trouve l'opérateur électrique en F #).Mais
**
requiertfloats
, pasints
, ce qui signifie que vous devez initialiser ou convertir toutes les valeurs de la fonction en tant quefloat
. La fonction entière retournera unfloat
, ce qui (à mon avis) est un peu désordonné.En utilisant
Seq.mapi
cela peut être fait comme ça pour 139 octets :la source
Tcl , 134 octets
Essayez-le en ligne!
Dans la liste inversée, je boucle en incrémentant le résultat en comptant
<
etT
(avec-all
option regexp) et incrémentant une puissance naturelle de 60.Version correcte (voir commentaire)
la source
regsub {\\} $l0 l
avant la boucle foreach ....APL (Dyalog Extended) , SBCS 18 octets
Fonction de préfixe tacite anonyme.
Essayez-le en ligne!
la source
05AB1E (hérité) , 10 octets
Essayez-le en ligne!
05AB1E , 11 octets
Essayez-le en ligne!
Même algorithme, mais dans la version moderne 05AB1E
O
ne fonctionne pas avec les listes d’adresses et de listes mixtes, nous avons donc besoin de€O
cela.la source