5318008 - Divertimento con calcolatrici


32

Nelle scuole di tutto il mondo, i bambini digitano un numero nel loro calcolatore LCD, lo capovolgono e scoppiano in una risata dopo aver creato la parola "Boobies". Certo, questa è la parola più popolare, ma ci sono molte altre parole che possono essere prodotte.

Tutte le parole devono avere una lunghezza inferiore a 10 lettere (tuttavia il dizionario contiene parole più lunghe di questa, quindi è necessario eseguire un filtro nel programma). In questo dizionario, ci sono alcune parole maiuscole, quindi converti tutte le parole in minuscolo.

Usando, un dizionario di lingua inglese, crea un elenco di numeri che possono essere digitati in un calcolatore LCD e crea una parola. Come per tutte le domande sul golf del codice, vince il programma più breve per completare questa attività.

Per i miei test, ho usato l'elenco di parole UNIX, raccolto digitando:

ln -s /usr/dict/words w.txt

O in alternativa, ottenerlo qui .

Ad esempio, l'immagine sopra è stata creata digitando il numero 35007nella calcolatrice e capovolgendolo.

Le lettere e i loro rispettivi numeri:

  • b :8
  • g :6
  • l :7
  • io :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

Si noti che se il numero inizia con uno zero, dopo tale zero è richiesto un punto decimale. Il numero non deve iniziare con un punto decimale.

Penso che questo sia il codice di MartinBüttner, volevo solo riconoscerti per questo :)

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


4
È possibile utilizzare un punto decimale dopo il primo numero anche se non è richiesto?
Dennis,

1
Dobbiamo scrivere 0.7734per ciao o sarebbe .7734accettabile?
Dennis,

3
Qual è il comportamento corretto se il dizionario contiene parole in maiuscolo, punteggiatura, ecc.?
Peter Taylor,

1
@Dennis 0.7734è richiesto
Beta Decay

4
Che dire delle parole che richiedono uno zero finale dopo il decimale? Ad esempio, oligorichiede uno zero finale dopo il decimale:0.6170
Mr. Llama

Risposte:


7

CJam, 44 42 byte

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

Provalo online nell'interprete CJam .

Per eseguire il programma dalla riga di comando, scaricare l' interprete Java ed eseguire:

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

Come funziona

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.

9

Bash + coreutils, 54

Ancora una volta, grazie a @TobySpeight per l'aiuto del golf.

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

L'elenco di parole di input è tratto da STDIN:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 

"Belie" e "Belies" sono parole? Più sai ...
clismique il

6

Python 2, 271 216 211 205 byte

Questa è l'unica idea che ho avuto finora .. Lo aggiornerò una volta che penso a qualcos'altro! Ho pensato che avessimo bisogno di leggere da un file, ma in caso contrario fammelo sapere in modo da poter aggiornare :)

Grazie mille a Dennis per avermi salvato 55 byte :)

Anche grazie a Sp3000 per aver salvato 6 byte :)

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g

Non conosco molto Python, ma qualcosa di simile non "oizehsglb".index(b)sarebbe più corto?
Dennis,

3
d[b] == "oizehsglb".index(b). Forse manca un cast per stringa / carattere.
Dennis,

1
Oh, wow, non mi è mai venuto in mente che i numeri che siamo riusciti a sostituire avessero valori numerici in ordine .. Sì, sicuramente funzionerà! Grazie!
Kade,

1
Non sono stati testati ma: 1) .findè più corto di .index, 2) A seconda della versione in uso, almeno in 2.7.10 opensenza un parametro di modalità predefinito r, 3) Non for x in open(...)funziona? (potrebbe essere necessario rimuovere una nuova riga finale) In caso contrario, .split('\n')è più breve di.splitlines()
Sp3000

1
Inoltre g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), e puoi risparmiare qualche altro invertendo e fpoi facendo for c in finvece di avere c=x[::-1]. Inoltre lo usi solo funa volta, quindi non è necessario salvarlo come variabile
Sp3000

6

JavaScript (ES7), 73 byte

Questo può essere fatto in ES7 a soli 73 byte:

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

Ungolfed:

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

Uso:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

Funzione:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

Ho eseguito questo sulla lista di parole UNIX e ho messo i risultati in un cestino:

risultati

Il codice utilizzato per ottenere i risultati su Firefox :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');

Cosa succede con t('Impossible')?
Arturo Torres Sánchez,

@ ArturoTorresSánchez Hai ragione, l'ho risolto
Downgoat,

è join`` ES2015 o è pre-ES2015?
WallyWest,

@WallyWest Questa è una funzione ES6. È supportato nella maggior parte dei browser principali
Downgoat,

Cosa è specifico di ES7 in questo?
Arjun,

5

Python 2, 121 byte

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

Presuppone che il file del dizionario w.txtfinisca con una nuova riga finale e non abbia righe vuote.


3

GNU sed, 82

(di cui 1 per -r)

Grazie a @TobySpeight per l'aiuto del golf.

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

L'elenco di parole di input è tratto da STDIN:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 

2

TI-BASIC, 75 88 byte

modifica 2: non importa, questo è ancora tecnicamente non valido, in quanto accetta solo una parola alla volta (non un dizionario). Proverò a risolverlo per consentire più di una parola come input ...

modifica: oops; Inizialmente l'ho fatto mostrare uno .0 alla fine se l' ultimo numero era 0, non viceversa. Risolto, anche se questo è un po 'una soluzione alternativa (visualizza "0" accanto al numero se inizia con 0, altrimenti visualizza due spazi nello stesso posto). Sul lato positivo, gestisce correttamente parole come "Otto" (visualizza entrambi gli 0) in quanto non mostra effettivamente un numero decimale!


Non riesco a pensare a una lingua migliore per farlo. Posso sicuramente giocare a golf di più, ma al momento sono troppo stanco. La tilde è il simbolo di negazione [il( - ) pulsante].

L'input viene preso dalla variabile di risposta della calcolatrice, il che significa tutto ciò che è stato valutato l'ultima volta (come _nella shell interattiva in pitone), quindi è necessario digitare una stringa nella schermata iniziale (il segno di virgolette è attivo ALPHA+), premere ENTER, quindi eseguire il programma. In alternativa, è possibile utilizzare i due punti per separare i comandi, quindi se si nomina il programma, si dice "CALCTEXT" e si desidera eseguirlo sulla stringa "CIAO", è possibile digitare "HELLO":prgmCALCTEXTinvece di eseguirli separatamente.

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans

2

Python 2, 147 158 156 byte

Mi mancava questo '0.' Requisiti. Spero ora che funzioni bene.

edit : Rimosso ".readlines ()" e funziona ancora; p

edit2 : rimossi alcuni spazi e sposta la stampa sulla terza riga

edit3 : salvato 2 byte grazie a Sp3000 (rimosso lo spazio dopo la stampa e cambiato 'indice' in 'trova')

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)

1

Python 2, 184 174 byte

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0

1

Ruby 2, 88 86 byte

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

Il conteggio dei byte include 2 per le lnopzioni sulla riga di comando:

$ ruby -ln 5318008.rb wordlist.txt

In questo caso ==""può essere sostituito con <?A. E non c'è bisogno di gsub()come sub()è abbastanza.
arte

1

C, 182 172 169/181 172 byte

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

allargato

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

usando il words.txt collegato, con la conversione minuscola:

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550

1
Non *s|32funzionerà come conversione minuscola in questo contesto?
Hagen von Eitzen,

Grande idea! Grazie!
alcuni utenti il

1

Haskell, 175 byte senza importazioni (229 byte con importazioni)

Codice pertinente (ad esempio in File Calc.hs):

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs

0

Java, 208 200 176 byte

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

allargato

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

Aggiunge sempre il decimale e quando non valido restituisce ".". Ma altrimenti funziona come dovrebbe. : P

Grazie @ LegionMammal978!


È possibile salvare 7 byte cambiando ;String l=in ,l=e =o+in +=.
LegionMammal978,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.